From 60438f1a2a226f24d1657f59bf06b744644a4ba2 Mon Sep 17 00:00:00 2001 From: TomNUSDS Date: Wed, 25 Aug 2021 17:17:26 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20usds/jus?= =?UTF-8?q?tice40-tool@55b37fe44881fd408376c839bd562802defdfb9a=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/40194750-c4fc0b9862c31a9e6cdd.js | 1 - main/40194750-d595f8dc70f5f93f5ee1.js | 1 + main/404.html | 2 +- main/404/index.html | 2 +- main/cejst/index.html | 2 +- main/chunk-map.json | 2 +- ...abb7c385ffda83d.js => commons-d531077097b62d3a8b54.js} | 2 +- .../component---src-pages-404-tsx-24406dc9f292d4577bcf.js | 1 - .../component---src-pages-404-tsx-df85057ad1cff117a810.js | 1 + ...omponent---src-pages-cejst-tsx-36e3b57a031deac49ebc.js | 1 + ...omponent---src-pages-cejst-tsx-5dc23ba646a4748f7e4c.js | 1 - ...ponent---src-pages-contact-tsx-08cf4a56d94a01466036.js | 1 + ...ponent---src-pages-contact-tsx-266f3c657ad2540a2a94.js | 1 - ...omponent---src-pages-index-tsx-1145e55e3ba8d5f93dea.js | 1 - ...omponent---src-pages-index-tsx-1cdcc7425e603bdf3264.js | 1 + ...nt---src-pages-methodology-tsx-81f2bf4fb8f983241e36.js | 1 - ...nt---src-pages-methodology-tsx-928e808aca461578a225.js | 1 + main/contact/index.html | 2 +- main/en/404.html | 2 +- main/en/404/index.html | 2 +- main/en/cejst/index.html | 8 ++++---- main/en/contact/index.html | 2 +- main/en/index.html | 4 ++-- main/en/methodology/index.html | 4 ++-- main/en/timeline/index.html | 2 +- main/es/404.html | 2 +- main/es/404/index.html | 2 +- main/es/cejst/index.html | 8 ++++---- main/es/contact/index.html | 2 +- main/es/index.html | 2 +- main/es/methodology/index.html | 4 ++-- main/es/timeline/index.html | 2 +- main/index.html | 2 +- main/methodology/index.html | 2 +- main/page-data/app-data.json | 2 +- ...3c6bc3704419b0.css => styles.fe2701014c0bbef914ce.css} | 2 +- main/timeline/index.html | 2 +- main/webpack-runtime-4e13225cf69a5260b6ba.js | 1 - main/webpack-runtime-c82a340ee727a2c849aa.js | 1 + main/webpack.stats.json | 2 +- 40 files changed, 42 insertions(+), 42 deletions(-) delete mode 100644 main/40194750-c4fc0b9862c31a9e6cdd.js create mode 100644 main/40194750-d595f8dc70f5f93f5ee1.js rename main/{commons-998feabb7c385ffda83d.js => commons-d531077097b62d3a8b54.js} (69%) delete mode 100644 main/component---src-pages-404-tsx-24406dc9f292d4577bcf.js create mode 100644 main/component---src-pages-404-tsx-df85057ad1cff117a810.js create mode 100644 main/component---src-pages-cejst-tsx-36e3b57a031deac49ebc.js delete mode 100644 main/component---src-pages-cejst-tsx-5dc23ba646a4748f7e4c.js create mode 100644 main/component---src-pages-contact-tsx-08cf4a56d94a01466036.js delete mode 100644 main/component---src-pages-contact-tsx-266f3c657ad2540a2a94.js delete mode 100644 main/component---src-pages-index-tsx-1145e55e3ba8d5f93dea.js create mode 100644 main/component---src-pages-index-tsx-1cdcc7425e603bdf3264.js delete mode 100644 main/component---src-pages-methodology-tsx-81f2bf4fb8f983241e36.js create mode 100644 main/component---src-pages-methodology-tsx-928e808aca461578a225.js rename main/{styles.f93d193c6bc3704419b0.css => styles.fe2701014c0bbef914ce.css} (92%) delete mode 100644 main/webpack-runtime-4e13225cf69a5260b6ba.js create mode 100644 main/webpack-runtime-c82a340ee727a2c849aa.js diff --git a/main/40194750-c4fc0b9862c31a9e6cdd.js b/main/40194750-c4fc0b9862c31a9e6cdd.js deleted file mode 100644 index 9ee6f92f..00000000 --- a/main/40194750-c4fc0b9862c31a9e6cdd.js +++ /dev/null @@ -1 +0,0 @@ -(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/main/40194750-d595f8dc70f5f93f5ee1.js b/main/40194750-d595f8dc70f5f93f5ee1.js new file mode 100644 index 00000000..25b1578d --- /dev/null +++ b/main/40194750-d595f8dc70f5f93f5ee1.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 = (0, n.forwardRef)(function (e, t) {\n var r,\n a,\n l = e.id,\n d = e.name,\n p = e.className,\n m = e.options,\n y = e.defaultValue,\n b = e.disabled,\n v = e.onChange,\n O = e.assistiveHint,\n g = e.noResults,\n _ = e.selectProps,\n h = e.inputProps,\n j = e.ulProps,\n M = e.customFilter,\n N = e.disableFiltering,\n E = void 0 !== N && N,\n P = !!b;\n y && (a = m.find(function (e) {\n return e.value === y;\n }));\n var w = M || {\n filter: ".*{{query}}.*"\n },\n I = {\n isOpen: !1,\n selectedOption: a || void 0,\n focusedOption: void 0,\n focusMode: c.None,\n filteredOptions: m,\n inputValue: a ? a.label : ""\n },\n D = (0, i.useComboBox)(I, m, E, w),\n S = D[0],\n x = D[1],\n k = (0, n.useRef)(null),\n A = (0, n.useRef)(null);\n (0, n.useEffect)(function () {\n var e;\n v && v((null === (e = S.selectedOption) || void 0 === e ? void 0 : e.value) || void 0);\n }, [S.selectedOption]), (0, n.useEffect)(function () {\n S.focusMode === c.Item && S.focusedOption && A.current && A.current.focus();\n }, [S.focusMode, S.focusedOption]), (0, n.useEffect)(function () {\n S.isOpen && S.focusedOption && A.current && S.focusMode === c.Input && A.current.scrollIntoView(!1);\n }, [S.isOpen, S.focusedOption]), (0, n.useEffect)(function () {\n var e;\n S.focusMode !== c.None && ((null === (e = k.current) || void 0 === e ? void 0 : e.contains(window.document.activeElement)) || x({\n type: i.ActionTypes.BLUR\n }));\n }, [S.focusMode]), (0, n.useImperativeHandle)(t, function () {\n return {\n clearSelection: function clearSelection() {\n return x({\n type: i.ActionTypes.CLEAR_SELECTION\n });\n }\n };\n }, []);\n\n var T = function T(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 L = function L(e) {\n var t,\n r = e.relatedTarget;\n (!r || r instanceof Node && !(null === (t = k.current) || void 0 === t ? void 0 : t.contains(r))) && x({\n type: i.ActionTypes.BLUR\n });\n },\n C = function C(e) {\n "Escape" === e.key ? x({\n type: i.ActionTypes.CLOSE_LIST\n }) : "Tab" === e.key || "Enter" === e.key ? (e.preventDefault(), S.focusedOption && x({\n type: i.ActionTypes.SELECT_OPTION,\n option: S.focusedOption\n })) : "ArrowDown" === e.key || "Down" === e.key ? (e.preventDefault(), T(x, S, u.Next)) : "ArrowUp" !== e.key && "Up" !== e.key || (e.preventDefault(), T(x, S, u.Previous));\n },\n F = S.selectedOption && S.selectedOption.label === S.inputValue,\n R = (0, o.default)("usa-combo-box", p, {\n "usa-combo-box--pristine": F\n }),\n U = "combobox-" + d + "-list",\n B = "combobox-" + d + "-assistive-hint";\n\n return n.default.createElement("div", {\n "data-testid": "combo-box",\n className: R,\n id: l,\n ref: k\n }, n.default.createElement("select", _s({\n className: "usa-select usa-sr-only usa-combo-box__select",\n name: d,\n "aria-hidden": !0,\n tabIndex: -1,\n defaultValue: null === (r = S.selectedOption) || void 0 === r ? void 0 : r.value,\n "data-testid": "combo-box-select",\n disabled: P\n }, _), m.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 x({\n type: i.ActionTypes.UPDATE_FILTER,\n value: e.target.value\n });\n },\n onClick: function onClick() {\n return x({\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 = k.current) || void 0 === t ? void 0 : t.contains(r))) && S.focusMode !== c.None && x({\n type: i.ActionTypes.BLUR\n });\n },\n onKeyDown: function onKeyDown(e) {\n if ("Escape" === e.key) x({\n type: i.ActionTypes.CLOSE_LIST\n });else if ("ArrowDown" === e.key || "Down" == e.key) e.preventDefault(), x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: S.selectedOption || S.focusedOption || S.filteredOptions[0]\n });else if ("Tab" === e.key) {\n if (S.isOpen && !S.selectedOption) {\n var t = E ? S.focusedOption : S.selectedOption || S.focusedOption;\n t ? (e.preventDefault(), x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: t\n })) : x({\n type: i.ActionTypes.BLUR\n });\n }\n\n !S.isOpen && S.selectedOption && x({\n type: i.ActionTypes.BLUR\n });\n } else if ("Enter" === e.key && S.isOpen) {\n e.preventDefault();\n var r = S.filteredOptions.find(function (e) {\n return e.label.toLowerCase() === S.inputValue.toLowerCase();\n });\n r ? x({\n type: i.ActionTypes.SELECT_OPTION,\n option: r\n }) : S.selectedOption ? x({\n type: i.ActionTypes.CLOSE_LIST\n }) : x({\n type: i.ActionTypes.CLEAR\n });\n }\n },\n value: S.inputValue,\n focused: S.focusMode === c.Input,\n role: "combobox",\n "aria-owns": U,\n "aria-describedby": B,\n "aria-expanded": S.isOpen,\n disabled: P\n }, h)), 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 x({\n type: i.ActionTypes.CLEAR\n });\n },\n "data-testid": "combo-box-clear-button",\n onKeyDown: function onKeyDown(e) {\n "Tab" === e.key && S.isOpen && S.selectedOption && (e.preventDefault(), x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: S.selectedOption\n }));\n },\n hidden: !F\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 x({\n type: S.isOpen ? i.ActionTypes.CLOSE_LIST : i.ActionTypes.OPEN_LIST\n });\n },\n disabled: P\n }, " ")), n.default.createElement("ul", _s({\n "data-testid": "combo-box-option-list",\n tabIndex: -1,\n id: U,\n className: "usa-combo-box__list",\n role: "listbox",\n hidden: !S.isOpen\n }, j), S.filteredOptions.map(function (e, t) {\n var r = e === S.focusedOption,\n a = e === S.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 ? A : 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: U + "--option-" + t,\n onKeyDown: C,\n onBlur: L,\n "data-testid": "combo-box-option-" + e.value,\n onMouseEnter: function onMouseEnter() {\n return x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: e\n });\n },\n onClick: function onClick() {\n x({\n type: i.ActionTypes.SELECT_OPTION,\n option: e\n });\n }\n }, e.label);\n }), 0 === S.filteredOptions.length ? n.default.createElement("li", {\n className: "usa-combo-box__list-option--no-results"\n }, g || "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: B,\n className: "usa-sr-only",\n "data-testid": "combo-box-assistive-hint"\n }, O || "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 L = A[1],\n C = (0, n.useState)(void 0),\n F = C[0],\n R = C[1],\n U = (0, n.useState)(0),\n B = U[0],\n W = U[1],\n z = (0, n.useState)([]),\n Y = z[0],\n V = z[1],\n G = (0, n.useState)(d.None),\n H = G[0],\n Q = G[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 && (L(!1), V([]), 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 && (L(!1), V([])), h && h(e));\n },\n onKeyDown: function onKeyDown(e) {\n var t;\n "Escape" === e.key && (T && (L(!1), V([]), 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) V([]);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), W(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 V(a);\n }\n L(!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: B + "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: V,\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 = window && "object" == 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 L.Form;\n }\n }), Object.defineProperty(t, "FormGroup", {\n enumerable: !0,\n get: function get() {\n return C.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 B.Textarea;\n }\n }), Object.defineProperty(t, "TextInput", {\n enumerable: !0,\n get: function get() {\n return W.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 V.ValidationItem;\n }\n }), Object.defineProperty(t, "ExtendedNav", {\n enumerable: !0,\n get: function get() {\n return G.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 }), 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 L = r(17),\n C = r(8),\n F = r(5),\n R = r(64),\n U = r(65),\n B = r(16),\n W = r(7),\n z = r(66),\n Y = r(69),\n V = r(70),\n G = 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 }, 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(e, t) {\n for (var r = 0, a = t.length, n = e.length; r < a; r++, n++) {\n e[n] = t[r];\n }\n\n return e;\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 = e.multiselectable,\n s = void 0 !== i && i,\n d = (0, n.useState)(r.filter(function (e) {\n return !!e.expanded;\n }).map(function (e) {\n return e.id;\n })),\n f = d[0],\n p = d[1],\n m = (0, o.default)("usa-accordion", {\n "usa-accordion--bordered": t\n }, a);\n return n.default.createElement("div", {\n className: m,\n "data-testid": "accordion",\n "aria-multiselectable": s || void 0\n }, r.map(function (e, t) {\n return n.default.createElement(c, _l7({\n key: "accordionItem_" + t\n }, e, {\n expanded: f.indexOf(e.id) > -1,\n handleToggle: function handleToggle() {\n var t, r, a, n;\n t = e.id, r = u([], f), a = f.indexOf(t), n = s, a > -1 ? r.splice(a, 1) : (n || r.splice(0, r.length), r.push(t)), p(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 L = function L(e, t) {\n var r = S ? "" : "The content is too long.";\n e.target.setCustomValidity(r), t && t(e);\n },\n C = function C(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 B = F.inputRef,\n W = 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 L(e, R);\n },\n onChange: function onChange(e) {\n return C(e, U);\n },\n inputRef: B\n }, W));\n } else {\n var z = h,\n Y = z.onBlur,\n V = z.onChange,\n G = (B = z.inputRef, z.type),\n H = void 0 === G ? "text" : G,\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 L(e, Y);\n },\n onChange: function onChange(e) {\n return C(e, V);\n },\n inputRef: B\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", e[e.CLEAR_SELECTION = 7] = "CLEAR_SELECTION";\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 case a.CLEAR_SELECTION:\n return _l8(_l8({}, e), {\n inputValue: "",\n isOpen: !1,\n focusMode: o.FocusMode.None,\n selectedOption: void 0,\n filteredOptions: t,\n focusedOption: void 0\n });\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 L = (0, a.useState)([null, null]),\n C = L[0],\n F = L[1],\n R = !0,\n U = (0, n.addDays)(S, 0),\n B = S.getMonth(),\n W = S.getFullYear(),\n z = _.months[parseInt("" + B)],\n Y = _.daysOfWeekShort,\n V = _.daysOfWeek,\n G = _.backOneYear,\n H = _.backOneMonth,\n Q = z + ". " + _.clickToSelectMonth,\n K = W + ". " + _.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 = C[0],\n t = C[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 + " " + W];\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() === B || 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": G,\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 }, W)), 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": V[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 L = r.getMonth(),\n C = r.getFullYear(),\n F = r.getDay(),\n R = (0, i.formatDate)(r),\n U = y ? 0 : -1,\n B = (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 W = A.months[parseInt("" + L)],\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: B,\n "data-day": T,\n "data-month": L + 1,\n "data-year": C,\n "data-value": R,\n "aria-label": T + " " + W + " " + C + " " + 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 L = v.id + "-hint",\n C = [y && T, b && L].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: L\n }, b), o.default.createElement(l.DatePicker, _f2({\n className: k,\n rangeDate: P\n }, v, {\n "aria-describedby": C,\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 d = (0, n.forwardRef)(function (e, t) {\n var r = e.name,\n a = e.id,\n u = e.disabled,\n d = e.multiple,\n f = e.className,\n p = e.accept,\n m = e.onChange,\n y = e.onDrop,\n b = s(e, ["name", "id", "disabled", "multiple", "className", "accept", "onChange", "onDrop"]),\n v = (0, n.useRef)(null),\n O = (0, n.useState)(!1),\n g = O[0],\n _ = O[1],\n h = (0, n.useState)(!1),\n j = h[0],\n M = h[1],\n N = (0, n.useState)([]),\n E = N[0],\n P = N[1];\n (0, n.useImperativeHandle)(t, function () {\n return {\n input: v.current,\n clearFiles: function clearFiles() {\n return P([]);\n },\n files: E\n };\n }, [E]);\n var w = (0, o.default)("usa-file-input", {\n "usa-file-input--disabled": u\n }, f),\n I = (0, o.default)("usa-file-input__target", {\n "usa-file-input--drag": g,\n "has-invalid-file": j\n }),\n D = /rv:11.0/i.test(navigator.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent),\n S = d ? "Drag files here or " : "Drag file here or ",\n x = [];\n if (E) for (var k = 0; k < (null == E ? void 0 : E.length); k++) {\n var A = (0, l.makeSafeForID)(E[parseInt("" + k)].name),\n T = "filePreview_" + A;\n x.push(n.default.createElement(i.FilePreview, {\n key: T,\n imageId: A,\n file: E[parseInt("" + k)]\n }));\n }\n var L = (0, o.default)("usa-file-input__instructions", {\n "display-none": x.length > 0\n }),\n C = x.length > 1 ? x.length + " files selected" : "Selected file";\n return n.default.createElement("div", {\n "data-testid": "file-input",\n className: w,\n "aria-disabled": u\n }, n.default.createElement("div", {\n "data-testid": "file-input-droptarget",\n className: I,\n onDragOver: function onDragOver() {\n return _(!0);\n },\n onDragLeave: function onDragLeave() {\n return _(!1);\n },\n onDrop: function onDrop(e) {\n !function (e) {\n if (M(!1), p) {\n for (var t = p.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 || (P([]), M(!0), e.preventDefault(), e.stopPropagation());\n }\n }(e), _(!1), y && y(e);\n }\n }, x.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", x.length > 1 && "s")), n.default.createElement("div", {\n "data-testid": "file-input-instructions",\n className: L,\n "aria-hidden": "true"\n }, !D && n.default.createElement("span", {\n className: "usa-file-input__drag-text"\n }, S), n.default.createElement("span", {\n className: "usa-file-input__choose"\n }, "choose from folder")), x, n.default.createElement("div", {\n "data-testid": "file-input-box",\n className: "usa-file-input__box"\n }), j && 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: v,\n type: "file",\n "data-testid": "file-input-input",\n name: r,\n id: a,\n className: "usa-file-input__input",\n disabled: u,\n onChange: function onChange(e) {\n var t, r, a, n;\n M(!1);\n var o = [];\n if (null === (r = null === (t = e.target) || void 0 === t ? void 0 : t.files) || void 0 === r ? void 0 : r.length) for (var i = (null === (n = null === (a = e.target) || void 0 === a ? void 0 : a.files) || void 0 === n ? void 0 : n.length) || 0, l = 0; l < i; l++) {\n var u = e.target.files.item(l);\n u && o.push(u);\n }\n P(o), m && m(e);\n },\n multiple: d,\n accept: p\n }))));\n });\n\n t.FileInput = d;\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 }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcy9saWIvaW5kZXguanM/YjE4MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLEVBQUUsS0FBdUQsc0JBQXNCLG1CQUFPLENBQUMsSUFBTyxLQUFLLENBQW9LO0FBQ3ZRLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0JBQWdCOztBQUVoQjtBQUNBLCtCQUErQixzQkFBc0I7QUFDckQ7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixjQUFjO0FBQzNDLHdCQUF3Qiw4QkFBOEI7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLGFBQWE7QUFDbEI7QUFDQSxLQUFLLDJCQUEyQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHFCQUFxQixPQUFPO0FBQzVCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUU7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFD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Szs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLGlEQUFpRCxPQUFPO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNB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O0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU8sc0NBQXNDLDZEQUE2RDtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUSx5QkFBeUI7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSw0Q0FBNEM7QUFDNUMsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNU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QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDIiwiZmlsZSI6IjI1OTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24gKGUsIHQpIHtcbiAgXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyAmJiBcIm9iamVjdFwiID09IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IHQocmVxdWlyZShcInJlYWN0XCIpKSA6IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoW1wicmVhY3RcIl0sIHQpIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHMuUmVhY3RVU1dEUyA9IHQocmVxdWlyZShcInJlYWN0XCIpKSA6IGUuUmVhY3RVU1dEUyA9IHQoZS5SZWFjdCk7XG59KHRoaXMsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB0ID0ge307XG5cbiAgICBmdW5jdGlvbiByKGEpIHtcbiAgICAgIGlmICh0W2FdKSByZXR1cm4gdFthXS5leHBvcnRzO1xuICAgICAgdmFyIG4gPSB0W2FdID0ge1xuICAgICAgICBpOiBhLFxuICAgICAgICBsOiAhMSxcbiAgICAgICAgZXhwb3J0czoge31cbiAgICAgIH07XG4gICAgICByZXR1cm4gZVthXS5jYWxsKG4uZXhwb3J0cywgbiwgbi5leHBvcnRzLCByKSwgbi5sID0gITAsIG4uZXhwb3J0cztcbiAgICB9XG5cbiAgICByZXR1cm4gci5tID0gZSwgci5jID0gdCwgci5kID0gZnVuY3Rpb24gKGUsIHQsIGEpIHtcbiAgICAgIHIubyhlLCB0KSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBhXG4gICAgICB9KTtcbiAgICB9LCByLnIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiBcIk1vZHVsZVwiXG4gICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgfSwgci50ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICgxICYgdCAmJiAoZSA9IHIoZSkpLCA4ICYgdCkgcmV0dXJuIGU7XG4gICAgICBpZiAoNCAmIHQgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgZSAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICB2YXIgYSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoci5yKGEpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgXCJkZWZhdWx0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBlXG4gICAgICB9KSwgMiAmIHQgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZSkgZm9yICh2YXIgbiBpbiBlKSB7XG4gICAgICAgIHIuZChhLCBuLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBlW3RdO1xuICAgICAgICB9LmJpbmQobnVsbCwgbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGE7XG4gICAgfSwgci5uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZSAmJiBlLl9fZXNNb2R1bGUgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBlLmRlZmF1bHQ7XG4gICAgICB9IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gci5kKHQsIFwiYVwiLCB0KSwgdDtcbiAgICB9LCByLm8gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KTtcbiAgICB9LCByLnAgPSBcIlwiLCByKHIucyA9IDE5KTtcbiAgfShbZnVuY3Rpb24gKHQsIHIpIHtcbiAgICB0LmV4cG9ydHMgPSBlO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBhO1xuICAgIC8qIVxuICAgICAgQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG4gICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICAgICAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuICAgICovXG5cbiAgICAhZnVuY3Rpb24gKCkge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciByID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgICAgIGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBbXSwgdCA9IDA7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICB2YXIgYSA9IGFyZ3VtZW50c1t0XTtcblxuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHR5cGVvZiBhO1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IG8gfHwgXCJudW1iZXJcIiA9PT0gbykgZS5wdXNoKGEpO2Vsc2UgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgICAgaWYgKGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBuLmFwcGx5KG51bGwsIGEpO1xuICAgICAgICAgICAgICAgIGkgJiYgZS5wdXNoKGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwib2JqZWN0XCIgPT09IG8pIGlmIChhLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSBmb3IgKHZhciBsIGluIGEpIHtcbiAgICAgICAgICAgICAgci5jYWxsKGEsIGwpICYmIGFbbF0gJiYgZS5wdXNoKGwpO1xuICAgICAgICAgICAgfSBlbHNlIGUucHVzaChhLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlLmpvaW4oXCIgXCIpO1xuICAgICAgfVxuXG4gICAgICBlLmV4cG9ydHMgPyAobi5kZWZhdWx0ID0gbiwgZS5leHBvcnRzID0gbikgOiB2b2lkIDAgPT09IChhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH0uYXBwbHkodCwgW10pKSB8fCAoZS5leHBvcnRzID0gYSk7XG4gICAgfSgpO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZXByZWNhdGlvbldhcm5pbmcgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoKSB7fTtcblxuICAgIHQuZGVwcmVjYXRpb25XYXJuaW5nID0gYTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNJb3NEZXZpY2UgPSB0LmhhbmRsZVRhYktleSA9IHQubGlzdFRvVGFibGUgPSB0LmlzRGF0ZUludmFsaWQgPSB0LmZvcm1hdERhdGUgPSB0LnBhcnNlRGF0ZVN0cmluZyA9IHQuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXggPSB0LmlzRGF0ZXNNb250aE91dHNpZGVNaW5Pck1heCA9IHQuaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gdC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXggPSB0LmlzU2FtZURheSA9IHQuaXNTYW1lTW9udGggPSB0LmlzU2FtZVllYXIgPSB0Lm1heCA9IHQubWluID0gdC5zZXRZZWFyID0gdC5zZXRNb250aCA9IHQuc3ViWWVhcnMgPSB0LmFkZFllYXJzID0gdC5zdWJNb250aHMgPSB0LmFkZE1vbnRocyA9IHQuZW5kT2ZXZWVrID0gdC5zdGFydE9mV2VlayA9IHQuc3ViV2Vla3MgPSB0LmFkZFdlZWtzID0gdC5zdWJEYXlzID0gdC5hZGREYXlzID0gdC5sYXN0RGF5T2ZNb250aCA9IHQuc3RhcnRPZk1vbnRoID0gdC50b2RheSA9IHQuc2V0RGF0ZSA9IHQua2VlcERhdGVXaXRoaW5Nb250aCA9IHZvaWQgMDtcbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigwKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBvID0gcig2KTtcblxuICAgIHZhciBpID0gZnVuY3Rpb24gaShlLCB0KSB7XG4gICAgICByZXR1cm4gdCAhPT0gZS5nZXRNb250aCgpICYmIGUuc2V0RGF0ZSgwKSwgZTtcbiAgICB9O1xuXG4gICAgdC5rZWVwRGF0ZVdpdGhpbk1vbnRoID0gaTtcblxuICAgIHZhciBsID0gZnVuY3Rpb24gbChlLCB0LCByKSB7XG4gICAgICB2YXIgYSA9IG5ldyBEYXRlKDApO1xuICAgICAgcmV0dXJuIGEuc2V0RnVsbFllYXIoZSwgdCwgciksIGE7XG4gICAgfTtcblxuICAgIHQuc2V0RGF0ZSA9IGw7XG5cbiAgICB2YXIgdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICB2YXIgZSA9IG5ldyBEYXRlKCksXG4gICAgICAgICAgdCA9IGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIHIgPSBlLmdldE1vbnRoKCksXG4gICAgICAgICAgYSA9IGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHJldHVybiBsKGEsIHIsIHQpO1xuICAgIH07XG5cbiAgICB0LnRvZGF5ID0gdTtcblxuICAgIHZhciBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IG5ldyBEYXRlKDApO1xuICAgICAgcmV0dXJuIHQuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpLCBlLmdldE1vbnRoKCksIDEpLCB0O1xuICAgIH07XG5cbiAgICB0LnN0YXJ0T2ZNb250aCA9IGM7XG5cbiAgICB2YXIgcyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgdmFyIHQgPSBuZXcgRGF0ZSgwKTtcbiAgICAgIHJldHVybiB0LnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSwgZS5nZXRNb250aCgpICsgMSwgMCksIHQ7XG4gICAgfTtcblxuICAgIHQubGFzdERheU9mTW9udGggPSBzO1xuXG4gICAgdmFyIGQgPSBmdW5jdGlvbiBkKGUsIHQpIHtcbiAgICAgIHZhciByID0gbmV3IERhdGUoZS5nZXRUaW1lKCkpO1xuICAgICAgcmV0dXJuIHIuc2V0RGF0ZShyLmdldERhdGUoKSArIHQpLCByO1xuICAgIH07XG5cbiAgICB0LmFkZERheXMgPSBkO1xuXG4gICAgdmFyIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHJldHVybiBkKGUsIC10KTtcbiAgICB9O1xuXG4gICAgdC5zdWJEYXlzID0gZjtcblxuICAgIHZhciBwID0gZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICByZXR1cm4gZChlLCA3ICogdCk7XG4gICAgfTtcblxuICAgIHQuYWRkV2Vla3MgPSBwO1xuXG4gICAgdC5zdWJXZWVrcyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gcChlLCAtdCk7XG4gICAgfTtcblxuICAgIHQuc3RhcnRPZldlZWsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmdldERheSgpO1xuICAgICAgcmV0dXJuIGYoZSwgdCk7XG4gICAgfTtcblxuICAgIHQuZW5kT2ZXZWVrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5nZXREYXkoKTtcbiAgICAgIHJldHVybiBkKGUsIDYgLSB0KTtcbiAgICB9O1xuXG4gICAgdmFyIG0gPSBmdW5jdGlvbiBtKGUsIHQpIHtcbiAgICAgIHZhciByID0gbmV3IERhdGUoZS5nZXRUaW1lKCkpLFxuICAgICAgICAgIGEgPSAoci5nZXRNb250aCgpICsgMTIgKyB0KSAlIDEyO1xuICAgICAgcmV0dXJuIHIuc2V0TW9udGgoci5nZXRNb250aCgpICsgdCksIGkociwgYSksIHI7XG4gICAgfTtcblxuICAgIHQuYWRkTW9udGhzID0gbTtcblxuICAgIHQuc3ViTW9udGhzID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHJldHVybiBtKGUsIC10KTtcbiAgICB9O1xuXG4gICAgdmFyIHkgPSBmdW5jdGlvbiB5KGUsIHQpIHtcbiAgICAgIHJldHVybiBtKGUsIDEyICogdCk7XG4gICAgfTtcblxuICAgIHQuYWRkWWVhcnMgPSB5O1xuXG4gICAgdC5zdWJZZWFycyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4geShlLCAtdCk7XG4gICAgfTtcblxuICAgIHZhciBiID0gZnVuY3Rpb24gYihlLCB0KSB7XG4gICAgICB2YXIgciA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKTtcbiAgICAgIHJldHVybiByLnNldE1vbnRoKHQpLCBpKHIsIHQpLCByO1xuICAgIH07XG5cbiAgICB0LnNldE1vbnRoID0gYjtcblxuICAgIHQuc2V0WWVhciA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2YXIgciA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKSxcbiAgICAgICAgICBhID0gci5nZXRNb250aCgpO1xuICAgICAgcmV0dXJuIHIuc2V0RnVsbFllYXIodCksIGkociwgYSksIHI7XG4gICAgfTtcblxuICAgIHQubWluID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZTtcbiAgICAgIHJldHVybiB0IDwgZSAmJiAociA9IHQpLCBuZXcgRGF0ZShyLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIHQubWF4ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZTtcbiAgICAgIHJldHVybiB0ID4gZSAmJiAociA9IHQpLCBuZXcgRGF0ZShyLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIHZhciB2ID0gZnVuY3Rpb24gdihlLCB0KSB7XG4gICAgICByZXR1cm4gZSAmJiB0ICYmIGUuZ2V0RnVsbFllYXIoKSA9PT0gdC5nZXRGdWxsWWVhcigpO1xuICAgIH07XG5cbiAgICB0LmlzU2FtZVllYXIgPSB2O1xuXG4gICAgdmFyIE8gPSBmdW5jdGlvbiBPKGUsIHQpIHtcbiAgICAgIHJldHVybiB2KGUsIHQpICYmIGUuZ2V0TW9udGgoKSA9PT0gdC5nZXRNb250aCgpO1xuICAgIH07XG5cbiAgICB0LmlzU2FtZU1vbnRoID0gTztcblxuICAgIHQuaXNTYW1lRGF5ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHJldHVybiBPKGUsIHQpICYmIGUuZ2V0RGF0ZSgpID09PSB0LmdldERhdGUoKTtcbiAgICB9O1xuXG4gICAgdC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXggPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdmFyIGEgPSBlO1xuICAgICAgcmV0dXJuIGUgPCB0ID8gYSA9IHQgOiByICYmIGUgPiByICYmIChhID0gciksIG5ldyBEYXRlKGEuZ2V0VGltZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGcgPSBmdW5jdGlvbiBnKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBlID49IHQgJiYgKCFyIHx8IGUgPD0gcik7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gZztcblxuICAgIHQuaXNEYXRlc01vbnRoT3V0c2lkZU1pbk9yTWF4ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBzKGUpIDwgdCB8fCAhIXIgJiYgYyhlKSA+IHI7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXggPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgcmV0dXJuIHMoYihlLCAxMSkpIDwgdCB8fCAhIXIgJiYgYyhiKGUsIDApKSA+IHI7XG4gICAgfTtcblxuICAgIHQucGFyc2VEYXRlU3RyaW5nID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHZhciBhLCBuLCBpLCBjLCBzLCBkLCBmO1xuXG4gICAgICBpZiAodm9pZCAwID09PSB0ICYmICh0ID0gby5JTlRFUk5BTF9EQVRFX0ZPUk1BVCksIHZvaWQgMCA9PT0gciAmJiAociA9ICExKSwgZSkge1xuICAgICAgICB2YXIgcCA9IHZvaWQgMCxcbiAgICAgICAgICAgIG0gPSB2b2lkIDAsXG4gICAgICAgICAgICB5ID0gdm9pZCAwO1xuXG4gICAgICAgIGlmICh0ID09PSBvLkRFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQgPyAocCA9IChhID0gZS5zcGxpdChcIi9cIikpWzBdLCBtID0gYVsxXSwgeSA9IGFbMl0pIDogKHkgPSAobiA9IGUuc3BsaXQoXCItXCIpKVswXSwgcCA9IG5bMV0sIG0gPSBuWzJdKSwgeSAmJiAoZiA9IHBhcnNlSW50KHksIDEwKSwgIU51bWJlci5pc05hTihmKSAmJiAoZCA9IGYsIHIgJiYgKGQgPSBNYXRoLm1heCgwLCBkKSwgeS5sZW5ndGggPCAzKSkpKSB7XG4gICAgICAgICAgdmFyIGIgPSB1KCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICBkID0gYiAtIGIgJSBNYXRoLnBvdygxMCwgeS5sZW5ndGgpICsgZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwICYmIChmID0gcGFyc2VJbnQocCwgMTApLCBOdW1iZXIuaXNOYU4oZikgfHwgKGMgPSBmLCByICYmIChjID0gTWF0aC5tYXgoMSwgYyksIGMgPSBNYXRoLm1pbigxMiwgYykpKSksIGMgJiYgbSAmJiBudWxsICE9IGQgJiYgKGYgPSBwYXJzZUludChtLCAxMCksICFOdW1iZXIuaXNOYU4oZikgJiYgKHMgPSBmLCByKSkpIHtcbiAgICAgICAgICB2YXIgdiA9IGwoZCwgYywgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICAgIHMgPSBNYXRoLm1heCgxLCBzKSwgcyA9IE1hdGgubWluKHYsIHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYyAmJiBzICYmIG51bGwgIT0gZCAmJiAoaSA9IGwoZCwgYyAtIDEsIHMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcblxuICAgIHQuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBvLklOVEVSTkFMX0RBVEVfRk9STUFUKTtcblxuICAgICAgdmFyIHIgPSBmdW5jdGlvbiByKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIChcIjAwMDBcIiArIGUpLnNsaWNlKC10KTtcbiAgICAgIH0sXG4gICAgICAgICAgYSA9IGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgbiA9IGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIGkgPSBlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgIHJldHVybiB0ID09PSBvLkRFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQgPyBbcihhLCAyKSwgcihuLCAyKSwgcihpLCA0KV0uam9pbihcIi9cIikgOiBbcihpLCA0KSwgcihhLCAyKSwgcihuLCAyKV0uam9pbihcIi1cIik7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlSW52YWxpZCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2YXIgYSA9ICExO1xuXG4gICAgICBpZiAoZSkge1xuICAgICAgICBhID0gITA7XG4gICAgICAgIHZhciBuID0gZS5zcGxpdChcIi9cIiksXG4gICAgICAgICAgICBvID0gbi5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgICAgciA9IHBhcnNlSW50KGUsIDEwKTtcbiAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHIpIHx8ICh0ID0gciksIHQ7XG4gICAgICAgIH0pLFxuICAgICAgICAgICAgaSA9IG9bMF0sXG4gICAgICAgICAgICB1ID0gb1sxXSxcbiAgICAgICAgICAgIGMgPSBvWzJdO1xuXG4gICAgICAgIGlmIChpICYmIHUgJiYgbnVsbCAhPSBjKSB7XG4gICAgICAgICAgdmFyIHMgPSBsKGMsIGkgLSAxLCB1KTtcbiAgICAgICAgICBzLmdldE1vbnRoKCkgPT09IGkgLSAxICYmIHMuZ2V0RGF0ZSgpID09PSB1ICYmIHMuZ2V0RnVsbFllYXIoKSA9PT0gYyAmJiA0ID09PSBuWzJdLmxlbmd0aCAmJiBnKHMsIHQsIHIpICYmIChhID0gITEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhO1xuICAgIH07XG5cbiAgICB0Lmxpc3RUb1RhYmxlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgPSBbXSwgYSA9IDA7IGEgPCBlLmxlbmd0aDspIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IFtdOyBhIDwgZS5sZW5ndGggJiYgby5sZW5ndGggPCB0Oykge1xuICAgICAgICAgIG8ucHVzaChlW3BhcnNlSW50KFwiXCIgKyBhKV0pLCBhICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICByLnB1c2gobyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIHIubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgICAgICBrZXk6IFwicm93X1wiICsgdFxuICAgICAgICB9LCBlLm1hcChmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgICAgIGtleTogXCJyb3dfXCIgKyB0ICsgXCJfY2VsbF9cIiArIHJcbiAgICAgICAgICB9LCBlKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICB0LmhhbmRsZVRhYktleSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoXCJUYWJcIiA9PT0gZS5rZXkpIHtcbiAgICAgICAgdmFyIHIgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlICYmICFlLmRpc2FibGVkO1xuICAgICAgICB9KSxcbiAgICAgICAgICAgIGEgPSBudWxsID09PSBkb2N1bWVudCB8fCB2b2lkIDAgPT09IGRvY3VtZW50ID8gdm9pZCAwIDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIG4gPSByLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBvID0gcltwYXJzZUludChcIjBcIildLFxuICAgICAgICAgICAgaSA9IHJbcGFyc2VJbnQoXCJcIiArIG4pXSxcbiAgICAgICAgICAgIGwgPSBhIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQgPyByLmluZGV4T2YoYSkgOiAtMSxcbiAgICAgICAgICAgIHUgPSBsID09PSBuLFxuICAgICAgICAgICAgYyA9IDAgPT09IGwsXG4gICAgICAgICAgICBzID0gLTEgPT09IGw7XG4gICAgICAgIGUuc2hpZnRLZXkgPyAoYyB8fCBzKSAmJiAoZS5wcmV2ZW50RGVmYXVsdCgpLCBudWxsID09IGkgfHwgaS5mb2N1cygpKSA6ICh1IHx8IHMpICYmIChlLnByZXZlbnREZWZhdWx0KCksIG51bGwgPT0gbyB8fCBvLmZvY3VzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0LmlzSW9zRGV2aWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG5hdmlnYXRvciAmJiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQb2R8aVBob25lfGlQYWQpL2cpIHx8IFwiTWFjSW50ZWxcIiA9PT0gbmF2aWdhdG9yLnBsYXRmb3JtICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpICYmICF3aW5kb3cuTVNTdHJlYW07XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuTmF2TGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTmF2TGlzdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUudHlwZSxcbiAgICAgICAgICBpID0gZS5wcmltYXJ5LFxuICAgICAgICAgIGMgPSBlLnNlY29uZGFyeSxcbiAgICAgICAgICBzID0gZS5zdWJuYXYsXG4gICAgICAgICAgZCA9IGUubWVnYW1lbnUsXG4gICAgICAgICAgZiA9IGUuZm9vdGVyU2Vjb25kYXJ5LFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gdShlLCBbXCJpdGVtc1wiLCBcInR5cGVcIiwgXCJwcmltYXJ5XCIsIFwic2Vjb25kYXJ5XCIsIFwic3VibmF2XCIsIFwibWVnYW1lbnVcIiwgXCJmb290ZXJTZWNvbmRhcnlcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgICAgaSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiTmF2TGlzdCBwcm9wZXJ0eSBwcmltYXJ5IGlzIGRlcHJlY2F0ZWQuICBVc2UgdHlwZVwiKSwgYyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiTmF2TGlzdCBwcm9wZXJ0eSBzZWNvbmRhcnkgaXMgZGVwcmVjYXRlZC4gIFVzZSB0eXBlXCIpLCBzICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJOYXZMaXN0IHByb3BlcnR5IHN1Ym5hdiBpcyBkZXByZWNhdGVkLiAgVXNlIHR5cGVcIiksIGQgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIk5hdkxpc3QgcHJvcGVydHkgbWVnYW1lbnUgaXMgZGVwcmVjYXRlZC4gIFVzZSB0eXBlXCIpLCBmICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJOYXZMaXN0IHByb3BlcnR5IGZvb3RlclNlY29uZGFyeSBpcyBkZXByZWNhdGVkLiAgVXNlIHR5cGVcIik7XG5cbiAgICAgIHZhciB5ID0gciA/IFwicHJpbWFyeVwiID09PSByIDogaSxcbiAgICAgICAgICBiID0gciA/IFwic2Vjb25kYXJ5XCIgPT09IHIgOiBjLFxuICAgICAgICAgIHYgPSByID8gXCJzdWJuYXZcIiA9PT0gciA6IHMsXG4gICAgICAgICAgTyA9IHIgPyBcIm1lZ2FtZW51XCIgPT09IHIgOiBkLFxuICAgICAgICAgIGcgPSByID8gXCJmb290ZXJTZWNvbmRhcnlcIiA9PT0gciA6IGYsXG4gICAgICAgICAgXyA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2EtbmF2X19wcmltYXJ5IHVzYS1hY2NvcmRpb25cIjogeSxcbiAgICAgICAgXCJ1c2EtbmF2X19zZWNvbmRhcnktbGlua3NcIjogYixcbiAgICAgICAgXCJ1c2EtbmF2X19zdWJtZW51XCI6IHYsXG4gICAgICAgIFwidXNhLW5hdl9fc3VibWVudS1saXN0XCI6IE8sXG4gICAgICAgIFwidXNhLWxpc3QgdXNhLWxpc3QtLXVuc3R5bGVkXCI6IGdcbiAgICAgIH0sIHApLFxuICAgICAgICAgIGggPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLW5hdl9fcHJpbWFyeS1pdGVtXCI6IHksXG4gICAgICAgIFwidXNhLW5hdl9fc2Vjb25kYXJ5LWl0ZW1cIjogYixcbiAgICAgICAgXCJ1c2EtbmF2X19zdWJtZW51LWl0ZW1cIjogdiB8fCBPLFxuICAgICAgICBcInVzYS1mb290ZXJfX3NlY29uZGFyeS1saW5rXCI6IGdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfbCh7XG4gICAgICAgIGNsYXNzTmFtZTogX1xuICAgICAgfSwgbSksIHQubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICBrZXk6IFwiaXRlbV9cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBoXG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkxhYmVsID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5odG1sRm9yLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gZS5lcnJvcixcbiAgICAgICAgICBjID0gZS5oaW50LFxuICAgICAgICAgIHMgPSBlLnNyT25seSxcbiAgICAgICAgICBkID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImh0bWxGb3JcIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcImhpbnRcIiwgXCJzck9ubHlcIl0pLFxuICAgICAgICAgIGYgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWxhYmVsXCI6ICFzLFxuICAgICAgICBcInVzYS1zci1vbmx5XCI6IHMsXG4gICAgICAgIFwidXNhLWxhYmVsLS1lcnJvclwiOiB1XG4gICAgICB9LCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIF9pKHt9LCBkLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJsYWJlbFwiLFxuICAgICAgICBjbGFzc05hbWU6IGYsXG4gICAgICAgIGh0bWxGb3I6IHJcbiAgICAgIH0pLCB0LCBjICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaGludFwiXG4gICAgICB9LCBjKSk7XG4gICAgfTtcblxuICAgIHQuTGFiZWwgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5JTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IHQuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCA9IHQuREVGQVVMVF9NSU5fREFURSA9IHQuWUVBUl9DSFVOSyA9IHQuRU5URVJfS0VZQ09ERSA9IHQuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTID0gdC5EQVlfT0ZfV0VFS19MQUJFTFMgPSB0Lk1PTlRIX0xBQkVMUyA9IHQuVkFMSURBVElPTl9NRVNTQUdFID0gdm9pZCAwO1xuICAgIHQuVkFMSURBVElPTl9NRVNTQUdFID0gXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCI7XG4gICAgdC5NT05USF9MQUJFTFMgPSBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXTtcbiAgICB0LkRBWV9PRl9XRUVLX0xBQkVMUyA9IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdO1xuICAgIHQuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTID0gW1wiU1wiLCBcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRoXCIsIFwiRlwiLCBcIlNcIl07XG4gICAgdC5FTlRFUl9LRVlDT0RFID0gMTM7XG4gICAgdC5ZRUFSX0NIVU5LID0gMTI7XG4gICAgdC5ERUZBVUxUX01JTl9EQVRFID0gXCIwMDAwLTAxLTAxXCI7XG4gICAgdC5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFUID0gXCJNTS9ERC9ZWVlZXCI7XG4gICAgdC5JTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5UZXh0SW5wdXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMiA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgaSA9IGUudHlwZSxcbiAgICAgICAgICBjID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgcyA9IGUudmFsaWRhdGlvblN0YXR1cyxcbiAgICAgICAgICBkID0gZS5lcnJvcixcbiAgICAgICAgICBmID0gZS5zdWNjZXNzLFxuICAgICAgICAgIHAgPSBlLmlucHV0U2l6ZSxcbiAgICAgICAgICBtID0gZS5zbWFsbCxcbiAgICAgICAgICB5ID0gZS5tZWRpdW0sXG4gICAgICAgICAgYiA9IGUuaW5wdXRSZWYsXG4gICAgICAgICAgdiA9IHUoZSwgW1wiaWRcIiwgXCJuYW1lXCIsIFwidHlwZVwiLCBcImNsYXNzTmFtZVwiLCBcInZhbGlkYXRpb25TdGF0dXNcIiwgXCJlcnJvclwiLCBcInN1Y2Nlc3NcIiwgXCJpbnB1dFNpemVcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImlucHV0UmVmXCJdKTtcbiAgICAgIGQgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlRleHRJbnB1dCBwcm9wZXJ0eSBlcnJvciBpcyBkZXByZWNhdGVkLiAgVXNlIHZhbGlkYXRpb25TdGF0dXNcIiksIGYgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlRleHRJbnB1dCBwcm9wZXJ0eSBzdWNjZXNzIGlzIGRlcHJlY2F0ZWQuICBVc2UgdmFsaWRhdGlvblN0YXR1c1wiKSwgbSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiVGV4dElucHV0IHByb3BlcnR5IHNtYWxsIGlzIGRlcHJlY2F0ZWQuICBVc2UgaW5wdXRTaXplXCIpLCB5ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJUZXh0SW5wdXQgcHJvcGVydHkgbWVkaXVtIGlzIGRlcHJlY2F0ZWQuICBVc2UgaW5wdXRTaXplXCIpO1xuXG4gICAgICB2YXIgTyA9IHMgPyBcImVycm9yXCIgPT09IHMgOiBkLFxuICAgICAgICAgIGcgPSBzID8gXCJzdWNjZXNzXCIgPT09IHMgOiBmLFxuICAgICAgICAgIF8gPSBwID8gXCJzbWFsbFwiID09PSBwIDogbSxcbiAgICAgICAgICBoID0gcCA/IFwibWVkaXVtXCIgPT09IHAgOiB5LFxuICAgICAgICAgIGogPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pbnB1dFwiLCB7XG4gICAgICAgIFwidXNhLWlucHV0LS1lcnJvclwiOiBPLFxuICAgICAgICBcInVzYS1pbnB1dC0tc3VjY2Vzc1wiOiBnLFxuICAgICAgICBcInVzYS1pbnB1dC0tc21hbGxcIjogXyxcbiAgICAgICAgXCJ1c2EtaW5wdXQtLW1lZGl1bVwiOiBoXG4gICAgICB9LCBjKTtcblxuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2wyKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRleHRJbnB1dFwiLFxuICAgICAgICBjbGFzc05hbWU6IGosXG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICB0eXBlOiBpLFxuICAgICAgICByZWY6IGJcbiAgICAgIH0sIHYpKTtcbiAgICB9O1xuXG4gICAgdC5UZXh0SW5wdXQgPSBjO1xuICAgIHZhciBzID0gYztcbiAgICB0LmRlZmF1bHQgPSBzO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb3JtR3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0LkZvcm1Hcm91cCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmVycm9yLFxuICAgICAgICAgIGkgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb3JtLWdyb3VwXCIsIHtcbiAgICAgICAgXCJ1c2EtZm9ybS1ncm91cC0tZXJyb3JcIjogb1xuICAgICAgfSwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9ybUdyb3VwXCIsXG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuc2FtcGxlTG9jYWxpemF0aW9uID0gdC5FTl9VUyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IHIoNiksXG4gICAgICAgIG4gPSB7XG4gICAgICBtb250aHM6IGEuTU9OVEhfTEFCRUxTLFxuICAgICAgZGF5c09mV2VlazogYS5EQVlfT0ZfV0VFS19MQUJFTFMsXG4gICAgICBkYXlzT2ZXZWVrU2hvcnQ6IGEuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTLFxuICAgICAgc3RhdHVzZXM6IFtcIllvdSBjYW4gbmF2aWdhdGUgYnkgZGF5IHVzaW5nIGxlZnQgYW5kIHJpZ2h0IGFycm93c1wiLCBcIldlZWtzIGJ5IHVzaW5nIHVwIGFuZCBkb3duIGFycm93c1wiLCBcIk1vbnRocyBieSB1c2luZyBwYWdlIHVwIGFuZCBwYWdlIGRvd24ga2V5c1wiLCBcIlllYXJzIGJ5IHVzaW5nIHNoaWZ0IHBsdXMgcGFnZSB1cCBhbmQgc2hpZnQgcGx1cyBwYWdlIGRvd25cIiwgXCJIb21lIGFuZCBlbmQga2V5cyBuYXZpZ2F0ZSB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSB3ZWVrXCJdLFxuICAgICAgc2VsZWN0ZWREYXRlOiBcIlNlbGVjdGVkIGRhdGVcIixcbiAgICAgIHNlbGVjdEFNb250aDogXCJTZWxlY3QgYSBtb250aC5cIixcbiAgICAgIHRvZ2dsZUNhbGVuZGFyOiBcIlRvZ2dsZSBjYWxlbmRhclwiLFxuICAgICAgYmFja09uZVllYXI6IFwiTmF2aWdhdGUgYmFjayBvbmUgeWVhclwiLFxuICAgICAgYmFja09uZU1vbnRoOiBcIk5hdmlnYXRlIGJhY2sgb25lIG1vbnRoXCIsXG4gICAgICBmb3J3YXJkT25lWWVhcjogXCJOYXZpZ2F0ZSBmb3J3YXJkIG9uZSB5ZWFyXCIsXG4gICAgICBmb3J3YXJkT25lTW9udGg6IFwiTmF2aWdhdGUgZm9yd2FyZCBvbmUgbW9udGhcIixcbiAgICAgIGNsaWNrVG9TZWxlY3RNb250aDogXCJDbGljayB0byBzZWxlY3QgbW9udGhcIixcbiAgICAgIGNsaWNrVG9TZWxlY3RZZWFyOiBcIkNsaWNrIHRvIHNlbGVjdCB5ZWFyXCJcbiAgICB9O1xuICAgIHQuRU5fVVMgPSBuO1xuICAgIHQuc2FtcGxlTG9jYWxpemF0aW9uID0ge1xuICAgICAgbW9udGhzOiBbXCJlbmVyb1wiLCBcImZlYnJlcm9cIiwgXCJtYXJ6b1wiLCBcImFicmlsXCIsIFwibWF5b1wiLCBcImp1bmlvXCIsIFwianVsaW9cIiwgXCJhZ29zdG9cIiwgXCJzZXB0aWVtYnJlXCIsIFwib2N0dWJyZVwiLCBcIm5vdmllbWJyZVwiLCBcImRpY2llbWJyZVwiXSxcbiAgICAgIGRheXNPZldlZWs6IFtcImRvbWluZ29cIiwgXCJsdW5lc1wiLCBcIm1hcnRlc1wiLCBcIm1pw6lyY29sZXNcIiwgXCJqdWV2ZXNcIiwgXCJ2aWVybmVzXCIsIFwic8OhYmFkb1wiXSxcbiAgICAgIGRheXNPZldlZWtTaG9ydDogW1wiRG9cIiwgXCJMdVwiLCBcIk1hXCIsIFwiTWlcIiwgXCJKdVwiLCBcIlZpXCIsIFwiU2FcIl0sXG4gICAgICBzdGF0dXNlczogW1wiUHVlZGUgbmF2ZWdhciBwb3IgZMOtYSB1c2FuZG8gbGFzIGZsZWNoYXMgaXpxdWllcmRhIHkgZGVyZWNoYVwiLCBcIlNlbWFuYXMgdXNhbmRvIGZsZWNoYXMgaGFjaWEgYXJyaWJhIHkgaGFjaWEgYWJham9cIiwgXCJNZXNlcyB1c2FuZG8gbGFzIHRlY2xhcyBkZSBhdmFuY2UgeSByZXRyb2Nlc28gZGUgcMOhZ2luYVwiLCBcIkHDsW9zIHVzYW5kbyBzaGlmdCBwbHVzIHBhZ2UgdXAgeSBzaGlmdCBwbHVzIHBhZ2UgZG93blwiLCBcIkxhcyB0ZWNsYXMgZGUgaW5pY2lvIHkgZmluYWxpemFjacOzbiBuYXZlZ2FuIGhhc3RhIGVsIHByaW5jaXBpbyB5IGVsIGZpbmFsIGRlIHVuYSBzZW1hbmFcIl0sXG4gICAgICBzZWxlY3RlZERhdGU6IFwiRmVjaGEgc2VsZWNjaW9uYWRhXCIsXG4gICAgICBzZWxlY3RBTW9udGg6IFwiU2VsZWNjaW9uYSB1biBtZXMuXCIsXG4gICAgICB0b2dnbGVDYWxlbmRhcjogXCJBbHRlcm5hciBjYWxlbmRhcmlvXCIsXG4gICAgICBiYWNrT25lWWVhcjogXCJOYXZlZ2FyIGhhY2lhIGF0csOhcyB1biBhw7FvXCIsXG4gICAgICBiYWNrT25lTW9udGg6IFwiTmF2ZWdhciBoYWNpYSBhdHLDoXMgdW4gbWVzXCIsXG4gICAgICBmb3J3YXJkT25lWWVhcjogXCJOYXZlZ2FyIGhhY2lhIGFkZWxhbnRlIHVuIGHDsW9cIixcbiAgICAgIGZvcndhcmRPbmVNb250aDogXCJOYXZlZ2FyIGhhY2lhIGFkZWxhbnRlIHVuIG1lc1wiLFxuICAgICAgY2xpY2tUb1NlbGVjdE1vbnRoOiBcIkhhZ2EgY2xpYyBwYXJhIHNlbGVjY2lvbmFyIGVsIG1lc1wiLFxuICAgICAgY2xpY2tUb1NlbGVjdFllYXI6IFwiSGFnYSBjbGljIHBhcmEgc2VsZWNjaW9uYXIgZWwgYcOxb1wiXG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNDdXN0b21Qcm9wcyA9IHUsIHQuTGluayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodShlKSkge1xuICAgICAgICB2YXIgdCA9IGUudmFyaWFudCxcbiAgICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIG4gPSBlLmFzQ3VzdG9tLFxuICAgICAgICAgICAgbyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBzID0gbChlLCBbXCJ2YXJpYW50XCIsIFwiY2xhc3NOYW1lXCIsIFwiYXNDdXN0b21cIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgICBkID0gYyh0LCByKTtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4sIF9pMih7XG4gICAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICAgIH0sIHMpLCBvKTtcbiAgICAgIH1cblxuICAgICAgbyA9IGUuY2hpbGRyZW4sIHIgPSBlLmNsYXNzTmFtZSwgdCA9IGUudmFyaWFudCwgcyA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJ2YXJpYW50XCJdKSwgZCA9IGModCwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIF9pMih7XG4gICAgICAgIGNsYXNzTmFtZTogZFxuICAgICAgfSwgcyksIG8pO1xuICAgIH07XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICByZXR1cm4gXCJhc0N1c3RvbVwiIGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IFwiZXh0ZXJuYWxcIiA9PT0gZSxcbiAgICAgICAgICBhID0gXCJuYXZcIiA9PT0gZTtcbiAgICAgIHJldHVybiBcInVuc3R5bGVkXCIgPT09IGUgPyB0IDogKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbGlua1wiLCB7XG4gICAgICAgIFwidXNhLWxpbmstLWV4dGVybmFsXCI6IHIsXG4gICAgICAgIFwidXNhLW5hdl9fbGlua1wiOiBhXG4gICAgICB9LCB0KTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNvbWJvQm94ID0gdC5Gb2N1c01vZGUgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IGwodCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG8gPSAoYSA9IHIoMSkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgaSA9IHIoNDkpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAobCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIHUsXG4gICAgICAgIGMsXG4gICAgICAgIF9zID0gZnVuY3Rpb24gcygpIHtcbiAgICAgIHJldHVybiAoX3MgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGQgPSBmdW5jdGlvbiBkKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICAhZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVbZS5QcmV2aW91cyA9IC0xXSA9IFwiUHJldmlvdXNcIiwgZVtlLk5leHQgPSAxXSA9IFwiTmV4dFwiO1xuICAgIH0odSB8fCAodSA9IHt9KSksIHQuRm9jdXNNb2RlID0gYywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVbZS5Ob25lID0gMF0gPSBcIk5vbmVcIiwgZVtlLklucHV0ID0gMV0gPSBcIklucHV0XCIsIGVbZS5JdGVtID0gMl0gPSBcIkl0ZW1cIjtcbiAgICB9KGMgfHwgKHQuRm9jdXNNb2RlID0gYyA9IHt9KSk7XG5cbiAgICB2YXIgZiA9IGZ1bmN0aW9uIGYoZSkge1xuICAgICAgdmFyIHQgPSBlLmZvY3VzZWQsXG4gICAgICAgICAgciA9IGQoZSwgW1wiZm9jdXNlZFwiXSksXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikobnVsbCk7XG4gICAgICByZXR1cm4gKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQgJiYgYS5jdXJyZW50ICYmIGEuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX3Moe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2lucHV0XCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtaW5wdXRcIlxuICAgICAgfSwgciwge1xuICAgICAgICBhdXRvQ2FwaXRhbGl6ZTogXCJvZmZcIixcbiAgICAgICAgYXV0b0NvbXBsZXRlOiBcIm9mZlwiLFxuICAgICAgICByZWY6IGFcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgICAgICBwID0gKDAsIG4uZm9yd2FyZFJlZikoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgbCA9IGUuaWQsXG4gICAgICAgICAgZCA9IGUubmFtZSxcbiAgICAgICAgICBwID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbSA9IGUub3B0aW9ucyxcbiAgICAgICAgICB5ID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgYiA9IGUuZGlzYWJsZWQsXG4gICAgICAgICAgdiA9IGUub25DaGFuZ2UsXG4gICAgICAgICAgTyA9IGUuYXNzaXN0aXZlSGludCxcbiAgICAgICAgICBnID0gZS5ub1Jlc3VsdHMsXG4gICAgICAgICAgXyA9IGUuc2VsZWN0UHJvcHMsXG4gICAgICAgICAgaCA9IGUuaW5wdXRQcm9wcyxcbiAgICAgICAgICBqID0gZS51bFByb3BzLFxuICAgICAgICAgIE0gPSBlLmN1c3RvbUZpbHRlcixcbiAgICAgICAgICBOID0gZS5kaXNhYmxlRmlsdGVyaW5nLFxuICAgICAgICAgIEUgPSB2b2lkIDAgIT09IE4gJiYgTixcbiAgICAgICAgICBQID0gISFiO1xuICAgICAgeSAmJiAoYSA9IG0uZmluZChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS52YWx1ZSA9PT0geTtcbiAgICAgIH0pKTtcbiAgICAgIHZhciB3ID0gTSB8fCB7XG4gICAgICAgIGZpbHRlcjogXCIuKnt7cXVlcnl9fS4qXCJcbiAgICAgIH0sXG4gICAgICAgICAgSSA9IHtcbiAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgc2VsZWN0ZWRPcHRpb246IGEgfHwgdm9pZCAwLFxuICAgICAgICBmb2N1c2VkT3B0aW9uOiB2b2lkIDAsXG4gICAgICAgIGZvY3VzTW9kZTogYy5Ob25lLFxuICAgICAgICBmaWx0ZXJlZE9wdGlvbnM6IG0sXG4gICAgICAgIGlucHV0VmFsdWU6IGEgPyBhLmxhYmVsIDogXCJcIlxuICAgICAgfSxcbiAgICAgICAgICBEID0gKDAsIGkudXNlQ29tYm9Cb3gpKEksIG0sIEUsIHcpLFxuICAgICAgICAgIFMgPSBEWzBdLFxuICAgICAgICAgIHggPSBEWzFdLFxuICAgICAgICAgIGsgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEEgPSAoMCwgbi51c2VSZWYpKG51bGwpO1xuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICB2ICYmIHYoKG51bGwgPT09IChlID0gUy5zZWxlY3RlZE9wdGlvbikgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS52YWx1ZSkgfHwgdm9pZCAwKTtcbiAgICAgIH0sIFtTLnNlbGVjdGVkT3B0aW9uXSksICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBTLmZvY3VzTW9kZSA9PT0gYy5JdGVtICYmIFMuZm9jdXNlZE9wdGlvbiAmJiBBLmN1cnJlbnQgJiYgQS5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9LCBbUy5mb2N1c01vZGUsIFMuZm9jdXNlZE9wdGlvbl0pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUy5pc09wZW4gJiYgUy5mb2N1c2VkT3B0aW9uICYmIEEuY3VycmVudCAmJiBTLmZvY3VzTW9kZSA9PT0gYy5JbnB1dCAmJiBBLmN1cnJlbnQuc2Nyb2xsSW50b1ZpZXcoITEpO1xuICAgICAgfSwgW1MuaXNPcGVuLCBTLmZvY3VzZWRPcHRpb25dKSwgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBTLmZvY3VzTW9kZSAhPT0gYy5Ob25lICYmICgobnVsbCA9PT0gKGUgPSBrLmN1cnJlbnQpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuY29udGFpbnMod2luZG93LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB8fCB4KHtcbiAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgfSkpO1xuICAgICAgfSwgW1MuZm9jdXNNb2RlXSksICgwLCBuLnVzZUltcGVyYXRpdmVIYW5kbGUpKHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4geCh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQ0xFQVJfU0VMRUNUSU9OXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIHZhciBUID0gZnVuY3Rpb24gVChlLCB0LCByKSB7XG4gICAgICAgIHZhciBhID0gdC5mb2N1c2VkT3B0aW9uID8gdC5maWx0ZXJlZE9wdGlvbnMuaW5kZXhPZih0LmZvY3VzZWRPcHRpb24pIDogLTEsXG4gICAgICAgICAgICBuID0gdC5maWx0ZXJlZE9wdGlvbnNbMF0sXG4gICAgICAgICAgICBvID0gdC5maWx0ZXJlZE9wdGlvbnNbdC5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICgtMSA9PT0gYSkgZSh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgb3B0aW9uOiBuXG4gICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgIHZhciBsID0gYSArIHI7XG4gICAgICAgICAgaWYgKGwgPCAwICYmIHQuc2VsZWN0ZWRPcHRpb24pIGUoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IG5cbiAgICAgICAgICB9KTtlbHNlIGlmIChsIDwgMCkgZSh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMT1NFX0xJU1RcbiAgICAgICAgICB9KTtlbHNlIGlmIChsID49IHQuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCkgZSh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkZPQ1VTX09QVElPTixcbiAgICAgICAgICAgIG9wdGlvbjogb1xuICAgICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIHUgPSB0LmZpbHRlcmVkT3B0aW9uc1tsXTtcbiAgICAgICAgICAgIGUoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkZPQ1VTX09QVElPTixcbiAgICAgICAgICAgICAgb3B0aW9uOiB1XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAgICAgTCA9IGZ1bmN0aW9uIEwoZSkge1xuICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgIHIgPSBlLnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgICghciB8fCByIGluc3RhbmNlb2YgTm9kZSAmJiAhKG51bGwgPT09ICh0ID0gay5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0LmNvbnRhaW5zKHIpKSkgJiYgeCh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5CTFVSXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICAgICBDID0gZnVuY3Rpb24gQyhlKSB7XG4gICAgICAgIFwiRXNjYXBlXCIgPT09IGUua2V5ID8geCh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUXG4gICAgICAgIH0pIDogXCJUYWJcIiA9PT0gZS5rZXkgfHwgXCJFbnRlclwiID09PSBlLmtleSA/IChlLnByZXZlbnREZWZhdWx0KCksIFMuZm9jdXNlZE9wdGlvbiAmJiB4KHtcbiAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLlNFTEVDVF9PUFRJT04sXG4gICAgICAgICAgb3B0aW9uOiBTLmZvY3VzZWRPcHRpb25cbiAgICAgICAgfSkpIDogXCJBcnJvd0Rvd25cIiA9PT0gZS5rZXkgfHwgXCJEb3duXCIgPT09IGUua2V5ID8gKGUucHJldmVudERlZmF1bHQoKSwgVCh4LCBTLCB1Lk5leHQpKSA6IFwiQXJyb3dVcFwiICE9PSBlLmtleSAmJiBcIlVwXCIgIT09IGUua2V5IHx8IChlLnByZXZlbnREZWZhdWx0KCksIFQoeCwgUywgdS5QcmV2aW91cykpO1xuICAgICAgfSxcbiAgICAgICAgICBGID0gUy5zZWxlY3RlZE9wdGlvbiAmJiBTLnNlbGVjdGVkT3B0aW9uLmxhYmVsID09PSBTLmlucHV0VmFsdWUsXG4gICAgICAgICAgUiA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWNvbWJvLWJveFwiLCBwLCB7XG4gICAgICAgIFwidXNhLWNvbWJvLWJveC0tcHJpc3RpbmVcIjogRlxuICAgICAgfSksXG4gICAgICAgICAgVSA9IFwiY29tYm9ib3gtXCIgKyBkICsgXCItbGlzdFwiLFxuICAgICAgICAgIEIgPSBcImNvbWJvYm94LVwiICsgZCArIFwiLWFzc2lzdGl2ZS1oaW50XCI7XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3hcIixcbiAgICAgICAgY2xhc3NOYW1lOiBSLFxuICAgICAgICBpZDogbCxcbiAgICAgICAgcmVmOiBrXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLCBfcyh7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc2VsZWN0IHVzYS1zci1vbmx5IHVzYS1jb21iby1ib3hfX3NlbGVjdFwiLFxuICAgICAgICBuYW1lOiBkLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6ICEwLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogbnVsbCA9PT0gKHIgPSBTLnNlbGVjdGVkT3B0aW9uKSB8fCB2b2lkIDAgPT09IHIgPyB2b2lkIDAgOiByLnZhbHVlLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94LXNlbGVjdFwiLFxuICAgICAgICBkaXNhYmxlZDogUFxuICAgICAgfSwgXyksIG0ubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCB7XG4gICAgICAgICAga2V5OiBlLnZhbHVlLFxuICAgICAgICAgIHZhbHVlOiBlLnZhbHVlXG4gICAgICAgIH0sIGUubGFiZWwpO1xuICAgICAgfSkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChmLCBfcyh7XG4gICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgICAgcmV0dXJuIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5VUERBVEVfRklMVEVSLFxuICAgICAgICAgICAgdmFsdWU6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgcmV0dXJuIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5PUEVOX0xJU1RcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgICByID0gZS5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICAgICghciB8fCByIGluc3RhbmNlb2YgTm9kZSAmJiAhKG51bGwgPT09ICh0ID0gay5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0LmNvbnRhaW5zKHIpKSkgJiYgUy5mb2N1c01vZGUgIT09IGMuTm9uZSAmJiB4KHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQkxVUlxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgaWYgKFwiRXNjYXBlXCIgPT09IGUua2V5KSB4KHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQ0xPU0VfTElTVFxuICAgICAgICAgIH0pO2Vsc2UgaWYgKFwiQXJyb3dEb3duXCIgPT09IGUua2V5IHx8IFwiRG93blwiID09IGUua2V5KSBlLnByZXZlbnREZWZhdWx0KCksIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IFMuc2VsZWN0ZWRPcHRpb24gfHwgUy5mb2N1c2VkT3B0aW9uIHx8IFMuZmlsdGVyZWRPcHRpb25zWzBdXG4gICAgICAgICAgfSk7ZWxzZSBpZiAoXCJUYWJcIiA9PT0gZS5rZXkpIHtcbiAgICAgICAgICAgIGlmIChTLmlzT3BlbiAmJiAhUy5zZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgICAgICB2YXIgdCA9IEUgPyBTLmZvY3VzZWRPcHRpb24gOiBTLnNlbGVjdGVkT3B0aW9uIHx8IFMuZm9jdXNlZE9wdGlvbjtcbiAgICAgICAgICAgICAgdCA/IChlLnByZXZlbnREZWZhdWx0KCksIHgoe1xuICAgICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgICAgICAgIG9wdGlvbjogdFxuICAgICAgICAgICAgICB9KSkgOiB4KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICFTLmlzT3BlbiAmJiBTLnNlbGVjdGVkT3B0aW9uICYmIHgoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCJFbnRlclwiID09PSBlLmtleSAmJiBTLmlzT3Blbikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIHIgPSBTLmZpbHRlcmVkT3B0aW9ucy5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IFMuaW5wdXRWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByID8geCh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuU0VMRUNUX09QVElPTixcbiAgICAgICAgICAgICAgb3B0aW9uOiByXG4gICAgICAgICAgICB9KSA6IFMuc2VsZWN0ZWRPcHRpb24gPyB4KHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUXG4gICAgICAgICAgICB9KSA6IHgoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMRUFSXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBTLmlucHV0VmFsdWUsXG4gICAgICAgIGZvY3VzZWQ6IFMuZm9jdXNNb2RlID09PSBjLklucHV0LFxuICAgICAgICByb2xlOiBcImNvbWJvYm94XCIsXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IFUsXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiBCLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogUy5pc09wZW4sXG4gICAgICAgIGRpc2FibGVkOiBQXG4gICAgICB9LCBoKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29tYm8tYm94X19jbGVhci1pbnB1dF9fd3JhcHBlclwiLFxuICAgICAgICB0YWJJbmRleDogLTFcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2NsZWFyLWlucHV0XCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIkNsZWFyIHRoZSBzZWxlY3QgY29udGVudHNcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICByZXR1cm4geCh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMRUFSXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtY2xlYXItYnV0dG9uXCIsXG4gICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICAgICAgICBcIlRhYlwiID09PSBlLmtleSAmJiBTLmlzT3BlbiAmJiBTLnNlbGVjdGVkT3B0aW9uICYmIChlLnByZXZlbnREZWZhdWx0KCksIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IFMuc2VsZWN0ZWRPcHRpb25cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGhpZGRlbjogIUZcbiAgICAgIH0sIFwiwqBcIikpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9faW5wdXQtYnV0dG9uLXNlcGFyYXRvclwiXG4gICAgICB9LCBcIsKgXCIpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fdG9nZ2xlLWxpc3RfX3dyYXBwZXJcIixcbiAgICAgICAgdGFiSW5kZXg6IC0xXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtdG9nZ2xlXCIsXG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29tYm8tYm94X190b2dnbGUtbGlzdFwiLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIlRvZ2dsZSB0aGUgZHJvcGRvd24gbGlzdFwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHJldHVybiB4KHtcbiAgICAgICAgICAgIHR5cGU6IFMuaXNPcGVuID8gaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUIDogaS5BY3Rpb25UeXBlcy5PUEVOX0xJU1RcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZWQ6IFBcbiAgICAgIH0sIFwiwqBcIikpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIF9zKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNvbWJvLWJveC1vcHRpb24tbGlzdFwiLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGlkOiBVLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fbGlzdFwiLFxuICAgICAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICAgICAgaGlkZGVuOiAhUy5pc09wZW5cbiAgICAgIH0sIGopLCBTLmZpbHRlcmVkT3B0aW9ucy5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBlID09PSBTLmZvY3VzZWRPcHRpb24sXG4gICAgICAgICAgICBhID0gZSA9PT0gUy5zZWxlY3RlZE9wdGlvbixcbiAgICAgICAgICAgIGwgPSAoMCwgby5kZWZhdWx0KShcInVzYS1jb21iby1ib3hfX2xpc3Qtb3B0aW9uXCIsIHtcbiAgICAgICAgICBcInVzYS1jb21iby1ib3hfX2xpc3Qtb3B0aW9uLS1mb2N1c2VkXCI6IHIsXG4gICAgICAgICAgXCJ1c2EtY29tYm8tYm94X19saXN0LW9wdGlvbi0tc2VsZWN0ZWRcIjogYVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgIHJlZjogciA/IEEgOiBudWxsLFxuICAgICAgICAgIHZhbHVlOiBlLnZhbHVlLFxuICAgICAgICAgIGtleTogZS52YWx1ZSxcbiAgICAgICAgICBjbGFzc05hbWU6IGwsXG4gICAgICAgICAgdGFiSW5kZXg6IHIgPyAwIDogLTEsXG4gICAgICAgICAgcm9sZTogXCJvcHRpb25cIixcbiAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogYSxcbiAgICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiA2NCxcbiAgICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjogdCArIDEsXG4gICAgICAgICAgaWQ6IFUgKyBcIi0tb3B0aW9uLVwiICsgdCxcbiAgICAgICAgICBvbktleURvd246IEMsXG4gICAgICAgICAgb25CbHVyOiBMLFxuICAgICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtb3B0aW9uLVwiICsgZS52YWx1ZSxcbiAgICAgICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB4KHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICAgIG9wdGlvbjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgeCh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuU0VMRUNUX09QVElPTixcbiAgICAgICAgICAgICAgb3B0aW9uOiBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGUubGFiZWwpO1xuICAgICAgfSksIDAgPT09IFMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA/IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fbGlzdC1vcHRpb24tLW5vLXJlc3VsdHNcIlxuICAgICAgfSwgZyB8fCBcIk5vIHJlc3VsdHMgZm91bmRcIikgOiBudWxsKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fc3RhdHVzIHVzYS1zci1vbmx5XCIsXG4gICAgICAgIHJvbGU6IFwic3RhdHVzXCJcbiAgICAgIH0pLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBpZDogQixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zci1vbmx5XCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtYXNzaXN0aXZlLWhpbnRcIlxuICAgICAgfSwgTyB8fCBcIldoZW4gYXV0b2NvbXBsZXRlIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSB1c2UgdXAgYW5kIGRvd24gYXJyb3dzIHRvIHJldmlld1xcbiAgICAgICAgICAgYW5kIGVudGVyIHRvIHNlbGVjdC4gVG91Y2ggZGV2aWNlIHVzZXJzLCBleHBsb3JlIGJ5IHRvdWNoIG9yIHdpdGggc3dpcGVcXG4gICAgICAgICAgIGdlc3R1cmVzLlwiKSk7XG4gICAgfSk7XG5cbiAgICB0LkNvbWJvQm94ID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRGF0ZVBpY2tlciA9IHQuRm9jdXNNb2RlID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBzKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDYpLFxuICAgICAgICBsID0gcig5KSxcbiAgICAgICAgdSA9IHIoMyksXG4gICAgICAgIGMgPSByKDUzKTtcblxuICAgIGZ1bmN0aW9uIHMoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBkLFxuICAgICAgICBfZiA9IGZ1bmN0aW9uIGYoKSB7XG4gICAgICByZXR1cm4gKF9mID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBwID0gZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Gb2N1c01vZGUgPSBkLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZVtlLk5vbmUgPSAwXSA9IFwiTm9uZVwiLCBlW2UuSW5wdXQgPSAxXSA9IFwiSW5wdXRcIjtcbiAgICB9KGQgfHwgKHQuRm9jdXNNb2RlID0gZCA9IHt9KSk7XG5cbiAgICB2YXIgbSA9IGZ1bmN0aW9uIG0oZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHMgPSBlLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICBtID0gZS5kaXNhYmxlZCxcbiAgICAgICAgICB5ID0gZS5yZXF1aXJlZCxcbiAgICAgICAgICBiID0gZS5taW5EYXRlLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBpLkRFRkFVTFRfTUlOX0RBVEUgOiBiLFxuICAgICAgICAgIE8gPSBlLm1heERhdGUsXG4gICAgICAgICAgZyA9IGUucmFuZ2VEYXRlLFxuICAgICAgICAgIF8gPSBlLm9uQ2hhbmdlLFxuICAgICAgICAgIGggPSBlLm9uQmx1cixcbiAgICAgICAgICBqID0gZS5pMThuLFxuICAgICAgICAgIE0gPSB2b2lkIDAgPT09IGogPyBsLkVOX1VTIDogaixcbiAgICAgICAgICBOID0gcChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJkaXNhYmxlZFwiLCBcInJlcXVpcmVkXCIsIFwibWluRGF0ZVwiLCBcIm1heERhdGVcIiwgXCJyYW5nZURhdGVcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQmx1clwiLCBcImkxOG5cIl0pLFxuICAgICAgICAgIEUgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIFAgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIHcgPSAoMCwgbi51c2VTdGF0ZSkoXCJcIiksXG4gICAgICAgICAgSSA9IHdbMF0sXG4gICAgICAgICAgRCA9IHdbMV0sXG4gICAgICAgICAgUyA9ICgwLCBuLnVzZVN0YXRlKShcIlwiKSxcbiAgICAgICAgICB4ID0gU1swXSxcbiAgICAgICAgICBrID0gU1sxXSxcbiAgICAgICAgICBBID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBUID0gQVswXSxcbiAgICAgICAgICBMID0gQVsxXSxcbiAgICAgICAgICBDID0gKDAsIG4udXNlU3RhdGUpKHZvaWQgMCksXG4gICAgICAgICAgRiA9IENbMF0sXG4gICAgICAgICAgUiA9IENbMV0sXG4gICAgICAgICAgVSA9ICgwLCBuLnVzZVN0YXRlKSgwKSxcbiAgICAgICAgICBCID0gVVswXSxcbiAgICAgICAgICBXID0gVVsxXSxcbiAgICAgICAgICB6ID0gKDAsIG4udXNlU3RhdGUpKFtdKSxcbiAgICAgICAgICBZID0gelswXSxcbiAgICAgICAgICBWID0gelsxXSxcbiAgICAgICAgICBHID0gKDAsIG4udXNlU3RhdGUpKGQuTm9uZSksXG4gICAgICAgICAgSCA9IEdbMF0sXG4gICAgICAgICAgUSA9IEdbMV0sXG4gICAgICAgICAgSyA9ICgwLCBuLnVzZVN0YXRlKSh2b2lkIDApLFxuICAgICAgICAgIFogPSBLWzBdLFxuICAgICAgICAgIFggPSBLWzFdLFxuICAgICAgICAgIEogPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHYpLFxuICAgICAgICAgIHEgPSBPID8gKDAsIHUucGFyc2VEYXRlU3RyaW5nKShPKSA6IHZvaWQgMCxcbiAgICAgICAgICAkID0gZyA/ICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoZykgOiB2b2lkIDAsXG4gICAgICAgICAgZWUgPSBmdW5jdGlvbiBlZShlLCB0KSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSAhMCk7XG4gICAgICAgIHZhciBhID0gKDAsIHUucGFyc2VEYXRlU3RyaW5nKShlKSxcbiAgICAgICAgICAgIG4gPSBhICYmICgwLCB1LmZvcm1hdERhdGUpKGEsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCk7XG4gICAgICAgIGEgJiYgRChlKSwgbiAmJiBrKG4pLCBfICYmIF8obiksIHQgJiYgKEwoITEpLCBWKFtdKSwgbnVsbCA9PT0gKHIgPSBudWxsID09IFAgPyB2b2lkIDAgOiBQLmN1cnJlbnQpIHx8IHZvaWQgMCA9PT0gciB8fCByLmZvY3VzKCkpO1xuICAgICAgfTtcblxuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHMgJiYgZWUocywgITEpO1xuICAgICAgfSwgW10pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKFQpIHtcbiAgICAgICAgICB2YXIgZSA9IEUuY3VycmVudCAmJiBFLmN1cnJlbnQucXVlcnlTZWxlY3RvcihcIi51c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1mb2N1c2VkXCIpO1xuICAgICAgICAgIGUgJiYgZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCBbVF0pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZSxcbiAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgcixcbiAgICAgICAgICAgICAgYSxcbiAgICAgICAgICAgICAgbiA9ICgwLCB1LmlzRGF0ZUludmFsaWQpKHgsIEosIHEpO1xuICAgICAgICAgIG4gJiYgIShudWxsID09PSAoZSA9IG51bGwgPT0gUCA/IHZvaWQgMCA6IFAuY3VycmVudCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS52YWxpZGF0aW9uTWVzc2FnZSkgJiYgKG51bGwgPT09ICh0ID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5zZXRDdXN0b21WYWxpZGl0eShpLlZBTElEQVRJT05fTUVTU0FHRSkpLCBuIHx8IChudWxsID09PSAociA9IG51bGwgPT0gUCA/IHZvaWQgMCA6IFAuY3VycmVudCkgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci52YWxpZGF0aW9uTWVzc2FnZSkgIT09IGkuVkFMSURBVElPTl9NRVNTQUdFIHx8IG51bGwgPT09IChhID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IGEgfHwgYS5zZXRDdXN0b21WYWxpZGl0eShcIlwiKTtcbiAgICAgICAgfSgpO1xuICAgICAgfSwgW3gsIHYsIE9dKTtcbiAgICAgIHZhciB0ZSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWRhdGUtcGlja2VyXCIsIFwidXNhLWRhdGUtcGlja2VyLS1pbml0aWFsaXplZFwiLCB7XG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyLS1hY3RpdmVcIjogVFxuICAgICAgfSwgYSksXG4gICAgICAgICAgcmUgPSBNLnRvZ2dsZUNhbGVuZGFyO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcGlja2VyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdGUsXG4gICAgICAgIHJlZjogRSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIChudWxsID09PSAodCA9IEUuY3VycmVudCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5jb250YWlucyhudWxsID09IGUgPyB2b2lkIDAgOiBlLnJlbGF0ZWRUYXJnZXQpKSB8fCAoVCAmJiAoTCghMSksIFYoW10pKSwgaCAmJiBoKGUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIFwiRXNjYXBlXCIgPT09IGUua2V5ICYmIChUICYmIChMKCExKSwgVihbXSksIG51bGwgPT09ICh0ID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5mb2N1cygpKSwgZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgICAgfVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZih7fSwgTiwge1xuICAgICAgICBuYW1lOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZGF0ZS1waWNrZXItaW50ZXJuYWwtaW5wdXRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pbnB1dCB1c2Etc3Itb25seSB1c2EtZGF0ZS1waWNrZXJfX2ludGVybmFsLWlucHV0XCIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6ICEwLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIHJlcXVpcmVkOiAhMSxcbiAgICAgICAgZGlzYWJsZWQ6ICExLFxuICAgICAgICB2YWx1ZTogSSxcbiAgICAgICAgcmVhZE9ubHk6ICEwXG4gICAgICB9KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fd3JhcHBlclwiLFxuICAgICAgICB0YWJJbmRleDogLTFcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2Yoe30sIE4sIHtcbiAgICAgICAgaWQ6IHQsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1leHRlcm5hbC1pbnB1dFwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlucHV0IHVzYS1kYXRlLXBpY2tlcl9fZXh0ZXJuYWwtaW5wdXRcIixcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIGRpc2FibGVkOiBtLFxuICAgICAgICByZXF1aXJlZDogeSxcbiAgICAgICAgdmFsdWU6IHgsXG4gICAgICAgIHJlZjogUCxcbiAgICAgICAgb25JbnB1dDogZnVuY3Rpb24gb25JbnB1dChlKSB7XG4gICAgICAgICAgdmFyIHQgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICBrKHQpLCBfICYmIF8odCk7XG4gICAgICAgICAgdmFyIHIgPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHQsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCwgITApLFxuICAgICAgICAgICAgICBhID0gXCJcIjtcblxuICAgICAgICAgIGlmIChyICYmICEoMCwgdS5pc0RhdGVJbnZhbGlkKSh0LCBKLCBxKSAmJiAoYSA9ICgwLCB1LmZvcm1hdERhdGUpKHIpKSwgSSAhPT0gYSAmJiBEKGEpLCByICYmIFQpIHtcbiAgICAgICAgICAgIHZhciBuID0gKDAsIHUua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShyLCBKLCBxKTtcbiAgICAgICAgICAgIFIobik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgICAgIFEoZC5JbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKGUpIHtcbiAgICAgICAgICBRKGQuTm9uZSksIGggJiYgaChlKTtcbiAgICAgICAgfVxuICAgICAgfSkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1idXR0b25cIixcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fYnV0dG9uXCIsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiAhMCxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHJlLFxuICAgICAgICBkaXNhYmxlZDogbSxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICBpZiAoVCkgVihbXSk7ZWxzZSB7XG4gICAgICAgICAgICB2YXIgdCA9ICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoeCwgaS5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFULCAhMCksXG4gICAgICAgICAgICAgICAgciA9ICgwLCB1LmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCB8fCBzICYmICgwLCB1LnBhcnNlRGF0ZVN0cmluZykocykgfHwgKDAsIHUudG9kYXkpKCksIEosIHEpO1xuICAgICAgICAgICAgUihyKSwgVyhudWxsID09PSAoZSA9IG51bGwgPT0gRSA/IHZvaWQgMCA6IEUuY3VycmVudCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgdmFyIGEgPSBNLnN0YXR1c2VzLFxuICAgICAgICAgICAgICAgIG4gPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKEkpO1xuXG4gICAgICAgICAgICBpZiAobiAmJiAoMCwgdS5pc1NhbWVEYXkpKG4sICgwLCB1LmFkZERheXMpKHIsIDApKSkge1xuICAgICAgICAgICAgICB2YXIgbyA9IE0uc2VsZWN0ZWREYXRlO1xuICAgICAgICAgICAgICBhLnVuc2hpZnQobyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFYoYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEwoIVQpO1xuICAgICAgICB9XG4gICAgICB9LCBcIsKgXCIpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1jYWxlbmRhclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhclwiLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJ0cnVlXCIsXG4gICAgICAgIGhpZGRlbjogIVQsXG4gICAgICAgIFwiZGF0YS12YWx1ZVwiOiBGICYmICgwLCB1LmZvcm1hdERhdGUpKEYpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHRvcDogQiArIFwicHhcIlxuICAgICAgICB9LFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgWChlLmtleUNvZGUpO1xuICAgICAgICB9LFxuICAgICAgICBvbktleVVwOiBmdW5jdGlvbiBvbktleVVwKGUpIHtcbiAgICAgICAgICBlLmtleUNvZGUgIT09IFogJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9LCBUICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuQ2FsZW5kYXIsIHtcbiAgICAgICAgZGF0ZTogRixcbiAgICAgICAgaGFuZGxlU2VsZWN0RGF0ZTogZWUsXG4gICAgICAgIG1pbkRhdGU6IEosXG4gICAgICAgIG1heERhdGU6IHEsXG4gICAgICAgIHJhbmdlRGF0ZTogJCxcbiAgICAgICAgc2VsZWN0ZWREYXRlOiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKEkpLFxuICAgICAgICBzZXRTdGF0dXNlczogVixcbiAgICAgICAgZm9jdXNNb2RlOiBILFxuICAgICAgICBpMThuOiBNXG4gICAgICB9KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcGlja2VyLXN0YXR1c1wiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXNyLW9ubHkgdXNhLWRhdGUtcGlja2VyX19zdGF0dXNcIixcbiAgICAgICAgcm9sZTogXCJzdGF0dXNcIixcbiAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIlxuICAgICAgfSwgWS5qb2luKFwiLiBcIikpKSk7XG4gICAgfTtcblxuICAgIHQuRGF0ZVBpY2tlciA9IG0sIG0uZGlzcGxheU5hbWUgPSBcIkRhdGVQaWNrZXJcIiwgbS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICBtaW5EYXRlOiBpLkRFRkFVTFRfTUlOX0RBVEVcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5OYXZDbG9zZUJ1dHRvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gaShyKDcyKSk7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMyA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTmF2Q2xvc2VCdXR0b24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLm9uQ2xpY2ssXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGkgPSB1KGUsIFtcIm9uQ2xpY2tcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1uYXZfX2Nsb3NlXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9sMyh7XG4gICAgICAgIGNsYXNzTmFtZTogYyxcbiAgICAgICAgb25DbGljazogdCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5hdkNsb3NlQnV0dG9uXCJcbiAgICAgIH0sIGksIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgc3JjOiBvLmRlZmF1bHQsXG4gICAgICAgIGFsdDogXCJjbG9zZVwiXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQnV0dG9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDQgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0ID0gZS50eXBlLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGkgPSBlLnNlY29uZGFyeSxcbiAgICAgICAgICBjID0gZS5iYXNlLFxuICAgICAgICAgIHMgPSBlLmFjY2VudCxcbiAgICAgICAgICBkID0gZS5hY2NlbnRTdHlsZSxcbiAgICAgICAgICBmID0gZS5vdXRsaW5lLFxuICAgICAgICAgIHAgPSBlLmludmVyc2UsXG4gICAgICAgICAgbSA9IGUuc2l6ZSxcbiAgICAgICAgICB5ID0gZS5iaWcsXG4gICAgICAgICAgYiA9IGUuc21hbGwsXG4gICAgICAgICAgdiA9IGUuaWNvbixcbiAgICAgICAgICBPID0gZS51bnN0eWxlZCxcbiAgICAgICAgICBnID0gZS5vbkNsaWNrLFxuICAgICAgICAgIF8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBoID0gdShlLCBbXCJ0eXBlXCIsIFwiY2hpbGRyZW5cIiwgXCJzZWNvbmRhcnlcIiwgXCJiYXNlXCIsIFwiYWNjZW50XCIsIFwiYWNjZW50U3R5bGVcIiwgXCJvdXRsaW5lXCIsIFwiaW52ZXJzZVwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJzbWFsbFwiLCBcImljb25cIiwgXCJ1bnN0eWxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgICAgeSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiQnV0dG9uIHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemUuXCIpLCB2ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJCdXR0b24gcHJvcGVydHkgaWNvbiBpcyBkZXByZWNhdGVkLlwiKSwgcyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiQnV0dG9uIHByb3BlcnR5IGFjY2VudCBpcyBkZXByZWNhdGVkLiBVc2UgYWNjZW50U3R5bGUuXCIpO1xuICAgICAgdmFyIGogPSBtID8gXCJiaWdcIiA9PT0gbSA6IHksXG4gICAgICAgICAgTSA9IG0gPyBcInNtYWxsXCIgPT09IG0gOiBiO1xuICAgICAgTSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiU21hbGwgYnV0dG9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZGVmYXVsdCwgcGFzcyBpbiBhIGN1c3RvbSBjbGFzc05hbWUsIG9yIHVzZSBzaXplIGJpZy5cIik7XG4gICAgICB2YXIgTiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJ1dHRvblwiLCB7XG4gICAgICAgIFwidXNhLWJ1dHRvbi0tc2Vjb25kYXJ5XCI6IGksXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tYmFzZVwiOiBjLFxuICAgICAgICBcInVzYS1idXR0b24tLWFjY2VudC1jb29sXCI6IHMgfHwgXCJjb29sXCIgPT09IGQsXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tYWNjZW50LXdhcm1cIjogXCJ3YXJtXCIgPT09IGQsXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tb3V0bGluZVwiOiBmLFxuICAgICAgICBcInVzYS1idXR0b24tLWludmVyc2VcIjogcCxcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS1iaWdcIjogaixcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS1zbWFsbFwiOiBNLFxuICAgICAgICBcInVzYS1idXR0b24tLWljb25cIjogdixcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS11bnN0eWxlZFwiOiBPXG4gICAgICB9LCBfKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfbDQoe1xuICAgICAgICB0eXBlOiB0LFxuICAgICAgICBjbGFzc05hbWU6IE4sXG4gICAgICAgIG9uQ2xpY2s6IGcsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJidXR0b25cIlxuICAgICAgfSwgaCksIHIpO1xuICAgIH07XG5cbiAgICB0LkJ1dHRvbiA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmlzQ3VzdG9tUHJvcHMgPSBjLCB0LkdyaWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBpID0gZS5yb3csXG4gICAgICAgICAgZCA9IGUuY29sLFxuICAgICAgICAgIGYgPSBlLmdhcCxcbiAgICAgICAgICBwID0gZS5vZmZzZXQsXG4gICAgICAgICAgbSA9IGUubW9iaWxlLFxuICAgICAgICAgIHkgPSBlLm1vYmlsZUxnLFxuICAgICAgICAgIGIgPSBlLnRhYmxldCxcbiAgICAgICAgICB2ID0gZS50YWJsZXRMZyxcbiAgICAgICAgICBPID0gZS5kZXNrdG9wLFxuICAgICAgICAgIGcgPSBlLmRlc2t0b3BMZyxcbiAgICAgICAgICBfID0gZS53aWRlc2NyZWVuLFxuICAgICAgICAgIGggPSB1KGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwicm93XCIsIFwiY29sXCIsIFwiZ2FwXCIsIFwib2Zmc2V0XCIsIFwibW9iaWxlXCIsIFwibW9iaWxlTGdcIiwgXCJ0YWJsZXRcIiwgXCJ0YWJsZXRMZ1wiLCBcImRlc2t0b3BcIiwgXCJkZXNrdG9wTGdcIiwgXCJ3aWRlc2NyZWVuXCJdKSxcbiAgICAgICAgICBqID0ge1xuICAgICAgICBtb2JpbGU6IG0sXG4gICAgICAgIG1vYmlsZUxnOiB5LFxuICAgICAgICB0YWJsZXQ6IGIsXG4gICAgICAgIHRhYmxldExnOiB2LFxuICAgICAgICBkZXNrdG9wOiBPLFxuICAgICAgICBkZXNrdG9wTGc6IGcsXG4gICAgICAgIHdpZGVzY3JlZW46IF9cbiAgICAgIH0sXG4gICAgICAgICAgTSA9IHMoe1xuICAgICAgICByb3c6IGksXG4gICAgICAgIGNvbDogZCxcbiAgICAgICAgZ2FwOiBmLFxuICAgICAgICBvZmZzZXQ6IHBcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoby5icmVha3BvaW50cykuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgciA9IHQ7XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqLCByKSkge1xuICAgICAgICAgIHZhciBhID0gZVtyXTtcbiAgICAgICAgICBNID0gKDAsIG4uZGVmYXVsdCkoTSwgcyhhLCByKSk7XG4gICAgICAgIH1cbiAgICAgIH0pLCBNID0gKDAsIG4uZGVmYXVsdCkoTSwgciksIGMoaCkpIHtcbiAgICAgICAgdmFyIE4gPSBoLmFzQ3VzdG9tLFxuICAgICAgICAgICAgRSA9IHUoaCwgW1wiYXNDdXN0b21cIl0pO1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTiwgX2w1KHtcbiAgICAgICAgICBjbGFzc05hbWU6IE1cbiAgICAgICAgfSwgRSksIHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2w1KHtcbiAgICAgICAgY2xhc3NOYW1lOiBNLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZ3JpZFwiXG4gICAgICB9LCBoKSwgdCk7XG4gICAgfSwgdC5hcHBseUdyaWRDbGFzc2VzID0gdC5nZXRHcmlkQ2xhc3NlcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcig0Nik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sNSA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGMoZSkge1xuICAgICAgcmV0dXJuIFwiYXNDdXN0b21cIiBpbiBlO1xuICAgIH1cblxuICAgIHZhciBzID0gZnVuY3Rpb24gcyhlLCB0KSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHt9KTtcbiAgICAgIHZhciBhID0gdCA/IG8uYnJlYWtwb2ludHNbdF0gKyBcIjpcIiA6IFwiXCIsXG4gICAgICAgICAgaSA9IGUucm93LFxuICAgICAgICAgIGwgPSBlLmNvbCxcbiAgICAgICAgICB1ID0gZS5nYXAsXG4gICAgICAgICAgYyA9IGUub2Zmc2V0O1xuICAgICAgcmV0dXJuICgwLCBuLmRlZmF1bHQpKCgociA9IHt9KVthICsgXCJncmlkLXJvd1wiXSA9IGksIHJbYSArIFwiZ3JpZC1nYXBcIl0gPSAhMCA9PT0gdSwgclthICsgXCJncmlkLWdhcC1cIiArIHVdID0gITAgIT09IHUgJiYgISF1LCByW2EgKyBcImdyaWQtY29sXCJdID0gITAgPT09IGwsIHJbYSArIFwiZ3JpZC1jb2wtXCIgKyBsXSA9ICEwICE9PSBsICYmICEhbCwgclthICsgXCJncmlkLW9mZnNldC1cIiArIGNdID0gISFjLCByKSk7XG4gICAgfTtcblxuICAgIHQuZ2V0R3JpZENsYXNzZXMgPSBzO1xuXG4gICAgdC5hcHBseUdyaWRDbGFzc2VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gcyhlKTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvLmJyZWFrcG9pbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIHZhciBhID0gcjtcblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpKSB7XG4gICAgICAgICAgdmFyIG8gPSBlW2FdO1xuICAgICAgICAgIHQgPSAoMCwgbi5kZWZhdWx0KSh0LCBzKG8sIGEpKTtcbiAgICAgICAgfVxuICAgICAgfSksIHQ7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVGV4dGFyZWEgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGUuZXJyb3IsXG4gICAgICAgICAgYyA9IGUuc3VjY2VzcyxcbiAgICAgICAgICBzID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBkID0gZS5pbnB1dFJlZixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcInN1Y2Nlc3NcIiwgXCJjaGlsZHJlblwiLCBcImlucHV0UmVmXCJdKSxcbiAgICAgICAgICBwID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtdGV4dGFyZWFcIiwge1xuICAgICAgICBcInVzYS1pbnB1dC0tZXJyb3JcIjogdSxcbiAgICAgICAgXCJ1c2EtaW5wdXQtLXN1Y2Nlc3NcIjogY1xuICAgICAgfSwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfaTMoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidGV4dGFyZWFcIixcbiAgICAgICAgY2xhc3NOYW1lOiBwLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgcmVmOiBkXG4gICAgICB9LCBmKSwgcyk7XG4gICAgfTtcblxuICAgIHQuVGV4dGFyZWEgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb3JtID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuRm9ybSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUub25TdWJtaXQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhcmdlLFxuICAgICAgICAgIGMgPSBlLnNlYXJjaCxcbiAgICAgICAgICBzID0gbChlLCBbXCJvblN1Ym1pdFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwibGFyZ2VcIiwgXCJzZWFyY2hcIl0pLFxuICAgICAgICAgIGQgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWZvcm1cIjogIWMsXG4gICAgICAgIFwidXNhLWZvcm0tLWxhcmdlXCI6IHVcbiAgICAgIH0sIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiLCBfaTQoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9ybVwiLFxuICAgICAgICBjbGFzc05hbWU6IGQsXG4gICAgICAgIG9uU3VibWl0OiB0XG4gICAgICB9LCBzKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRm9vdGVyRXh0ZW5kZWROYXZMaXN0ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBsKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAobCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdC5Gb290ZXJFeHRlbmRlZE5hdkxpc3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5pc01vYmlsZSxcbiAgICAgICAgICBhID0gZS5uZXN0ZWRMaW5rcyxcbiAgICAgICAgICBpID0gKDAsIG8uZGVmYXVsdCkoXCJncmlkLXJvdyBncmlkLWdhcC00XCIsIHQpLFxuICAgICAgICAgIGwgPSB3aW5kb3cgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93LFxuICAgICAgICAgIGMgPSBuLmRlZmF1bHQudXNlU3RhdGUobCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDQ4MCksXG4gICAgICAgICAgcyA9IGNbMF0sXG4gICAgICAgICAgZCA9IGNbMV0sXG4gICAgICAgICAgZiA9ICgwLCBuLnVzZVN0YXRlKShBcnJheShhLmxlbmd0aCkuZmlsbCghMSkpLFxuICAgICAgICAgIHAgPSBmWzBdLFxuICAgICAgICAgIG0gPSBmWzFdLFxuICAgICAgICAgIHkgPSByIHx8IHZvaWQgMCA9PT0gciAmJiBzO1xuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghcikgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGUpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgICAgdmFyIGUgPSBsICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgNDgwO1xuICAgICAgICAgIGUgIT09IHMgJiYgZChlKTtcbiAgICAgICAgfVxuICAgICAgfSwgW10pO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpXG4gICAgICB9LCBhLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGtleTogXCJsaW5rU2VjdGlvbi1cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIm1vYmlsZS1sZzpncmlkLWNvbC02IGRlc2t0b3A6Z3JpZC1jb2wtM1wiXG4gICAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHUsIHtcbiAgICAgICAgICBvblRvZ2dsZTogeSA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlID0gdCwgdm9pZCBtKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHZhciByID0gQXJyYXkoYS5sZW5ndGgpLmZpbGwoITEpO1xuICAgICAgICAgICAgICByZXR1cm4gcltlXSA9ICF0W2VdLCByO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICB9IDogdm9pZCAwLFxuICAgICAgICAgIGlzT3BlbjogIXkgfHwgcFt0XSxcbiAgICAgICAgICBsaW5rczogZVxuICAgICAgICB9KSk7XG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHZhciB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaXNPcGVuLFxuICAgICAgICAgIHIgPSB2b2lkIDAgIT09IHQgJiYgdCxcbiAgICAgICAgICBhID0gZS5saW5rcyxcbiAgICAgICAgICBsID0gZS5vblRvZ2dsZSxcbiAgICAgICAgICB1ID0gYVswXSxcbiAgICAgICAgICBjID0gYS5zbGljZSgxKSxcbiAgICAgICAgICBzID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyX19wcmltYXJ5LWNvbnRlbnQgdXNhLWZvb3Rlcl9fcHJpbWFyeS1jb250ZW50LS1jb2xsYXBzaWJsZVwiLCB7XG4gICAgICAgIGhpZGRlbjogIXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgb25DbGljazogbCxcbiAgICAgICAgb25LZXlQcmVzczogbFxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoNFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZm9vdGVyX19wcmltYXJ5LWxpbmtcIlxuICAgICAgfSwgdSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICB0eXBlOiBcImZvb3RlclNlY29uZGFyeVwiLFxuICAgICAgICBpdGVtczogY1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbGVydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gYS5BbGVydDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQWNjb3JkaW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuLkFjY29yZGlvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiR292QmFubmVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBvLkdvdkJhbm5lcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnV0dG9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLkJ1dHRvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnV0dG9uR3JvdXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGwuQnV0dG9uR3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkxpbmtcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHUuTGluaztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGFibGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGMuVGFibGU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlRhZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gcy5UYWc7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlRvb2x0aXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGQuVG9vbHRpcDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU2lkZU5hdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZi5TaWRlTmF2O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBwLkNvbGxlY3Rpb247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25JdGVtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBtLkNvbGxlY3Rpb25JdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uSGVhZGluZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4geS5Db2xsZWN0aW9uSGVhZGluZztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbkRlc2NyaXB0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBiLkNvbGxlY3Rpb25EZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbk1ldGFcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHYuQ29sbGVjdGlvbk1ldGE7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25NZXRhSXRlbVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTy5Db2xsZWN0aW9uTWV0YUl0ZW07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25NZXRhSXRlbVRhZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZy5Db2xsZWN0aW9uTWV0YUl0ZW1UYWc7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25UaHVtYm5haWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIF8uQ29sbGVjdGlvblRodW1ibmFpbDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbkNhbGVuZGFyRGF0ZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaC5Db2xsZWN0aW9uQ2FsZW5kYXJEYXRlO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJHcmlkQ29udGFpbmVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBqLkdyaWRDb250YWluZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkdyaWRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE0uR3JpZDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2hhcmFjdGVyQ291bnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE4uQ2hhcmFjdGVyQ291bnQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNoZWNrYm94XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFLkNoZWNrYm94O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb21ib0JveFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gUC5Db21ib0JveDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZUlucHV0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB3LkRhdGVJbnB1dDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZUlucHV0R3JvdXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEkuRGF0ZUlucHV0R3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkRhdGVQaWNrZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEQuRGF0ZVBpY2tlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZVJhbmdlUGlja2VyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBTLkRhdGVSYW5nZVBpY2tlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRHJvcGRvd25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHguRHJvcGRvd247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkVycm9yTWVzc2FnZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gay5FcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZpZWxkc2V0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBBLkZpZWxkc2V0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGaWxlSW5wdXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFQuRmlsZUlucHV0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGb3JtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBMLkZvcm07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZvcm1Hcm91cFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gQy5Gb3JtR3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkxhYmVsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBGLkxhYmVsO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJSYWRpb1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gUi5SYWRpbztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUmFuZ2VJbnB1dFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVS5SYW5nZUlucHV0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUZXh0YXJlYVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gQi5UZXh0YXJlYTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGV4dElucHV0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBXLlRleHRJbnB1dDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGltZVBpY2tlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gei5UaW1lUGlja2VyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJWYWxpZGF0aW9uQ2hlY2tsaXN0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBZLlZhbGlkYXRpb25DaGVja2xpc3Q7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlZhbGlkYXRpb25JdGVtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWLlZhbGlkYXRpb25JdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJFeHRlbmRlZE5hdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRy5FeHRlbmRlZE5hdjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSGVhZGVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBILkhlYWRlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTWVnYU1lbnVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFEuTWVnYU1lbnU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk1lbnVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEsuTWVudTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTmF2Q2xvc2VCdXR0b25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFouTmF2Q2xvc2VCdXR0b247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk5hdkxpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFguTmF2TGlzdDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTmF2TWVudUJ1dHRvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gSi5OYXZNZW51QnV0dG9uO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJOYXZEcm9wRG93bkJ1dHRvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gcS5OYXZEcm9wRG93bkJ1dHRvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUHJpbWFyeU5hdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gJC5QcmltYXJ5TmF2O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUaXRsZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZWUuVGl0bGU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRlLklkZW50aWZpZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJHb3ZcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHJlLklkZW50aWZpZXJHb3Y7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJJZGVudGl0eVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gYWUuSWRlbnRpZmllcklkZW50aXR5O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTGlua1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbmUuSWRlbnRpZmllckxpbms7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJMaW5rSXRlbVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gb2UuSWRlbnRpZmllckxpbmtJdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTGlua3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGllLklkZW50aWZpZXJMaW5rcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllckxvZ29cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGxlLklkZW50aWZpZXJMb2dvO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTG9nb3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVlLklkZW50aWZpZXJMb2dvcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllck1hc3RoZWFkXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBjZS5JZGVudGlmaWVyTWFzdGhlYWQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkFkZHJlc3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHNlLkFkZHJlc3M7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZvb3RlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZGUuRm9vdGVyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGb290ZXJFeHRlbmRlZE5hdkxpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZlLkZvb3RlckV4dGVuZGVkTmF2TGlzdDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRm9vdGVyTmF2XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZS5Gb290ZXJOYXY7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkxvZ29cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG1lLkxvZ287XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlNvY2lhbExpbmtzXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB5ZS5Tb2NpYWxMaW5rcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2FyZEdyb3VwXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBiZS5DYXJkR3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHZlLkNhcmQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRIZWFkZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE9lLkNhcmRIZWFkZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRNZWRpYVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZ2UuQ2FyZE1lZGlhO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDYXJkQm9keVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gX2UuQ2FyZEJvZHk7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRGb290ZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGhlLkNhcmRGb290ZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkJyZWFkY3J1bWJCYXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGplLkJyZWFkY3J1bWJCYXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkJyZWFkY3J1bWJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE1lLkJyZWFkY3J1bWI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkJyZWFkY3J1bWJMaW5rXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBOZS5CcmVhZGNydW1iTGluaztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU3RlcEluZGljYXRvclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRWUuU3RlcEluZGljYXRvcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU3RlcEluZGljYXRvclN0ZXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFBlLlN0ZXBJbmRpY2F0b3JTdGVwO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJTZWFyY2hcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHdlLlNlYXJjaDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU3VtbWFyeUJveFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gSWUuU3VtbWFyeUJveDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUHJvY2Vzc0xpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlLlByb2Nlc3NMaXN0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJQcm9jZXNzTGlzdEl0ZW1cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFNlLlByb2Nlc3NMaXN0SXRlbTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUHJvY2Vzc0xpc3RIZWFkaW5nXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB4ZS5Qcm9jZXNzTGlzdEhlYWRpbmc7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlNpdGVBbGVydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4ga2UuU2l0ZUFsZXJ0O1xuICAgICAgfVxuICAgIH0pLCByKDIwKTtcblxuICAgIHZhciBhID0gcigyMSksXG4gICAgICAgIG4gPSByKDIzKSxcbiAgICAgICAgbyA9IHIoMjQpLFxuICAgICAgICBpID0gcigxNCksXG4gICAgICAgIGwgPSByKDI5KSxcbiAgICAgICAgdSA9IHIoMTApLFxuICAgICAgICBjID0gcigzMCksXG4gICAgICAgIHMgPSByKDMyKSxcbiAgICAgICAgZCA9IHIoMzMpLFxuICAgICAgICBmID0gcigzNSksXG4gICAgICAgIHAgPSByKDM2KSxcbiAgICAgICAgbSA9IHIoMzcpLFxuICAgICAgICB5ID0gcigzOCksXG4gICAgICAgIGIgPSByKDM5KSxcbiAgICAgICAgdiA9IHIoNDApLFxuICAgICAgICBPID0gcig0MSksXG4gICAgICAgIGcgPSByKDQyKSxcbiAgICAgICAgXyA9IHIoNDMpLFxuICAgICAgICBoID0gcig0NCksXG4gICAgICAgIGogPSByKDQ1KSxcbiAgICAgICAgTSA9IHIoMTUpLFxuICAgICAgICBOID0gcig0NyksXG4gICAgICAgIEUgPSByKDQ4KSxcbiAgICAgICAgUCA9IHIoMTEpLFxuICAgICAgICB3ID0gcig1MSksXG4gICAgICAgIEkgPSByKDUyKSxcbiAgICAgICAgRCA9IHIoMTIpLFxuICAgICAgICBTID0gcig1NyksXG4gICAgICAgIHggPSByKDU4KSxcbiAgICAgICAgayA9IHIoNTkpLFxuICAgICAgICBBID0gcig2MCksXG4gICAgICAgIFQgPSByKDYxKSxcbiAgICAgICAgTCA9IHIoMTcpLFxuICAgICAgICBDID0gcig4KSxcbiAgICAgICAgRiA9IHIoNSksXG4gICAgICAgIFIgPSByKDY0KSxcbiAgICAgICAgVSA9IHIoNjUpLFxuICAgICAgICBCID0gcigxNiksXG4gICAgICAgIFcgPSByKDcpLFxuICAgICAgICB6ID0gcig2NiksXG4gICAgICAgIFkgPSByKDY5KSxcbiAgICAgICAgViA9IHIoNzApLFxuICAgICAgICBHID0gcig3MSksXG4gICAgICAgIEggPSByKDczKSxcbiAgICAgICAgUSA9IHIoNzQpLFxuICAgICAgICBLID0gcig3NSksXG4gICAgICAgIFogPSByKDEzKSxcbiAgICAgICAgWCA9IHIoNCksXG4gICAgICAgIEogPSByKDc2KSxcbiAgICAgICAgcSA9IHIoNzcpLFxuICAgICAgICAkID0gcig3OCksXG4gICAgICAgIGVlID0gcig3OSksXG4gICAgICAgIHRlID0gcig4MCksXG4gICAgICAgIHJlID0gcig4MSksXG4gICAgICAgIGFlID0gcig4MiksXG4gICAgICAgIG5lID0gcig4MyksXG4gICAgICAgIG9lID0gcig4NCksXG4gICAgICAgIGllID0gcig4NSksXG4gICAgICAgIGxlID0gcig4NiksXG4gICAgICAgIHVlID0gcig4NyksXG4gICAgICAgIGNlID0gcig4OCksXG4gICAgICAgIHNlID0gcig4OSksXG4gICAgICAgIGRlID0gcig5MCksXG4gICAgICAgIGZlID0gcigxOCksXG4gICAgICAgIHBlID0gcig5MSksXG4gICAgICAgIG1lID0gcig5MiksXG4gICAgICAgIHllID0gcig5MyksXG4gICAgICAgIGJlID0gcig5NCksXG4gICAgICAgIHZlID0gcig5NSksXG4gICAgICAgIE9lID0gcig5NiksXG4gICAgICAgIGdlID0gcig5NyksXG4gICAgICAgIF9lID0gcig5OCksXG4gICAgICAgIGhlID0gcig5OSksXG4gICAgICAgIGplID0gcigxMDApLFxuICAgICAgICBNZSA9IHIoMTAxKSxcbiAgICAgICAgTmUgPSByKDEwMiksXG4gICAgICAgIEVlID0gcigxMDMpLFxuICAgICAgICBQZSA9IHIoMTA0KSxcbiAgICAgICAgd2UgPSByKDEwNSksXG4gICAgICAgIEllID0gcigxMDYpLFxuICAgICAgICBEZSA9IHIoMTA3KSxcbiAgICAgICAgU2UgPSByKDEwOCksXG4gICAgICAgIHhlID0gcigxMDkpLFxuICAgICAgICBrZSA9IHIoMTEwKTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQWxlcnQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IGkocigyMikpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDYgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0LFxuICAgICAgICAgIHIgPSBlLnR5cGUsXG4gICAgICAgICAgaSA9IGUuaGVhZGluZyxcbiAgICAgICAgICBjID0gZS5jdGEsXG4gICAgICAgICAgcyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgZCA9IGUuc2xpbSxcbiAgICAgICAgICBmID0gZS5ub0ljb24sXG4gICAgICAgICAgcCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG0gPSBlLnZhbGlkYXRpb24sXG4gICAgICAgICAgeSA9IHUoZSwgW1widHlwZVwiLCBcImhlYWRpbmdcIiwgXCJjdGFcIiwgXCJjaGlsZHJlblwiLCBcInNsaW1cIiwgXCJub0ljb25cIiwgXCJjbGFzc05hbWVcIiwgXCJ2YWxpZGF0aW9uXCJdKSxcbiAgICAgICAgICBiID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtYWxlcnRcIiwgKCh0ID0ge1xuICAgICAgICBcInVzYS1hbGVydC0tc3VjY2Vzc1wiOiBcInN1Y2Nlc3NcIiA9PT0gcixcbiAgICAgICAgXCJ1c2EtYWxlcnQtLXdhcm5pbmdcIjogXCJ3YXJuaW5nXCIgPT09IHIsXG4gICAgICAgIFwidXNhLWFsZXJ0LS1lcnJvclwiOiBcImVycm9yXCIgPT09IHIsXG4gICAgICAgIFwidXNhLWFsZXJ0LS1pbmZvXCI6IFwiaW5mb1wiID09PSByLFxuICAgICAgICBcInVzYS1hbGVydC0tc2xpbVwiOiBkLFxuICAgICAgICBcInVzYS1hbGVydC0tbm8taWNvblwiOiBmLFxuICAgICAgICBcInVzYS1hbGVydC0tdmFsaWRhdGlvblwiOiBtXG4gICAgICB9KVtvLmRlZmF1bHQuYWxlcnRXaXRoQ1RBXSA9ICEhYywgdCksIHApO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9sNih7XG4gICAgICAgIGNsYXNzTmFtZTogYixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImFsZXJ0XCJcbiAgICAgIH0sIHkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRfX2JvZHlcIlxuICAgICAgfSwgaSAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hbGVydF9faGVhZGluZ1wiXG4gICAgICB9LCBpKSwgcyAmJiAobSA/IHMgOiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWFsZXJ0X190ZXh0XCJcbiAgICAgIH0sIHMpKSksIGMgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgYykpO1xuICAgIH07XG5cbiAgICB0LkFsZXJ0ID0gYztcbiAgICB2YXIgcyA9IGM7XG4gICAgdC5kZWZhdWx0ID0gcztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0ge1xuICAgICAgYWxlcnRXaXRoQ1RBOiBcInNyYy1jb21wb25lbnRzLUFsZXJ0LUFsZXJ0LW1vZHVsZV9fYWxlcnRXaXRoQ1RBLS0xZnJqNVwiXG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQWNjb3JkaW9uID0gdC5BY2NvcmRpb25JdGVtID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBpKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBsID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGwgJiYgKGwuZ2V0IHx8IGwuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBsKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuIChpID0gZnVuY3Rpb24gaShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgX2w3ID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2w3ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICBmb3IgKHZhciByID0gMCwgYSA9IHQubGVuZ3RoLCBuID0gZS5sZW5ndGg7IHIgPCBhOyByKyssIG4rKykge1xuICAgICAgICBlW25dID0gdFtyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLnRpdGxlLFxuICAgICAgICAgIHIgPSBlLmlkLFxuICAgICAgICAgIGEgPSBlLmNvbnRlbnQsXG4gICAgICAgICAgaSA9IGUuZXhwYW5kZWQsXG4gICAgICAgICAgbCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmhhbmRsZVRvZ2dsZSxcbiAgICAgICAgICBjID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtYWNjb3JkaW9uX19oZWFkaW5nXCIsIGwpLFxuICAgICAgICAgIHMgPSAoMCwgby5kZWZhdWx0KShcInVzYS1hY2NvcmRpb25fX2NvbnRlbnRcIiwgXCJ1c2EtcHJvc2VcIiwgbCk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobi5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgyXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWNjb3JkaW9uX19idXR0b25cIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGksXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiYWNjb3JkaW9uQnV0dG9uX1wiICsgcixcbiAgICAgICAgb25DbGljazogdVxuICAgICAgfSwgdCkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGlkOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiYWNjb3JkaW9uSXRlbV9cIiArIHIsXG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgaGlkZGVuOiAhaVxuICAgICAgfSwgYSkpO1xuICAgIH07XG5cbiAgICB0LkFjY29yZGlvbkl0ZW0gPSBjO1xuXG4gICAgdmFyIHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHZhciB0ID0gZS5ib3JkZXJlZCxcbiAgICAgICAgICByID0gZS5pdGVtcyxcbiAgICAgICAgICBhID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgaSA9IGUubXVsdGlzZWxlY3RhYmxlLFxuICAgICAgICAgIHMgPSB2b2lkIDAgIT09IGkgJiYgaSxcbiAgICAgICAgICBkID0gKDAsIG4udXNlU3RhdGUpKHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiAhIWUuZXhwYW5kZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaWQ7XG4gICAgICB9KSksXG4gICAgICAgICAgZiA9IGRbMF0sXG4gICAgICAgICAgcCA9IGRbMV0sXG4gICAgICAgICAgbSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWFjY29yZGlvblwiLCB7XG4gICAgICAgIFwidXNhLWFjY29yZGlvbi0tYm9yZGVyZWRcIjogdFxuICAgICAgfSwgYSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IG0sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJhY2NvcmRpb25cIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBzIHx8IHZvaWQgMFxuICAgICAgfSwgci5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMsIF9sNyh7XG4gICAgICAgICAga2V5OiBcImFjY29yZGlvbkl0ZW1fXCIgKyB0XG4gICAgICAgIH0sIGUsIHtcbiAgICAgICAgICBleHBhbmRlZDogZi5pbmRleE9mKGUuaWQpID4gLTEsXG4gICAgICAgICAgaGFuZGxlVG9nZ2xlOiBmdW5jdGlvbiBoYW5kbGVUb2dnbGUoKSB7XG4gICAgICAgICAgICB2YXIgdCwgciwgYSwgbjtcbiAgICAgICAgICAgIHQgPSBlLmlkLCByID0gdShbXSwgZiksIGEgPSBmLmluZGV4T2YodCksIG4gPSBzLCBhID4gLTEgPyByLnNwbGljZShhLCAxKSA6IChuIHx8IHIuc3BsaWNlKDAsIHIubGVuZ3RoKSwgci5wdXNoKHQpKSwgcChyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdC5BY2NvcmRpb24gPSBzO1xuICAgIHZhciBkID0gcztcbiAgICB0LmRlZmF1bHQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Hb3ZCYW5uZXIgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IHModCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG4gPSBjKHIoMSkpLFxuICAgICAgICBvID0gYyhyKDI1KSksXG4gICAgICAgIGkgPSBjKHIoMjYpKSxcbiAgICAgICAgbCA9IGMocigyNykpLFxuICAgICAgICB1ID0gYyhyKDI4KSk7XG5cbiAgICBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAocyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9kID0gZnVuY3Rpb24gZCgpIHtcbiAgICAgIHJldHVybiAoX2QgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHAgPSBmdW5jdGlvbiBwKGUpIHtcbiAgICAgIHZhciB0ID0gZS50bGQsXG4gICAgICAgICAgciA9IHZvaWQgMCA9PT0gdCA/IFwiLmdvdlwiIDogdCxcbiAgICAgICAgICBjID0gZS5sYW5ndWFnZSxcbiAgICAgICAgICBzID0gdm9pZCAwID09PSBjID8gXCJlbmdsaXNoXCIgOiBjLFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gZihlLCBbXCJ0bGRcIiwgXCJsYW5ndWFnZVwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgeSA9ICgwLCBhLnVzZVN0YXRlKSghMSksXG4gICAgICAgICAgYiA9IHlbMF0sXG4gICAgICAgICAgdiA9IHlbMV0sXG4gICAgICAgICAgTyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJhbm5lclwiLCBwKSxcbiAgICAgICAgICBnID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJpY29uLWxvY2tcIlxuICAgICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgc3JjOiB1LmRlZmF1bHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2xvY2staW1hZ2VcIixcbiAgICAgICAgICBhbHQ6IFwibG9ja1wiLFxuICAgICAgICAgIHRpdGxlOiBcIkxvY2tcIixcbiAgICAgICAgICByb2xlOiBcImltZ1wiXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIFwiZW5nbGlzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGVhZGVyOiBcIkFuIG9mZmljaWFsIHdlYnNpdGUgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgZ292ZXJubWVudFwiLFxuICAgICAgICAgICAgICBoZWFkZXJBY3Rpb246IFwiSGVyZeKAmXMgaG93IHlvdSBrbm93XCIsXG4gICAgICAgICAgICAgIHRsZFNlY3Rpb25IZWFkZXI6IFwiT2ZmaWNpYWwgd2Vic2l0ZXMgdXNlIFwiICsgdCxcbiAgICAgICAgICAgICAgdGxkU2VjdGlvbkNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIuZ292XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiQSBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgXCIuZ292XCIpLCBcIiB3ZWJzaXRlIGJlbG9uZ3MgdG8gYW4gb2ZmaWNpYWwgZ292ZXJubWVudCBvcmdhbml6YXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMuXCIpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFwiLm1pbFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIkEgXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIG51bGwsIFwiLm1pbFwiKSwgXCIgd2Vic2l0ZSBiZWxvbmdzIHRvIGFuIG9mZmljaWFsIFUuUy4gRGVwYXJ0bWVudCBvZiBEZWZlbnNlIG9yZ2FuaXphdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KCksXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkhlYWRlcjogXCJTZWN1cmUgXCIgKyB0ICsgXCIgd2Vic2l0ZXMgdXNlIEhUVFBTXCIsXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkNvbnRlbnQ6IGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGEuZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgXCJBIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImxvY2sgKFwiLCByLCBcIilcIiksIFwiIG9yIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImh0dHBzOi8vXCIpLCBcIiBtZWFucyB5b3XigJl2ZSBzYWZlbHkgY29ubmVjdGVkIHRvIHRoZSBcIiwgdCwgXCIgd2Vic2l0ZS4gU2hhcmUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIG9ubHkgb24gb2ZmaWNpYWwsIHNlY3VyZSB3ZWJzaXRlcy5cIilcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIFwic3BhbmlzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGVhZGVyOiBcIlVuIHNpdGlvIG9maWNpYWwgZGVsIEdvYmllcm5vIGRlIEVzdGFkb3MgVW5pZG9zXCIsXG4gICAgICAgICAgICAgIGhlYWRlckFjdGlvbjogXCJBc8OtIGVzIGNvbW8gdXN0ZWQgcHVlZGUgdmVyaWZpY2FybG9cIixcbiAgICAgICAgICAgICAgdGxkU2VjdGlvbkhlYWRlcjogXCJMb3Mgc2l0aW9zIHdlYiBvZmljaWFsZXMgdXNhbiBcIiArIHQsXG4gICAgICAgICAgICAgIHRsZFNlY3Rpb25Db250ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiLmdvdlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIlVuIHNpdGlvIHdlYiBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgXCIuZ292XCIpLCBcIiBwZXJ0ZW5lY2UgYSB1bmEgb3JnYW5pemFjacOzbiBvZmljaWFsIGRlbCBHb2JpZXJubyBkZSBFc3RhZG9zIFVuaWRvcy5cIik7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIubWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiVW4gc2l0aW8gd2ViIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcIi5taWxcIiksIFwiIHBlcnRlbmVjZSBhIHVuYSBvcmdhbml6YWNpw7NuIG9maWNpYWwgZGVsIERlcGFydGFtZW50byBkZSBEZWZlbnNhIGRlIEVFLiBVVS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KCksXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkhlYWRlcjogXCJMb3Mgc2l0aW9zIHdlYiBzZWd1cm9zIFwiICsgdCArIFwiIHVzYW4gSFRUUFNcIixcbiAgICAgICAgICAgICAgaHR0cHNTZWN0aW9uQ29udGVudDogYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIlVuIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImNhbmRhZG8gKFwiLCByLCBcIilcIiksIFwiIG8gXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIG51bGwsIFwiaHR0cHM6Ly9cIiksIFwiIFwiLCBcInNpZ25pZmljYSBxdWUgdXN0ZWQgc2UgY29uZWN0w7MgZGUgZm9ybWEgc2VndXJhIGEgdW4gc2l0aW8gd2ViIFwiLCB0LCBcIi4gQ29tcGFydGEgaW5mb3JtYWNpw7NuIHNlbnNpYmxlIHPDs2xvIGVuIHNpdGlvcyB3ZWIgb2ZpY2lhbGVzIHkgc2VndXJvcy5cIilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0ocywgcik7XG5cbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2Qoe1xuICAgICAgICBjbGFzc05hbWU6IE8sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJnb3ZCYW5uZXJcIlxuICAgICAgfSwgbSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faGVhZGVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2lubmVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtY29sLWF1dG9cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faGVhZGVyLWZsYWdcIixcbiAgICAgICAgc3JjOiBvLmRlZmF1bHQsXG4gICAgICAgIGFsdDogXCJVLlMuIGZsYWdcIlxuICAgICAgfSkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLWNvbC1maWxsIHRhYmxldDpncmlkLWNvbC1hdXRvXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19oZWFkZXItdGV4dFwiXG4gICAgICB9LCBnLmhlYWRlciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19oZWFkZXItYWN0aW9uXCIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgICAgIH0sIGcuaGVhZGVyQWN0aW9uKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25fX2J1dHRvbiB1c2EtYmFubmVyX19idXR0b25cIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGIsXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiBcImdvdi1iYW5uZXJcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gIWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19idXR0b24tdGV4dFwiXG4gICAgICB9LCBnLmhlYWRlckFjdGlvbikpKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2NvbnRlbnQgdXNhLWFjY29yZGlvbl9fY29udGVudFwiLFxuICAgICAgICBpZDogXCJnb3YtYmFubmVyXCIsXG4gICAgICAgIGhpZGRlbjogIWJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtcm93IGdyaWQtZ2FwLWxnXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2d1aWRhbmNlIHRhYmxldDpncmlkLWNvbC02XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2ljb24gdXNhLW1lZGlhLWJsb2NrX19pbWdcIixcbiAgICAgICAgc3JjOiBpLmRlZmF1bHQsXG4gICAgICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1tZWRpYS1ibG9ja19fYm9keVwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBcIiwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgZy50bGRTZWN0aW9uSGVhZGVyKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJiclwiLCBudWxsKSwgZy50bGRTZWN0aW9uQ29udGVudCkpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9fZ3VpZGFuY2UgdGFibGV0OmdyaWQtY29sLTZcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faWNvbiB1c2EtbWVkaWEtYmxvY2tfX2ltZ1wiLFxuICAgICAgICBzcmM6IGwuZGVmYXVsdCxcbiAgICAgICAgcm9sZTogXCJpbWdcIixcbiAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW1lZGlhLWJsb2NrX19ib2R5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBnLmh0dHBzU2VjdGlvbkhlYWRlciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnJcIiwgbnVsbCksIGcuaHR0cHNTZWN0aW9uQ29udGVudCkpKSkpKSk7XG4gICAgfTtcblxuICAgIHQuR292QmFubmVyID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQUxDQU1BQUFCQlBQMExBQUFBRzFCTVZFVWRNN0VlTkxJZU03SGdRQ0RhUGgvYlBoL2JQeC8vLy8vYlB5QkVieTQxQUFBQVVFbEVRVlFJMTIzTU53NENBQkRFd0QzakMvOS9NUTFCUXJnZU9Ta0lxWWUybzJGWnR0aFhnUUxnYkhWTVpkbHNmVVFGUW5IdGpQMSs4QlVoQkRLT3F0bWZvdDZvanFQelI3VGpkVStmNnZrRUQrSURQaFRCY01BQUFBQUFTVVZPUks1Q1lJST1cIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlWVlJHTFRnaVB6NDhjM1puSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZDJsa2RHZzlJalkwSWlCb1pXbG5hSFE5SWpZMElpQjJhV1YzUW05NFBTSXdJREFnTmpRZ05qUWlQangwYVhSc1pUNXBZMjl1TFdSdmRDMW5iM1k4TDNScGRHeGxQanh3WVhSb0lHWnBiR3c5SWlNeU16YzRRek1pSUdacGJHd3RjblZzWlQwaVpYWmxibTlrWkNJZ1pEMGlUVE15SURCak1UY3VOamN6SURBZ016SWdNVFF1TXpJM0lETXlJRE15SURBZ01UY3VOamN6TFRFMExqTXlOeUF6TWkwek1pQXpNa014TkM0ek1qY2dOalFnTUNBME9TNDJOek1nTUNBek1pQXdJREUwTGpNeU55QXhOQzR6TWpjZ01DQXpNaUF3ZW0wd0lERXVNakE0UXpFMExqazVOQ0F4TGpJd09DQXhMakl3T0NBeE5DNDVPVFFnTVM0eU1EZ2dNekpUTVRRdU9UazBJRFl5TGpjNU1pQXpNaUEyTWk0M09USWdOakl1TnpreUlEUTVMakF3TmlBMk1pNDNPVElnTXpJZ05Ea3VNREEySURFdU1qQTRJRE15SURFdU1qQTRlbTB4TUM0MU9TQXpPQzQ0TlRoaExqZzFOeTQ0TlRjZ01DQXdJREVnTGpnNE1pNDRNakoyTVM0Mk5ESklNVGd1T0RnMmRpMHhMalkwTW1FdU9EVTNMamcxTnlBd0lEQWdNU0F1T0RneUxTNDRNakpJTkRJdU5UbDZUVEkxTGpRME15QXlOeTQzTnpSMk9TNDRNamxvTVM0Mk5ESjJMVGt1T0ROb015NHlOek4yT1M0NE0wZ3pNbll0T1M0NE0yZ3pMakkzTW5ZNUxqZ3phREV1TmpRemRpMDVMamd6YURNdU1qY3lkamt1T0ROb0xqYzJZUzQ0TlRjdU9EVTNJREFnTUNBeElDNDRPREl1T0RJeGRpNDRNakZvTFRJeExqTjJMUzQ0TURsaExqZzFOeTQ0TlRjZ01DQXdJREVnTGpnNExTNDRNbWd1TnpZeWRpMDVMamcwTW1nekxqSTNNbnB0TlM0M016WXRPQzR4T0Roc01USXVNamt6SURRdU9URTFkakV1TmpReWFDMHhMall6WVM0NE5UY3VPRFUzSURBZ01DQXhMUzQ0T0RJdU9ESXlTREl4TGpReFlTNDROVGN1T0RVM0lEQWdNQ0F4TFM0NE9ESXRMamd5TW1ndE1TNDJOREoyTFRFdU5qUXliREV5TGpJNU15MDBMamt4TlhvaUx6NDhMM04yWno0PVwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgci5yKHQpLCB0LmRlZmF1bHQgPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpUHo0OGMzWm5JSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkMmxrZEdnOUlqWTBJaUJvWldsbmFIUTlJalkwSWlCMmFXVjNRbTk0UFNJd0lEQWdOalFnTmpRaVBqeDBhWFJzWlQ1cFkyOXVMV2gwZEhCelBDOTBhWFJzWlQ0OGNHRjBhQ0JtYVd4c1BTSWpOekU1UmpKQklpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWswek1pQXdZekUzTGpZM015QXdJRE15SURFMExqTXlOeUF6TWlBek1pQXdJREUzTGpZM015MHhOQzR6TWpjZ016SXRNeklnTXpKRE1UUXVNekkzSURZMElEQWdORGt1TmpjeklEQWdNeklnTUNBeE5DNHpNamNnTVRRdU16STNJREFnTXpJZ01IcHRNQ0F4TGpJd09FTXhOQzQ1T1RRZ01TNHlNRGdnTVM0eU1EZ2dNVFF1T1RrMElERXVNakE0SURNeVV6RTBMams1TkNBMk1pNDNPVElnTXpJZ05qSXVOemt5SURZeUxqYzVNaUEwT1M0d01EWWdOakl1TnpreUlETXlJRFE1TGpBd05pQXhMakl3T0NBek1pQXhMakl3T0hwdE1DQXhPQzQ0T0RaaE55NHlORFVnTnk0eU5EVWdNQ0F3SURFZ055NHlORFVnTnk0eU5EVjJNeTR4TUROb0xqVXlZeTQ0TmlBd0lERXVOVFUzTGpZNU9DQXhMalUxTnlBeExqVTFPSFk1TGpNeU1tTXdJQzQ0TmkwdU5qazNJREV1TlRVNExURXVOVFUzSURFdU5UVTRhQzB4TlM0MU0yTXRMamcySURBdE1TNDFOVGN0TGpZNU55MHhMalUxTnkweExqVTFPRll6TW1Nd0xTNDROaTQyT1RjdE1TNDFOVGdnTVM0MU5UY3RNUzQxTlRob0xqVXlWakkzTGpNMFFUY3VNalExSURjdU1qUTFJREFnTUNBeElETXlJREl3TGpBNU5IcHRNQ0F6TGpFd00yRTBMakUwTWlBMExqRTBNaUF3SURBZ01DMDBMakUwTWlBMExqRTBNbll6TGpFd00yZzRMakk0TkZZeU55NHpORUUwTGpFME1pQTBMakUwTWlBd0lEQWdNQ0F6TWlBeU15NHhPVGQ2SWk4K1BDOXpkbWMrXCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICByLnIodCksIHQuZGVmYXVsdCA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejQ4YzNabklIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2QybGtkR2c5SWpVeUlpQm9aV2xuYUhROUlqWTBJaUIyYVdWM1FtOTRQU0l3SURBZ05USWdOalFpUGp4MGFYUnNaVDVzYjJOclBDOTBhWFJzWlQ0OGNHRjBhQ0JtYVd4c1BTSWpNVUl4UWpGQ0lpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWsweU5pQXdZekV3TGpRNU15QXdJREU1SURndU5UQTNJREU1SURFNWRqbG9NMkUwSURRZ01DQXdJREVnTkNBMGRqSTRZVFFnTkNBd0lEQWdNUzAwSURSSU5HRTBJRFFnTUNBd0lERXROQzAwVmpNeVlUUWdOQ0F3SURBZ01TQTBMVFJvTTNZdE9VTTNJRGd1TlRBM0lERTFMalV3TnlBd0lESTJJREI2YlRBZ09HTXROUzQ1TnprZ01DMHhNQzQ0TkRNZ05DNDNOeTB4TUM0NU9UWWdNVEF1TnpFeVRERTFJREU1ZGpsb01qSjJMVGxqTUMwMkxqQTNOUzAwTGpreU5TMHhNUzB4TVMweE1Yb2lMejQ4TDNOMlp6ND1cIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQnV0dG9uR3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLnR5cGUsXG4gICAgICAgICAgdSA9IHZvaWQgMCA9PT0gbyA/IFwiZGVmYXVsdFwiIDogbyxcbiAgICAgICAgICBjID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInR5cGVcIl0pLFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1idXR0b24tZ3JvdXBcIiwge1xuICAgICAgICBcInVzYS1idXR0b24tZ3JvdXAtLXNlZ21lbnRlZFwiOiBcInNlZ21lbnRlZFwiID09IHVcbiAgICAgIH0sIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2k1KHtcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCBjKSwgYS5kZWZhdWx0LkNoaWxkcmVuLm1hcChyLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1idXR0b24tZ3JvdXBfX2l0ZW1cIlxuICAgICAgICB9LCBlKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdC5CdXR0b25Hcm91cCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlRhYmxlID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSBpKHIoMzEpKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgdmFyIHQsXG4gICAgICAgICAgciA9IGUuYm9yZGVyZWQsXG4gICAgICAgICAgaSA9IGUuY2FwdGlvbixcbiAgICAgICAgICBsID0gZS5jaGlsZHJlbixcbiAgICAgICAgICB1ID0gZS5mdWxsV2lkdGgsXG4gICAgICAgICAgYyA9IGUuZml4ZWQsXG4gICAgICAgICAgcyA9IGUuc2Nyb2xsYWJsZSxcbiAgICAgICAgICBkID0gZS5zdHJpcGVkLFxuICAgICAgICAgIGYgPSBlLmNvbXBhY3QsXG4gICAgICAgICAgcCA9IGUuc3RhY2tlZFN0eWxlLFxuICAgICAgICAgIG0gPSB2b2lkIDAgPT09IHAgPyBcIm5vbmVcIiA6IHAsXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXRhYmxlXCIsICgodCA9IHtcbiAgICAgICAgXCJ1c2EtdGFibGUtLWJvcmRlcmxlc3NcIjogIXJcbiAgICAgIH0pW1wiXCIgKyBvLmRlZmF1bHQuZnVsbHdpZHRoXSA9IHUsIHRbXCJcIiArIG8uZGVmYXVsdC5maXhlZF0gPSBjLCB0W1widXNhLXRhYmxlLS1zdHJpcGVkXCJdID0gZCwgdFtcInVzYS10YWJsZS0tY29tcGFjdFwiXSA9IGYsIHRbXCJ1c2EtdGFibGUtLXN0YWNrZWRcIl0gPSBcImRlZmF1bHRcIiA9PT0gbSwgdFtcInVzYS10YWJsZS0tc3RhY2tlZC1oZWFkZXJcIl0gPSBcImhlYWRlcnNcIiA9PT0gbSwgdCkpO1xuICAgICAgZiAmJiBcIm5vbmVcIiAhPT0gbSAmJiBjb25zb2xlLndhcm4oXCJVU1dEUyBzdGF0ZXMgdGhhdCBjb21wYWN0IHN0eWxpbmcgaXMgbm90IHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBzdGFja2VkIHZhcmlhbnRzLiBTZWUgVVNXRFMgVGFibGUgY29tcG9uZW50LCBUYWJsZSB2YXJpYW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9kZXNpZ25zeXN0ZW0uZGlnaXRhbC5nb3YvY29tcG9uZW50cy90YWJsZVwiKTtcbiAgICAgIHZhciBiID0gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogeSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRhYmxlXCJcbiAgICAgIH0sIGkgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJjYXB0aW9uXCIsIG51bGwsIGkpLCBsKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIHMgPyBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzY3JvbGxhYmxlLXRhYmxlLWNvbnRhaW5lclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXRhYmxlLWNvbnRhaW5lci0tc2Nyb2xsYWJsZVwiXG4gICAgICB9LCBiKSA6IGIpO1xuICAgIH07XG5cbiAgICB0LlRhYmxlID0gbDtcbiAgICB2YXIgdSA9IGw7XG4gICAgdC5kZWZhdWx0ID0gdTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0ge1xuICAgICAgZnVsbHdpZHRoOiBcInNyYy1jb21wb25lbnRzLVRhYmxlLVRhYmxlLW1vZHVsZV9fZnVsbHdpZHRoLS0zLUszdFwiLFxuICAgICAgZml4ZWQ6IFwic3JjLWNvbXBvbmVudHMtVGFibGUtVGFibGUtbW9kdWxlX19maXhlZC0tMkF3Y3lcIlxuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlRhZyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTYgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImJhY2tncm91bmRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSB7fTtcbiAgICAgIHIgJiYgKGMuYmFja2dyb3VuZCA9IHIpO1xuICAgICAgdmFyIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS10YWdcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9pNih7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJ0YWdcIixcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBzdHlsZTogX2k2KHt9LCBjKVxuICAgICAgfSwgdSksIHQpO1xuICAgIH07XG5cbiAgICB0LlRhZyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmlzQ3VzdG9tUHJvcHMgPSBzLCB0LlRvb2x0aXAgPSBkO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBsKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDM0KTtcblxuICAgIGZ1bmN0aW9uIGwoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGwgPSBmdW5jdGlvbiBsKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICByZXR1cm4gKF91ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICByZXR1cm4gXCJhc0N1c3RvbVwiIGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZChlKSB7XG4gICAgICB2YXIgdCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgciA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikoXCJ0b29sdGlwLVwiICsgKE1hdGguZmxvb3IoOWU1ICogTWF0aC5yYW5kb20oKSkgKyAxZTUpKSxcbiAgICAgICAgICBsID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBkID0gbFswXSxcbiAgICAgICAgICBmID0gbFsxXSxcbiAgICAgICAgICBwID0gZnVuY3Rpb24gcChhLCBvKSB7XG4gICAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBuID0gbztcblxuICAgICAgICAgIGlmIChhLmN1cnJlbnQgJiYgci5jdXJyZW50ICYmIHQuY3VycmVudCkge1xuICAgICAgICAgICAgdmFyIGwgPSBhLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgdSA9IHIuY3VycmVudCxcbiAgICAgICAgICAgICAgICBjID0gdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIHMgPSBsLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGQgPSBsLm9mZnNldEhlaWdodCxcbiAgICAgICAgICAgICAgICBmID0gTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGwpLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tdG9wXCIpLCAxMCksXG4gICAgICAgICAgICAgICAgcCA9IE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsKS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLWJvdHRvbVwiKSwgMTApLFxuICAgICAgICAgICAgICAgIG0gPSBOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYykuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpLCAxMCksXG4gICAgICAgICAgICAgICAgeSA9IE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjKS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1ib3R0b21cIiksIDEwKSxcbiAgICAgICAgICAgICAgICBiID0gTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKSxcbiAgICAgICAgICAgICAgICB2ID0gbC5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgICAgIE8gPSB1Lm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGcgPSBzIC8gMiArIHYsXG4gICAgICAgICAgICAgICAgXyA9IHMgKyA1ICsgMixcbiAgICAgICAgICAgICAgICBoID0gZCArIDUgKyAyLFxuICAgICAgICAgICAgICAgIGogPSBmdW5jdGlvbiBqKGUpIHtcbiAgICAgICAgICAgICAgdS5jbGFzc0xpc3QucmVtb3ZlKFwidXNhLXRvb2x0aXBfX2JvZHktLVwiICsgbiksIG4gPSBlLCB1LmNsYXNzTGlzdC5hZGQoXCJ1c2EtdG9vbHRpcF9fYm9keS0tXCIgKyBlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChlLndyYXBwZXJjbGFzc2VzKSBlLndyYXBwZXJjbGFzc2VzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjLmNsYXNzTGlzdC5hZGQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSkgZS5jbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGwuY2xhc3NMaXN0LmFkZChlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgTSA9IGZ1bmN0aW9uIE0oZSkge1xuICAgICAgICAgICAgICBqKFwidG9wXCIpLCBlLnN0eWxlLm1hcmdpbkxlZnQgPSBnICsgXCJweFwiLCAoMCwgaS5pc0VsZW1lbnRJblZpZXdwb3J0KShlKSB8fCBlLmNsYXNzTGlzdC5hZGQoXCJ1c2EtdG9vbHRpcF9fYm9keS0td3JhcFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBoICsgcCArIHkgKyBcInB4XCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE4gPSBmdW5jdGlvbiBOKGUpIHtcbiAgICAgICAgICAgICAgaihcImJvdHRvbVwiKSwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gZyArIFwicHhcIiwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkoZSkgfHwgZS5jbGFzc0xpc3QuYWRkKFwidXNhLXRvb2x0aXBfX2JvZHktLXdyYXBcIiksIGUuc3R5bGUubWFyZ2luVG9wID0gaCArIGYgKyBtICsgXCJweFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBFID0gZnVuY3Rpb24gRShlKSB7XG4gICAgICAgICAgICAgIGooXCJyaWdodFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjBcIiwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gXyArIHYgKyBcInB4XCIsIGUuc3R5bGUuYm90dG9tID0gKGQgLSBiKSAvIDIgKyBwICsgeSArIFwicHhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgUCA9IGZ1bmN0aW9uIFAoZSkge1xuICAgICAgICAgICAgICBqKFwibGVmdFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjBcIiwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gdiA+IE8gPyB2IC0gTyAtIDcgKyBcInB4XCIgOiBcIi1cIiArIChPIC0gdiArIDcpICsgXCJweFwiLCBlLnN0eWxlLmJvdHRvbSA9IChkIC0gYikgLyAyICsgcCArIHkgKyBcInB4XCI7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG8pIHtcbiAgICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgICAgIE0odSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE4odSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgICAgIE4odSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgRSh1KSwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkodSkgfHwgKFAodSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgUCh1KSwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkodSkgfHwgKEUodSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgW2RdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChzKGUpKSB7XG4gICAgICAgIHZhciBtID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICAgIHkgPSBlLmxhYmVsLFxuICAgICAgICAgICAgYiA9IGUucG9zaXRpb24sXG4gICAgICAgICAgICB2ID0gZS5hc0N1c3RvbSxcbiAgICAgICAgICAgIE8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgICAgZyA9IE4gPSBjKGUsIFtcImxhYmVsXCIsIFwicG9zaXRpb25cIiwgXCJhc0N1c3RvbVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICAgIF8gPSAoMCwgby5kZWZhdWx0KShcInVzYS10b29sdGlwX19ib2R5XCIsIHtcbiAgICAgICAgICBcImlzLXNldFwiOiBkLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXRvcFwiOiBcInRvcFwiID09PSBiLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLWJvdHRvbVwiOiBcImJvdHRvbVwiID09PSBiLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXJpZ2h0XCI6IFwicmlnaHRcIiA9PT0gYixcbiAgICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1sZWZ0XCI6IFwibGVmdFwiID09PSBiLFxuICAgICAgICAgIFwiaXMtdmlzaWJsZVwiOiBkXG4gICAgICAgIH0pLFxuICAgICAgICAgICAgaCA9IGZ1bmN0aW9uIGgoKSB7XG4gICAgICAgICAgZighMCk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICBqID0gZnVuY3Rpb24gaigpIHtcbiAgICAgICAgICBmKCExKTtcbiAgICAgICAgfTtcblxuICAgICAgICBwKG0sIGIpO1xuICAgICAgICB2YXIgTSA9ICgwLCBuLmNyZWF0ZUVsZW1lbnQpKHYsIF91KHtcbiAgICAgICAgICByZWY6IG0sXG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRyaWdnZXJFbGVtZW50XCIsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uIG9uTW91c2VPdmVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIGgoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZyksIE8pO1xuICAgICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcFdyYXBwZXJcIixcbiAgICAgICAgICByZWY6IHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS10b29sdGlwXCIsXG4gICAgICAgICAgcm9sZTogXCJ0b29sdGlwXCJcbiAgICAgICAgfSwgTSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcEJvZHlcIixcbiAgICAgICAgICB0aXRsZTogeSxcbiAgICAgICAgICBpZDogYS5jdXJyZW50LFxuICAgICAgICAgIHJlZjogcixcbiAgICAgICAgICBjbGFzc05hbWU6IF9cbiAgICAgICAgfSwgeSkpO1xuICAgICAgfVxuXG4gICAgICBtID0gKDAsIG4udXNlUmVmKShudWxsKSwgeSA9IGUubGFiZWwsIGIgPSBlLnBvc2l0aW9uLCBPID0gZS5jaGlsZHJlbjtcblxuICAgICAgdmFyIE4gPSBjKGUsIFtcImxhYmVsXCIsIFwicG9zaXRpb25cIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgRSA9IChfID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtdG9vbHRpcF9fYm9keVwiLCB7XG4gICAgICAgIFwiaXMtc2V0XCI6IGQsXG4gICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXRvcFwiOiBcInRvcFwiID09PSBiLFxuICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1ib3R0b21cIjogXCJib3R0b21cIiA9PT0gYixcbiAgICAgICAgXCJ1c2EtdG9vbHRpcF9fYm9keS0tcmlnaHRcIjogXCJyaWdodFwiID09PSBiLFxuICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1sZWZ0XCI6IFwibGVmdFwiID09PSBiLFxuICAgICAgICBcImlzLXZpc2libGVcIjogZFxuICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZighMCk7XG4gICAgICB9KSxcbiAgICAgICAgICBQID0gZnVuY3Rpb24gUCgpIHtcbiAgICAgICAgZighMSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcChtLCBiKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRvb2x0aXBXcmFwcGVyXCIsXG4gICAgICAgIHJlZjogdCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS10b29sdGlwXCIsXG4gICAgICAgIHJvbGU6IFwidG9vbHRpcFwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfdSh7fSwgTiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidHJpZ2dlckVsZW1lbnRcIixcbiAgICAgICAgcmVmOiBtLFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogYS5jdXJyZW50LFxuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJ1dHRvbiB1c2EtdG9vbHRpcF9fdHJpZ2dlclwiLFxuICAgICAgICB0aXRsZTogeSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBFLFxuICAgICAgICBvbk1vdXNlT3ZlcjogRSxcbiAgICAgICAgb25Gb2N1czogRSxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBQLFxuICAgICAgICBvbkJsdXI6IFAsXG4gICAgICAgIG9uS2V5RG93bjogUFxuICAgICAgfSksIE8pLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcEJvZHlcIixcbiAgICAgICAgdGl0bGU6IHksXG4gICAgICAgIGlkOiBhLmN1cnJlbnQsXG4gICAgICAgIHJlZjogcixcbiAgICAgICAgY2xhc3NOYW1lOiBfXG4gICAgICB9LCB5KSk7XG4gICAgfVxuXG4gICAgZC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIlxuICAgIH0sIGQuRGlzcGxheU5hbWUgPSBcIlRvb2x0aXBcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNFbGVtZW50SW5WaWV3cG9ydCA9IHZvaWQgMDtcblxuICAgIHQuaXNFbGVtZW50SW5WaWV3cG9ydCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSB3aW5kb3cpLCB2b2lkIDAgPT09IHIgJiYgKHIgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgdmFyIGEgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIGEudG9wID49IDAgJiYgYS5sZWZ0ID49IDAgJiYgYS5ib3R0b20gPD0gKHQuaW5uZXJIZWlnaHQgfHwgci5jbGllbnRIZWlnaHQpICYmIGEucmlnaHQgPD0gKHQuaW5uZXJXaWR0aCB8fCByLmNsaWVudFdpZHRoKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5TaWRlTmF2ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5TaWRlTmF2ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pdGVtcyxcbiAgICAgICAgICByID0gZS5pc1N1Ym5hdixcbiAgICAgICAgICBvID0gdm9pZCAwICE9PSByICYmIHIsXG4gICAgICAgICAgaSA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2Etc2lkZW5hdlwiOiAhbyxcbiAgICAgICAgXCJ1c2Etc2lkZW5hdl9fc3VibGlzdFwiOiBvXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwic2lkZW5hdlwiXG4gICAgICB9LCB0Lm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAga2V5OiBcInNpZGVuYXZfaXRlbV9cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zaWRlbmF2X19pdGVtXCJcbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTcgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gZS5jb25kZW5zZWQsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb25kZW5zZWRcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uXCIsIHtcbiAgICAgICAgXCJ1c2EtY29sbGVjdGlvbi0tY29uZGVuc2VkXCI6IG9cbiAgICAgIH0sIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2k3KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29sbGVjdGlvblwiXG4gICAgICB9LCB1KSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbkl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k4ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uSXRlbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLnZhcmlhbnRDb21wb25lbnQsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJ2YXJpYW50Q29tcG9uZW50XCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY29sbGVjdGlvbl9faXRlbVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pOCh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIG8sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xsZWN0aW9uX19ib2R5XCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Db2xsZWN0aW9uSGVhZGluZyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTkgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25IZWFkaW5nID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5oZWFkaW5nTGV2ZWwsXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImhlYWRpbmdMZXZlbFwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICBjID0gdCB8fCBcImgzXCIsXG4gICAgICAgICAgcyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2hlYWRpbmdcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYywgX2k5KHtcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCB1KSwgbyk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbkRlc2NyaXB0aW9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTEwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2Rlc2NyaXB0aW9uXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCBfaTEwKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbk1ldGEgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxMSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25NZXRhID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uX19tZXRhXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2kxMSh7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHIpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25NZXRhSXRlbSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTEyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuQ29sbGVjdGlvbk1ldGFJdGVtID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uX19tZXRhLWl0ZW1cIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTEyKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbk1ldGFJdGVtVGFnID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTEzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uTWV0YUl0ZW1UYWcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gZS50YWdTdHlsZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInRhZ1N0eWxlXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY29sbGVjdGlvbl9fbWV0YS1pdGVtXCIsIFwidXNhLXRhZ1wiLCB7XG4gICAgICAgIFwidXNhLXRhZy0tbmV3XCI6IFwibmV3XCIgPT09IG9cbiAgICAgIH0sIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2kxMyh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIHIpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25UaHVtYm5haWwgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25UaHVtYm5haWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5zcmMsXG4gICAgICAgICAgbyA9IGUuYWx0LFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcInNyY1wiLCBcImFsdFwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2ltZ1wiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCBfaTE0KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjLFxuICAgICAgICBzcmM6IHIsXG4gICAgICAgIGFsdDogb1xuICAgICAgfSwgdSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25DYWxlbmRhckRhdGUgPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfTtcbiAgICB2YXIgbyA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcblxuICAgIHQuQ29sbGVjdGlvbkNhbGVuZGFyRGF0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuZGF0ZXRpbWUsXG4gICAgICAgICAgciA9IG5ldyBEYXRlKHQpO1xuICAgICAgcmV0dXJuIHIgJiYgci5nZXRUaW1lICYmIGlzTmFOKHIuZ2V0VGltZSgpKSA/IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uZGVmYXVsdC5GcmFnbWVudCwgbnVsbCkgOiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29sbGVjdGlvbl9fY2FsZW5kYXItZGF0ZVwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29sbGVjdGlvbi1jYWxlbmRhci1kYXRlXCJcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGltZVwiLCB7XG4gICAgICAgIGRhdGVUaW1lOiB0XG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbGxlY3Rpb25fX2NhbGVuZGFyLWRhdGUtbW9udGhcIlxuICAgICAgfSwgb1tyLmdldE1vbnRoKCldKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xsZWN0aW9uX19jYWxlbmRhci1kYXRlLWRheVwiXG4gICAgICB9LCByLmdldERhdGUoKSkpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5pc0N1c3RvbVByb3BzID0gdSwgdC5HcmlkQ29udGFpbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICh1KGUpKSB7XG4gICAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgICByID0gZS5jb250YWluZXJTaXplLFxuICAgICAgICAgICAgbiA9IGUuYXNDdXN0b20sXG4gICAgICAgICAgICBvID0gZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHMgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcImNvbnRhaW5lclNpemVcIiwgXCJhc0N1c3RvbVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICAgIGQgPSBjKHQsIHIpO1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobiwgX2kxNSh7XG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImdyaWRDb250YWluZXJcIixcbiAgICAgICAgICBjbGFzc05hbWU6IGRcbiAgICAgICAgfSwgcyksIG8pO1xuICAgICAgfVxuXG4gICAgICB0ID0gZS5jbGFzc05hbWUsIHIgPSBlLmNvbnRhaW5lclNpemUsIG8gPSBlLmNoaWxkcmVuLCBzID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjb250YWluZXJTaXplXCIsIFwiY2hpbGRyZW5cIl0pLCBkID0gYyh0LCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTE1KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImdyaWRDb250YWluZXJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICB9LCBzKSwgbyk7XG4gICAgfTtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgcmV0dXJuIFwiYXNDdXN0b21cIiBpbiBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGMoZSwgdCkge1xuICAgICAgdmFyIHI7XG4gICAgICByZXR1cm4gKDAsIG4uZGVmYXVsdCkoKChyID0ge1xuICAgICAgICBcImdyaWQtY29udGFpbmVyXCI6ICF0XG4gICAgICB9KVtcImdyaWQtY29udGFpbmVyLVwiICsgdF0gPSAhIXQsIHIpLCBlKTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmJyZWFrcG9pbnRzID0gdm9pZCAwO1xuICAgIHQuYnJlYWtwb2ludHMgPSB7XG4gICAgICBtb2JpbGU6IFwibW9iaWxlXCIsXG4gICAgICBtb2JpbGVMZzogXCJtb2JpbGUtbGdcIixcbiAgICAgIHRhYmxldDogXCJ0YWJsZXRcIixcbiAgICAgIHRhYmxldExnOiBcInRhYmxldC1sZ1wiLFxuICAgICAgZGVza3RvcDogXCJkZXNrdG9wXCIsXG4gICAgICBkZXNrdG9wTGc6IFwiZGVza3RvcC1sZ1wiLFxuICAgICAgd2lkZXNjcmVlbjogXCJ3aWRlc2NyZWVuXCJcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DaGFyYWN0ZXJDb3VudCA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig3KSxcbiAgICAgICAgbCA9IHIoMTYpO1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAodSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9jID0gZnVuY3Rpb24gYygpIHtcbiAgICAgIHJldHVybiAoX2MgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpLmxlbmd0aDtcbiAgICB9LFxuICAgICAgICBmID0gZnVuY3Rpb24gZihlLCB0KSB7XG4gICAgICB2YXIgciA9IHQgKyBcIiBjaGFyYWN0ZXJzIGFsbG93ZWRcIixcbiAgICAgICAgICBhID0gdCAtIGU7XG5cbiAgICAgIHN3aXRjaCAoYSkge1xuICAgICAgICBjYXNlIHQ6XG4gICAgICAgICAgcmV0dXJuIHI7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBcIiQwIGNoYXJhY3RlciBsZWZ0XCIucmVwbGFjZShcIiQwXCIsIFwiMVwiKTtcblxuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIHJldHVybiBcIiQwIGNoYXJhY3RlciBvdmVyIGxpbWl0XCIucmVwbGFjZShcIiQwXCIsIFwiMVwiKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBhID49IDAgPyBcIiQwIGNoYXJhY3RlcnMgbGVmdFwiLnJlcGxhY2UoXCIkMFwiLCBhLnRvU3RyaW5nKCkpIDogXCIkMCBjaGFyYWN0ZXJzIG92ZXIgbGltaXRcIi5yZXBsYWNlKFwiJDBcIiwgTWF0aC5hYnMoYSkudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgcCA9IGZ1bmN0aW9uIHAoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLm1heExlbmd0aCxcbiAgICAgICAgICBwID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgbSA9IHZvaWQgMCA9PT0gcCA/IFwiXCIgOiBwLFxuICAgICAgICAgIHkgPSBlLmlzVGV4dEFyZWEsXG4gICAgICAgICAgYiA9IHZvaWQgMCAhPT0geSAmJiB5LFxuICAgICAgICAgIHYgPSBlLmdldENoYXJhY3RlckNvdW50LFxuICAgICAgICAgIE8gPSB2b2lkIDAgPT09IHYgPyBkIDogdixcbiAgICAgICAgICBnID0gZS5nZXRNZXNzYWdlLFxuICAgICAgICAgIF8gPSB2b2lkIDAgPT09IGcgPyBmIDogZyxcbiAgICAgICAgICBoID0gcyhlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJtYXhMZW5ndGhcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJpc1RleHRBcmVhXCIsIFwiZ2V0Q2hhcmFjdGVyQ291bnRcIiwgXCJnZXRNZXNzYWdlXCJdKSxcbiAgICAgICAgICBqID0gTyhtKSxcbiAgICAgICAgICBNID0gKDAsIG4udXNlU3RhdGUpKGopLFxuICAgICAgICAgIE4gPSBNWzBdLFxuICAgICAgICAgIEUgPSBNWzFdLFxuICAgICAgICAgIFAgPSAoMCwgbi51c2VTdGF0ZSkoXyhqLCB1KSksXG4gICAgICAgICAgdyA9IFBbMF0sXG4gICAgICAgICAgSSA9IFBbMV0sXG4gICAgICAgICAgRCA9ICgwLCBuLnVzZVN0YXRlKShqIDwgdSksXG4gICAgICAgICAgUyA9IERbMF0sXG4gICAgICAgICAgeCA9IERbMV0sXG4gICAgICAgICAgayA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWNoYXJhY3Rlci1jb3VudF9fZmllbGRcIiwgYSksXG4gICAgICAgICAgQSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWhpbnRcIiwgXCJ1c2EtY2hhcmFjdGVyLWNvdW50X19tZXNzYWdlXCIsIHtcbiAgICAgICAgXCJ1c2EtY2hhcmFjdGVyLWNvdW50X19tZXNzYWdlLS1pbnZhbGlkXCI6ICFTXG4gICAgICB9KTtcblxuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIEkoXyhOLCB1KSksIHgoTiA8PSB1KTtcbiAgICAgIH0sIFtOXSk7XG5cbiAgICAgIHZhciBULFxuICAgICAgICAgIEwgPSBmdW5jdGlvbiBMKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBTID8gXCJcIiA6IFwiVGhlIGNvbnRlbnQgaXMgdG9vIGxvbmcuXCI7XG4gICAgICAgIGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KHIpLCB0ICYmIHQoZSk7XG4gICAgICB9LFxuICAgICAgICAgIEMgPSBmdW5jdGlvbiBDKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgRShPKHZvaWQgMCA9PT0gciA/IFwiXCIgOiByKSksIHQgJiYgdChlKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChiKSB7XG4gICAgICAgIHZhciBGID0gaCxcbiAgICAgICAgICAgIFIgPSBGLm9uQmx1cixcbiAgICAgICAgICAgIFUgPSBGLm9uQ2hhbmdlLFxuICAgICAgICAgICAgQiA9IEYuaW5wdXRSZWYsXG4gICAgICAgICAgICBXID0gcyhGLCBbXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVwiLCBcImlucHV0UmVmXCJdKTtcbiAgICAgICAgVCA9IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuVGV4dGFyZWEsIF9jKHtcbiAgICAgICAgICBpZDogdCxcbiAgICAgICAgICBuYW1lOiByLFxuICAgICAgICAgIGNsYXNzTmFtZTogayxcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IG0sXG4gICAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgICAgcmV0dXJuIEwoZSwgUik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgICAgcmV0dXJuIEMoZSwgVSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnB1dFJlZjogQlxuICAgICAgICB9LCBXKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgeiA9IGgsXG4gICAgICAgICAgICBZID0gei5vbkJsdXIsXG4gICAgICAgICAgICBWID0gei5vbkNoYW5nZSxcbiAgICAgICAgICAgIEcgPSAoQiA9IHouaW5wdXRSZWYsIHoudHlwZSksXG4gICAgICAgICAgICBIID0gdm9pZCAwID09PSBHID8gXCJ0ZXh0XCIgOiBHLFxuICAgICAgICAgICAgUSA9IHMoeiwgW1wib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJpbnB1dFJlZlwiLCBcInR5cGVcIl0pO1xuICAgICAgICBUID0gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5UZXh0SW5wdXQsIF9jKHtcbiAgICAgICAgICBpZDogdCxcbiAgICAgICAgICB0eXBlOiBILFxuICAgICAgICAgIG5hbWU6IHIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBrLFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbSxcbiAgICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uIG9uQmx1cihlKSB7XG4gICAgICAgICAgICByZXR1cm4gTChlLCBZKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgICAgICByZXR1cm4gQyhlLCBWKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlucHV0UmVmOiBCXG4gICAgICAgIH0sIFEpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgVCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNoYXJhY3RlckNvdW50TWVzc2FnZVwiLFxuICAgICAgICBpZDogdCArIFwiLWluZm9cIixcbiAgICAgICAgY2xhc3NOYW1lOiBBLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiXG4gICAgICB9LCB3KSk7XG4gICAgfTtcblxuICAgIHQuQ2hhcmFjdGVyQ291bnQgPSBwO1xuICAgIHZhciBtID0gcDtcbiAgICB0LmRlZmF1bHQgPSBtO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DaGVja2JveCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE2ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhYmVsLFxuICAgICAgICAgIGMgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIHMgPSBlLnRpbGUsXG4gICAgICAgICAgZCA9IGUubGFiZWxEZXNjcmlwdGlvbixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJsYWJlbFwiLCBcImlucHV0UmVmXCIsIFwidGlsZVwiLCBcImxhYmVsRGVzY3JpcHRpb25cIl0pLFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jaGVja2JveFwiLCBvKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2hlY2tib3hfX2lucHV0XCIsIHtcbiAgICAgICAgXCJ1c2EtY2hlY2tib3hfX2lucHV0LS10aWxlXCI6IHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNoZWNrYm94XCIsXG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfaTE2KHtcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICByZWY6IGNcbiAgICAgIH0sIGYpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY2hlY2tib3hfX2xhYmVsXCIsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIHUsIGQgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jaGVja2JveF9fbGFiZWwtZGVzY3JpcHRpb25cIlxuICAgICAgfSwgZCkpKTtcbiAgICB9O1xuXG4gICAgdC5DaGVja2JveCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LnVzZUNvbWJvQm94ID0gdC5BY3Rpb25UeXBlcyA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gcigwKSxcbiAgICAgICAgbyA9IHIoMTEpLFxuICAgICAgICBpID0gcig1MCksXG4gICAgICAgIF9sOCA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHQuQWN0aW9uVHlwZXMgPSBhLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZVtlLlNFTEVDVF9PUFRJT04gPSAwXSA9IFwiU0VMRUNUX09QVElPTlwiLCBlW2UuQ0xFQVIgPSAxXSA9IFwiQ0xFQVJcIiwgZVtlLk9QRU5fTElTVCA9IDJdID0gXCJPUEVOX0xJU1RcIiwgZVtlLkNMT1NFX0xJU1QgPSAzXSA9IFwiQ0xPU0VfTElTVFwiLCBlW2UuRk9DVVNfT1BUSU9OID0gNF0gPSBcIkZPQ1VTX09QVElPTlwiLCBlW2UuVVBEQVRFX0ZJTFRFUiA9IDVdID0gXCJVUERBVEVfRklMVEVSXCIsIGVbZS5CTFVSID0gNl0gPSBcIkJMVVJcIiwgZVtlLkNMRUFSX1NFTEVDVElPTiA9IDddID0gXCJDTEVBUl9TRUxFQ1RJT05cIjtcbiAgICB9KGEgfHwgKHQuQWN0aW9uVHlwZXMgPSBhID0ge30pKTtcblxuICAgIHQudXNlQ29tYm9Cb3ggPSBmdW5jdGlvbiAoZSwgdCwgciwgdSkge1xuICAgICAgcmV0dXJuICgwLCBuLnVzZVJlZHVjZXIpKGZ1bmN0aW9uIChlLCBuKSB7XG4gICAgICAgIHN3aXRjaCAobi50eXBlKSB7XG4gICAgICAgICAgY2FzZSBhLlNFTEVDVF9PUFRJT046XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb246IG4ub3B0aW9uLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLklucHV0LFxuICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBuLm9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiBuLm9wdGlvblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIGEuVVBEQVRFX0ZJTFRFUjpcbiAgICAgICAgICAgIHZhciBjID0gKHAgPSBuLnZhbHVlLCBtID0gKDAsIGkuZ2VuZXJhdGVEeW5hbWljUmVnRXhwKSh1LmZpbHRlciwgcCwgdS5leHRyYXMpLCB5ID0gdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG0udGVzdChlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSksIHIgPyB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RNYXRjaDogeS5sZW5ndGggPiAwID8geVswXSA6IHRbMF0sXG4gICAgICAgICAgICAgIG9wdGlvbnNUb0Rpc3BsYXk6IHRcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RNYXRjaDogeVswXSxcbiAgICAgICAgICAgICAgb3B0aW9uc1RvRGlzcGxheTogeVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcyA9IGMuY2xvc2VzdE1hdGNoLFxuICAgICAgICAgICAgICAgIGQgPSBjLm9wdGlvbnNUb0Rpc3BsYXksXG4gICAgICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITAsXG4gICAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9uczogZCxcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZTogbi52YWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByIHx8ICFlLnNlbGVjdGVkT3B0aW9uID8gZi5mb2N1c2VkT3B0aW9uID0gcyA6IGUuc2VsZWN0ZWRPcHRpb24gJiYgKGYuZmlsdGVyZWRPcHRpb25zLmluY2x1ZGVzKGUuc2VsZWN0ZWRPcHRpb24pID8gZi5mb2N1c2VkT3B0aW9uID0gZS5zZWxlY3RlZE9wdGlvbiA6IGYuZm9jdXNlZE9wdGlvbiA9IHMpLCBmO1xuXG4gICAgICAgICAgY2FzZSBhLk9QRU5fTElTVDpcbiAgICAgICAgICAgIHJldHVybiBfbDgoX2w4KHt9LCBlKSwge1xuICAgICAgICAgICAgICBpc09wZW46ICEwLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLklucHV0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiBlLnNlbGVjdGVkT3B0aW9uIHx8IGUuZm9jdXNlZE9wdGlvbiB8fCB0WzBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgYS5DTE9TRV9MSVNUOlxuICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuSW5wdXQsXG4gICAgICAgICAgICAgIGZvY3VzZWRPcHRpb246IHZvaWQgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIChmLmZpbHRlcmVkT3B0aW9ucyA9IHQsIGYuaW5wdXRWYWx1ZSA9IFwiXCIpLCBlLnNlbGVjdGVkT3B0aW9uICYmIChmLmlucHV0VmFsdWUgPSBlLnNlbGVjdGVkT3B0aW9uLmxhYmVsKSwgZjtcblxuICAgICAgICAgIGNhc2UgYS5GT0NVU19PUFRJT046XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMCxcbiAgICAgICAgICAgICAgZm9jdXNlZE9wdGlvbjogbi5vcHRpb24sXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuSXRlbVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIGEuQ0xFQVI6XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZTogXCJcIixcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgICAgICAgZm9jdXNNb2RlOiBvLkZvY3VzTW9kZS5JbnB1dCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb246IHZvaWQgMCxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiB0WzBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgYS5CTFVSOlxuICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuTm9uZSxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlLnNlbGVjdGVkT3B0aW9uID8gKGYuaW5wdXRWYWx1ZSA9IGUuc2VsZWN0ZWRPcHRpb24ubGFiZWwsIGYuZm9jdXNlZE9wdGlvbiA9IGUuc2VsZWN0ZWRPcHRpb24pIDogKGYuaW5wdXRWYWx1ZSA9IFwiXCIsIGYuZm9jdXNlZE9wdGlvbiA9IHRbMF0pLCBmO1xuXG4gICAgICAgICAgY2FzZSBhLkNMRUFSX1NFTEVDVElPTjpcbiAgICAgICAgICAgIHJldHVybiBfbDgoX2w4KHt9LCBlKSwge1xuICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICBpc09wZW46ICExLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLk5vbmUsXG4gICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9uczogdCxcbiAgICAgICAgICAgICAgZm9jdXNlZE9wdGlvbjogdm9pZCAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwLCBtLCB5O1xuICAgICAgfSwgZSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZ2VuZXJhdGVEeW5hbWljUmVnRXhwID0gdm9pZCAwO1xuXG4gICAgdC5nZW5lcmF0ZUR5bmFtaWNSZWdFeHAgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gXCJcIiksIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KTtcblxuICAgICAgdmFyIGEgPSBmdW5jdGlvbiBhKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xuICAgICAgfSxcbiAgICAgICAgICBuID0gZS5yZXBsYWNlKC97eyguKj8pfX0vZywgZnVuY3Rpb24gKGUsIG4pIHtcbiAgICAgICAgdmFyIG8gPSBuLnRyaW0oKSxcbiAgICAgICAgICAgIGkgPSByW29dO1xuXG4gICAgICAgIGlmIChcInF1ZXJ5XCIgIT09IG8gJiYgaSkge1xuICAgICAgICAgIHZhciBsID0gbmV3IFJlZ0V4cChpLCBcImlcIiksXG4gICAgICAgICAgICAgIHUgPSB0Lm1hdGNoKGwpO1xuICAgICAgICAgIHJldHVybiB1ID8gYSh1WzFdKSA6IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYSh0KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbiA9IFwiXig/OlwiICsgbiArIFwiKSRcIiwgbmV3IFJlZ0V4cChuLCBcImlcIik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuRGF0ZUlucHV0ID0gdm9pZCAwO1xuICAgIHZhciBhID0gdShyKDApKSxcbiAgICAgICAgbiA9IHUocigxKSksXG4gICAgICAgIG8gPSByKDcpLFxuICAgICAgICBpID0gcig1KSxcbiAgICAgICAgbCA9IHIoOCk7XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9jMiA9IGZ1bmN0aW9uIGMoKSB7XG4gICAgICByZXR1cm4gKF9jMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHMoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgZCA9IGZ1bmN0aW9uIGQoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgdSA9IGUubGFiZWwsXG4gICAgICAgICAgZCA9IGUudW5pdCxcbiAgICAgICAgICBmID0gZS5tYXhMZW5ndGgsXG4gICAgICAgICAgcCA9IGUubWluTGVuZ3RoLFxuICAgICAgICAgIG0gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB5ID0gcyhlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJsYWJlbFwiLCBcInVuaXRcIiwgXCJtYXhMZW5ndGhcIiwgXCJtaW5MZW5ndGhcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGIgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWZvcm0tZ3JvdXAtLW1vbnRoXCI6IFwibW9udGhcIiA9PSBkLFxuICAgICAgICBcInVzYS1mb3JtLWdyb3VwLS1kYXlcIjogXCJkYXlcIiA9PSBkLFxuICAgICAgICBcInVzYS1mb3JtLWdyb3VwLS15ZWFyXCI6IFwieWVhclwiID09IGRcbiAgICAgIH0pLFxuICAgICAgICAgIHYgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pbnB1dC0taW5saW5lXCIsIG0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuRm9ybUdyb3VwLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5MYWJlbCwge1xuICAgICAgICBodG1sRm9yOiB0XG4gICAgICB9LCB1KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5UZXh0SW5wdXQsIF9jMih7fSwgeSwge1xuICAgICAgICBjbGFzc05hbWU6IHYsXG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgbWF4TGVuZ3RoOiBmLFxuICAgICAgICBtaW5MZW5ndGg6IHAsXG4gICAgICAgIHBhdHRlcm46IFwiWzAtOV0qXCIsXG4gICAgICAgIGlucHV0TW9kZTogXCJudW1lcmljXCJcbiAgICAgIH0pKSk7XG4gICAgfTtcblxuICAgIHQuRGF0ZUlucHV0ID0gZDtcbiAgICB2YXIgZiA9IGQ7XG4gICAgdC5kZWZhdWx0ID0gZjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuRGF0ZUlucHV0R3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxNyA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1tZW1vcmFibGUtZGF0ZVwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTE3KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlSW5wdXRHcm91cFwiXG4gICAgICB9KSwgdCk7XG4gICAgfTtcblxuICAgIHQuRGF0ZUlucHV0R3JvdXAgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5DYWxlbmRhciA9IHZvaWQgMDtcblxuICAgIHZhciBhID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gcyh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbiA9IHIoMyksXG4gICAgICAgIG8gPSByKDU0KSxcbiAgICAgICAgaSA9IHIoNTUpLFxuICAgICAgICBsID0gcig1NiksXG4gICAgICAgIHUgPSByKDEyKSxcbiAgICAgICAgYyA9IHIoOSk7XG5cbiAgICBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuIChzID0gZnVuY3Rpb24gcyhlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgZCA9IFwiREFURV9QSUNLRVJcIixcbiAgICAgICAgZiA9IFwiTU9OVEhfUElDS0VSXCIsXG4gICAgICAgIHAgPSBcIllFQVJfUElDS0VSXCIsXG4gICAgICAgIG0gPSBmdW5jdGlvbiBtKGUpIHtcbiAgICAgIHZhciB0ID0gZS5kYXRlLFxuICAgICAgICAgIHIgPSBlLnNlbGVjdGVkRGF0ZSxcbiAgICAgICAgICBzID0gZS5oYW5kbGVTZWxlY3REYXRlLFxuICAgICAgICAgIG0gPSBlLm1pbkRhdGUsXG4gICAgICAgICAgeSA9IGUubWF4RGF0ZSxcbiAgICAgICAgICBiID0gZS5yYW5nZURhdGUsXG4gICAgICAgICAgdiA9IGUuc2V0U3RhdHVzZXMsXG4gICAgICAgICAgTyA9IGUuZm9jdXNNb2RlLFxuICAgICAgICAgIGcgPSBlLmkxOG4sXG4gICAgICAgICAgXyA9IHZvaWQgMCA9PT0gZyA/IGMuRU5fVVMgOiBnLFxuICAgICAgICAgIGggPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIGogPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIE0gPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIE4gPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEUgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIFAgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIHcgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEkgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEQgPSAoMCwgYS51c2VTdGF0ZSkodCB8fCAoMCwgbi50b2RheSkoKSksXG4gICAgICAgICAgUyA9IERbMF0sXG4gICAgICAgICAgeCA9IERbMV0sXG4gICAgICAgICAgayA9ICgwLCBhLnVzZVN0YXRlKShkKSxcbiAgICAgICAgICBBID0ga1swXSxcbiAgICAgICAgICBUID0ga1sxXSxcbiAgICAgICAgICBMID0gKDAsIGEudXNlU3RhdGUpKFtudWxsLCBudWxsXSksXG4gICAgICAgICAgQyA9IExbMF0sXG4gICAgICAgICAgRiA9IExbMV0sXG4gICAgICAgICAgUiA9ICEwLFxuICAgICAgICAgIFUgPSAoMCwgbi5hZGREYXlzKShTLCAwKSxcbiAgICAgICAgICBCID0gUy5nZXRNb250aCgpLFxuICAgICAgICAgIFcgPSBTLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgeiA9IF8ubW9udGhzW3BhcnNlSW50KFwiXCIgKyBCKV0sXG4gICAgICAgICAgWSA9IF8uZGF5c09mV2Vla1Nob3J0LFxuICAgICAgICAgIFYgPSBfLmRheXNPZldlZWssXG4gICAgICAgICAgRyA9IF8uYmFja09uZVllYXIsXG4gICAgICAgICAgSCA9IF8uYmFja09uZU1vbnRoLFxuICAgICAgICAgIFEgPSB6ICsgXCIuIFwiICsgXy5jbGlja1RvU2VsZWN0TW9udGgsXG4gICAgICAgICAgSyA9IFcgKyBcIi4gXCIgKyBfLmNsaWNrVG9TZWxlY3RZZWFyLFxuICAgICAgICAgIFogPSBfLmZvcndhcmRPbmVNb250aCxcbiAgICAgICAgICBYID0gXy5mb3J3YXJkT25lWWVhcjtcblxuICAgICAgaWYgKCgwLCBhLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBSID0gITE7XG4gICAgICB9LCBbXSksICgwLCBhLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB0ICYmIEEgPT09IGQgJiYgeCh0KTtcbiAgICAgIH0sIFt0XSksICgwLCBhLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoTyAhPT0gdS5Gb2N1c01vZGUuSW5wdXQpIHtcbiAgICAgICAgICB2YXIgZSA9IENbMF0sXG4gICAgICAgICAgICAgIHQgPSBDWzFdO1xuICAgICAgICAgIGlmIChlICYmIHQpIGUuZGlzYWJsZWQgPyB0LmZvY3VzKCkgOiBlLmZvY3VzKCksIEYoW251bGwsIG51bGxdKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBhID0gSS5jdXJyZW50ICYmIEkuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLnVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLWZvY3VzZWRcIik7XG4gICAgICAgICAgICBhICYmIGEuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoUikge1xuICAgICAgICAgIHZhciBvID0gW3ogKyBcIiBcIiArIFddO1xuXG4gICAgICAgICAgaWYgKHIgJiYgKDAsIG4uaXNTYW1lRGF5KShVLCByKSkge1xuICAgICAgICAgICAgdmFyIGkgPSBfLnNlbGVjdGVkRGF0ZTtcbiAgICAgICAgICAgIG8udW5zaGlmdChpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2KG8pO1xuICAgICAgICB9XG4gICAgICB9LCBbU10pLCBBID09PSBmKSByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5Nb250aFBpY2tlciwge1xuICAgICAgICBkYXRlOiBTLFxuICAgICAgICBtaW5EYXRlOiBtLFxuICAgICAgICBtYXhEYXRlOiB5LFxuICAgICAgICBoYW5kbGVTZWxlY3RNb250aDogZnVuY3Rpb24gaGFuZGxlU2VsZWN0TW9udGgoZSkge1xuICAgICAgICAgIHZhciB0ID0gKDAsIG4uc2V0TW9udGgpKFMsIGUpO1xuICAgICAgICAgIHQgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKHQsIG0sIHkpLCB4KHQpLCBUKGQpO1xuICAgICAgICB9LFxuICAgICAgICBpMThuOiBfXG4gICAgICB9KTtcbiAgICAgIGlmIChBID09PSBwKSByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobC5ZZWFyUGlja2VyLCB7XG4gICAgICAgIGRhdGU6IFMsXG4gICAgICAgIG1pbkRhdGU6IG0sXG4gICAgICAgIG1heERhdGU6IHksXG4gICAgICAgIGhhbmRsZVNlbGVjdFllYXI6IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdFllYXIoZSkge1xuICAgICAgICAgIHZhciB0ID0gKDAsIG4uc2V0WWVhcikoUywgZSk7XG4gICAgICAgICAgdCA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCwgbSwgeSksIHgodCksIFQoZCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFN0YXR1c2VzOiB2XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgSiA9ICgwLCBuLnN1Yk1vbnRocykoUywgMSksIHEgPSAoMCwgbi5hZGRNb250aHMpKFMsIDEpLCAkID0gKDAsIG4uc3RhcnRPZk1vbnRoKShTKSwgZWUgPSAoMCwgbi5pc1NhbWVNb250aCkoUywgbSksIHRlID0geSAmJiAoMCwgbi5pc1NhbWVNb250aCkoUywgeSksIHJlID0gciB8fCBTLCBhZSA9IGIgJiYgKDAsIG4ubWluKShyZSwgYiksIG5lID0gYiAmJiAoMCwgbi5tYXgpKHJlLCBiKSwgb2UgPSBhZSAmJiAoMCwgbi5hZGREYXlzKShhZSwgMSksIGllID0gbmUgJiYgKDAsIG4uc3ViRGF5cykobmUsIDEpLCBsZSA9IGZ1bmN0aW9uIGxlKGUpIHtcbiAgICAgICAgdmFyIHQ7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgY2FzZSBcIlVwXCI6XG4gICAgICAgICAgICB0ID0gKDAsIG4uc3ViV2Vla3MpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgY2FzZSBcIkRvd25cIjpcbiAgICAgICAgICAgIHQgPSAoMCwgbi5hZGRXZWVrcykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgICBjYXNlIFwiTGVmdFwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLnN1YkRheXMpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dSaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJSaWdodFwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLmFkZERheXMpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiSG9tZVwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLnN0YXJ0T2ZXZWVrKShTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLmVuZE9mV2VlaykoUyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJQYWdlRG93blwiOlxuICAgICAgICAgICAgdCA9IGUuc2hpZnRLZXkgPyAoMCwgbi5hZGRZZWFycykoUywgMSkgOiAoMCwgbi5hZGRNb250aHMpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgICB0ID0gZS5zaGlmdEtleSA/ICgwLCBuLnN1YlllYXJzKShTLCAxKSA6ICgwLCBuLnN1Yk1vbnRocykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodm9pZCAwICE9PSB0KSB7XG4gICAgICAgICAgdmFyIHIgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKHQsIG0sIHkpO1xuICAgICAgICAgICgwLCBuLmlzU2FtZURheSkoUywgcikgfHwgeCh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIHVlID0gZnVuY3Rpb24gdWUoZSkge1xuICAgICAgICBlICE9PSBTICYmIHgoZSk7XG4gICAgICB9LCBjZSA9IFtdLCBzZSA9ICgwLCBuLnN0YXJ0T2ZXZWVrKSgkKTsgY2UubGVuZ3RoIDwgMjggfHwgc2UuZ2V0TW9udGgoKSA9PT0gQiB8fCBjZS5sZW5ndGggJSA3ICE9IDA7KSB7XG4gICAgICAgIHZhciBkZSA9ICgwLCBuLmlzU2FtZURheSkoc2UsIFUpO1xuICAgICAgICBjZS5wdXNoKGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uRGF5LCB7XG4gICAgICAgICAgZGF0ZTogc2UsXG4gICAgICAgICAgb25DbGljazogcyxcbiAgICAgICAgICBvbktleURvd246IGxlLFxuICAgICAgICAgIG9uTW91c2VNb3ZlOiB1ZSxcbiAgICAgICAgICByZWY6IGRlID8gdyA6IG51bGwsXG4gICAgICAgICAgaXNEaXNhYmxlZDogISgwLCBuLmlzRGF0ZVdpdGhpbk1pbkFuZE1heCkoc2UsIG0sIHkpLFxuICAgICAgICAgIGlzU2VsZWN0ZWQ6IHIgJiYgKDAsIG4uaXNTYW1lRGF5KShzZSwgciksXG4gICAgICAgICAgaXNGb2N1c2VkOiBkZSxcbiAgICAgICAgICBpc1ByZXZNb250aDogKDAsIG4uaXNTYW1lTW9udGgpKHNlLCBKKSxcbiAgICAgICAgICBpc0ZvY3VzZWRNb250aDogKDAsIG4uaXNTYW1lTW9udGgpKHNlLCBVKSxcbiAgICAgICAgICBpc05leHRNb250aDogKDAsIG4uaXNTYW1lTW9udGgpKHNlLCBxKSxcbiAgICAgICAgICBpc1RvZGF5OiAoMCwgbi5pc1NhbWVEYXkpKHNlLCAoMCwgbi50b2RheSkoKSksXG4gICAgICAgICAgaXNSYW5nZURhdGU6IGIgJiYgKDAsIG4uaXNTYW1lRGF5KShzZSwgYiksXG4gICAgICAgICAgaXNSYW5nZVN0YXJ0OiBhZSAmJiAoMCwgbi5pc1NhbWVEYXkpKHNlLCBhZSksXG4gICAgICAgICAgaXNSYW5nZUVuZDogbmUgJiYgKDAsIG4uaXNTYW1lRGF5KShzZSwgbmUpLFxuICAgICAgICAgIGlzV2l0aGluUmFuZ2U6IG9lICYmIGllICYmICgwLCBuLmlzRGF0ZVdpdGhpbk1pbkFuZE1heCkoc2UsIG9lLCBpZSksXG4gICAgICAgICAgaTE4bjogX1xuICAgICAgICB9KSksIHNlID0gKDAsIG4uYWRkRGF5cykoc2UsIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLXBpY2tlclwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY2FsZW5kYXItZGF0ZS1waWNrZXJcIixcbiAgICAgICAgcmVmOiBJLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgKDAsIG4uaGFuZGxlVGFiS2V5KShlLCBbbnVsbCA9PSBoID8gdm9pZCAwIDogaC5jdXJyZW50LCBudWxsID09IGogPyB2b2lkIDAgOiBqLmN1cnJlbnQsIG51bGwgPT0gRSA/IHZvaWQgMCA6IEUuY3VycmVudCwgbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50LCBudWxsID09IE0gPyB2b2lkIDAgOiBNLmN1cnJlbnQsIG51bGwgPT0gTiA/IHZvaWQgMCA6IE4uY3VycmVudCwgbnVsbCA9PSB3ID8gdm9pZCAwIDogdy5jdXJyZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3Jvd1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19jZWxsIHVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwtLWNlbnRlci1pdGVtc1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJwcmV2aW91cy15ZWFyXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgdmFyIGUgPSAoMCwgbi5zdWJZZWFycykoUywgMSk7XG4gICAgICAgICAgZSA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZSwgbSwgeSksIHgoZSksIEYoW2guY3VycmVudCwgSS5jdXJyZW50XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogaCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3ByZXZpb3VzLXllYXJcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IEcsXG4gICAgICAgIGRpc2FibGVkOiBlZVxuICAgICAgfSwgXCLCoFwiKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInByZXZpb3VzLW1vbnRoXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgdmFyIGUgPSAoMCwgbi5zdWJNb250aHMpKFMsIDEpO1xuICAgICAgICAgIGUgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKGUsIG0sIHkpLCB4KGUpLCBGKFtqLmN1cnJlbnQsIEkuY3VycmVudF0pO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IGosXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19wcmV2aW91cy1tb250aFwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogSCxcbiAgICAgICAgZGlzYWJsZWQ6IGVlXG4gICAgICB9LCBcIsKgXCIpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbCB1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC1sYWJlbFwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzZWxlY3QtbW9udGhcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICBUKGYpO1xuICAgICAgICAgIHZhciBlID0gXy5zZWxlY3RBTW9udGg7XG4gICAgICAgICAgdihbZV0pO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IEUsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC1zZWxlY3Rpb25cIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFFcbiAgICAgIH0sIHopLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzZWxlY3QteWVhclwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIFQocCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogUCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXItc2VsZWN0aW9uXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBLXG4gICAgICB9LCBXKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5leHQtbW9udGhcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZSA9ICgwLCBuLmFkZE1vbnRocykoUywgMSk7XG4gICAgICAgICAgZSA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZSwgbSwgeSksIHgoZSksIEYoW00uY3VycmVudCwgSS5jdXJyZW50XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogTSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX25leHQtbW9udGhcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFosXG4gICAgICAgIGRpc2FibGVkOiB0ZVxuICAgICAgfSwgXCLCoFwiKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5leHQteWVhclwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHZhciBlID0gKDAsIG4uYWRkWWVhcnMpKFMsIDEpO1xuICAgICAgICAgIGUgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKGUsIG0sIHkpLCB4KGUpLCBGKFtOLmN1cnJlbnQsIEkuY3VycmVudF0pO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IE4sXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19uZXh0LXllYXJcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFgsXG4gICAgICAgIGRpc2FibGVkOiB0ZVxuICAgICAgfSwgXCLCoFwiKSkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3RhYmxlXCIsXG4gICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGhlYWRcIiwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBudWxsLCBZLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RheS1vZi13ZWVrXCIsXG4gICAgICAgICAgc2NvcGU6IFwiY29sXCIsXG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFZbcGFyc2VJbnQoXCJcIiArIHQpXSxcbiAgICAgICAgICBrZXk6IFwiZGF5LW9mLXdlZWstXCIgKyBlICsgXCItXCIgKyB0XG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCAoMCwgbi5saXN0VG9UYWJsZSkoY2UsIDcpKSkpO1xuICAgIH07XG5cbiAgICB0LkNhbGVuZGFyID0gbSwgbS5kaXNwbGF5TmFtZSA9IFwiQ2FsZW5kYXJcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRGF5ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSB1KHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDMpLFxuICAgICAgICBsID0gcig5KTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBjID0gKDAsIG4uZm9yd2FyZFJlZikoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZS5kYXRlLFxuICAgICAgICAgIGEgPSBlLm9uQ2xpY2ssXG4gICAgICAgICAgdSA9IGUub25LZXlEb3duLFxuICAgICAgICAgIGMgPSBlLm9uTW91c2VNb3ZlLFxuICAgICAgICAgIHMgPSBlLmlzRGlzYWJsZWQsXG4gICAgICAgICAgZCA9IHZvaWQgMCAhPT0gcyAmJiBzLFxuICAgICAgICAgIGYgPSBlLmlzU2VsZWN0ZWQsXG4gICAgICAgICAgcCA9IHZvaWQgMCAhPT0gZiAmJiBmLFxuICAgICAgICAgIG0gPSBlLmlzRm9jdXNlZCxcbiAgICAgICAgICB5ID0gdm9pZCAwICE9PSBtICYmIG0sXG4gICAgICAgICAgYiA9IGUuaXNQcmV2TW9udGgsXG4gICAgICAgICAgdiA9IHZvaWQgMCAhPT0gYiAmJiBiLFxuICAgICAgICAgIE8gPSBlLmlzRm9jdXNlZE1vbnRoLFxuICAgICAgICAgIGcgPSB2b2lkIDAgIT09IE8gJiYgTyxcbiAgICAgICAgICBfID0gZS5pc05leHRNb250aCxcbiAgICAgICAgICBoID0gdm9pZCAwICE9PSBfICYmIF8sXG4gICAgICAgICAgaiA9IGUuaXNUb2RheSxcbiAgICAgICAgICBNID0gdm9pZCAwICE9PSBqICYmIGosXG4gICAgICAgICAgTiA9IGUuaXNSYW5nZURhdGUsXG4gICAgICAgICAgRSA9IHZvaWQgMCAhPT0gTiAmJiBOLFxuICAgICAgICAgIFAgPSBlLmlzUmFuZ2VTdGFydCxcbiAgICAgICAgICB3ID0gdm9pZCAwICE9PSBQICYmIFAsXG4gICAgICAgICAgSSA9IGUuaXNSYW5nZUVuZCxcbiAgICAgICAgICBEID0gdm9pZCAwICE9PSBJICYmIEksXG4gICAgICAgICAgUyA9IGUuaXNXaXRoaW5SYW5nZSxcbiAgICAgICAgICB4ID0gdm9pZCAwICE9PSBTICYmIFMsXG4gICAgICAgICAgayA9IGUuaTE4bixcbiAgICAgICAgICBBID0gdm9pZCAwID09PSBrID8gbC5FTl9VUyA6IGssXG4gICAgICAgICAgVCA9IHIuZ2V0RGF0ZSgpLFxuICAgICAgICAgIEwgPSByLmdldE1vbnRoKCksXG4gICAgICAgICAgQyA9IHIuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICBGID0gci5nZXREYXkoKSxcbiAgICAgICAgICBSID0gKDAsIGkuZm9ybWF0RGF0ZSkociksXG4gICAgICAgICAgVSA9IHkgPyAwIDogLTEsXG4gICAgICAgICAgQiA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZVwiLCB7XG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tcHJldmlvdXMtbW9udGhcIjogdixcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1jdXJyZW50LW1vbnRoXCI6IGcsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tbmV4dC1tb250aFwiOiBoLFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXNlbGVjdGVkXCI6IHAsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tdG9kYXlcIjogTSxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1mb2N1c2VkXCI6IHksXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tcmFuZ2UtZGF0ZVwiOiBFLFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXJhbmdlLWRhdGUtc3RhcnRcIjogdyxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1yYW5nZS1kYXRlLWVuZFwiOiBELFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXdpdGhpbi1yYW5nZVwiOiB4XG4gICAgICB9KSxcbiAgICAgICAgICBXID0gQS5tb250aHNbcGFyc2VJbnQoXCJcIiArIEwpXSxcbiAgICAgICAgICB6ID0gQS5kYXlzT2ZXZWVrW3BhcnNlSW50KFwiXCIgKyBGKV07XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwic2VsZWN0LWRhdGVcIixcbiAgICAgICAgcmVmOiB0LFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIGEoUik7XG4gICAgICAgIH0sXG4gICAgICAgIHRhYkluZGV4OiBVLFxuICAgICAgICBjbGFzc05hbWU6IEIsXG4gICAgICAgIFwiZGF0YS1kYXlcIjogVCxcbiAgICAgICAgXCJkYXRhLW1vbnRoXCI6IEwgKyAxLFxuICAgICAgICBcImRhdGEteWVhclwiOiBDLFxuICAgICAgICBcImRhdGEtdmFsdWVcIjogUixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFQgKyBcIiBcIiArIFcgKyBcIiBcIiArIEMgKyBcIiBcIiArIHosXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiAhIXAsXG4gICAgICAgIGRpc2FibGVkOiBkLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgdShlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Nb3VzZU1vdmU6IGcgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZCB8fCAoMCwgaS5pc0lvc0RldmljZSkoKSB8fCBjKHIpO1xuICAgICAgICB9IDogdm9pZCAwXG4gICAgICB9LCBUKTtcbiAgICB9KTtcbiAgICB0LkRheSA9IGMsIGMuZGlzcGxheU5hbWUgPSBcIkRheVwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Nb250aFBpY2tlciA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcigzKSxcbiAgICAgICAgbCA9IHIoOSk7XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuICh1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmRhdGUsXG4gICAgICAgICAgciA9IGUubWluRGF0ZSxcbiAgICAgICAgICBhID0gZS5tYXhEYXRlLFxuICAgICAgICAgIHUgPSBlLmhhbmRsZVNlbGVjdE1vbnRoLFxuICAgICAgICAgIGMgPSBlLmkxOG4sXG4gICAgICAgICAgcyA9IHZvaWQgMCA9PT0gYyA/IGwuRU5fVVMgOiBjLFxuICAgICAgICAgIGQgPSB0LmdldE1vbnRoKCksXG4gICAgICAgICAgZiA9ICgwLCBuLnVzZVN0YXRlKShkKSxcbiAgICAgICAgICBwID0gZlswXSxcbiAgICAgICAgICBtID0gZlsxXSxcbiAgICAgICAgICB5ID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBiID0gKDAsIG4udXNlUmVmKShudWxsKTtcbiAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHkuY3VycmVudCAmJiB5LmN1cnJlbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdmFsdWU9XCInICsgcCArICdcIl0nKTtcbiAgICAgICAgZSAmJiBlLmZvY3VzKCk7XG4gICAgICB9LCBbcF0pO1xuXG4gICAgICB2YXIgdiA9IGZ1bmN0aW9uIHYoZSkge1xuICAgICAgICB2YXIgbixcbiAgICAgICAgICAgIG8sXG4gICAgICAgICAgICBsID0gZS50YXJnZXQsXG4gICAgICAgICAgICB1ID0gcGFyc2VJbnQoKG51bGwgPT09IChuID0gbC5kYXRhc2V0KSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnZhbHVlKSB8fCBcIlwiLCAxMCksXG4gICAgICAgICAgICBjID0gKDAsIGkuc2V0TW9udGgpKHQsIHUpO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICAgIGNhc2UgXCJVcFwiOlxuICAgICAgICAgICAgbyA9IHUgLSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgY2FzZSBcIkRvd25cIjpcbiAgICAgICAgICAgIG8gPSB1ICsgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICAgIGNhc2UgXCJMZWZ0XCI6XG4gICAgICAgICAgICBvID0gdSAtIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcIlJpZ2h0XCI6XG4gICAgICAgICAgICBvID0gdSArIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgICBvID0gdSAtIHUgJSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgICBvID0gdSArIDIgLSB1ICUgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VEb3duXCI6XG4gICAgICAgICAgICBvID0gMTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJQYWdlVXBcIjpcbiAgICAgICAgICAgIG8gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gbykge1xuICAgICAgICAgIG8gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMSwgbykpO1xuICAgICAgICAgIHZhciBzID0gKDAsIGkuc2V0TW9udGgpKHQsIG8pLFxuICAgICAgICAgICAgICBkID0gKDAsIGkua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShzLCByLCBhKTtcbiAgICAgICAgICAoMCwgaS5pc1NhbWVNb250aCkoYywgZCkgfHwgbShkLmdldE1vbnRoKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcbiAgICAgICAgICBPID0gcy5tb250aHMubWFwKGZ1bmN0aW9uIChlLCBsKSB7XG4gICAgICAgIHZhciBjID0gKDAsIGkuc2V0TW9udGgpKHQsIGwpLFxuICAgICAgICAgICAgcyA9ICgwLCBpLmlzRGF0ZXNNb250aE91dHNpZGVNaW5Pck1heCkoYywgciwgYSksXG4gICAgICAgICAgICBmID0gbCA9PT0gZCxcbiAgICAgICAgICAgIHkgPSBsID09PSBwLFxuICAgICAgICAgICAgTyA9IHkgPyAwIDogLTEsXG4gICAgICAgICAgICBnID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aFwiLCB7XG4gICAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC0tc2VsZWN0ZWRcIjogZixcbiAgICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX21vbnRoLS1mb2N1c2VkXCI6IHlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICBrZXk6IFwic2VsZWN0TW9udGhfXCIgKyBlLFxuICAgICAgICAgIHJlZjogeSA/IGIgOiBudWxsLFxuICAgICAgICAgIHRhYkluZGV4OiBPLFxuICAgICAgICAgIGNsYXNzTmFtZTogZyxcbiAgICAgICAgICBcImRhdGEtdmFsdWVcIjogbCxcbiAgICAgICAgICBcImRhdGEtbGFiZWxcIjogZSxcbiAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogZixcbiAgICAgICAgICBkaXNhYmxlZDogcyxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdShsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uS2V5RG93bjogdixcbiAgICAgICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7XG4gICAgICAgICAgICBzIHx8ICgwLCBpLmlzSW9zRGV2aWNlKSgpIHx8IGwgIT09IHAgJiYgbShsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGUpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNhbGVuZGFyLW1vbnRoLXBpY2tlclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fbW9udGgtcGlja2VyXCIsXG4gICAgICAgIHJlZjogeSxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgICgwLCBpLmhhbmRsZVRhYktleSkoZSwgW251bGwgPT0gYiA/IHZvaWQgMCA6IGIuY3VycmVudF0pO1xuICAgICAgICB9XG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3RhYmxlXCIsXG4gICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgbnVsbCwgKDAsIGkubGlzdFRvVGFibGUpKE8sIDMpKSkpO1xuICAgIH07XG5cbiAgICB0Lk1vbnRoUGlja2VyID0gYywgYy5kaXNwbGF5TmFtZSA9IFwiTW9udGhQaWNrZXJcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuWWVhclBpY2tlciA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig2KSxcbiAgICAgICAgbCA9IHIoMyk7XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuICh1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmRhdGUsXG4gICAgICAgICAgciA9IGUubWluRGF0ZSxcbiAgICAgICAgICBhID0gZS5tYXhEYXRlLFxuICAgICAgICAgIHUgPSBlLmhhbmRsZVNlbGVjdFllYXIsXG4gICAgICAgICAgYyA9IGUuc2V0U3RhdHVzZXMsXG4gICAgICAgICAgcyA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgZCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgZiA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgcCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgbSA9IHQuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICB5ID0gKDAsIG4udXNlU3RhdGUpKG0pLFxuICAgICAgICAgIGIgPSB5WzBdLFxuICAgICAgICAgIHYgPSB5WzFdLFxuICAgICAgICAgIE8gPSAoMCwgbi51c2VTdGF0ZSkoW251bGwsIG51bGxdKSxcbiAgICAgICAgICBnID0gT1swXSxcbiAgICAgICAgICBfID0gT1sxXSxcbiAgICAgICAgICBoID0gYjtcbiAgICAgIGggLT0gaCAlIGkuWUVBUl9DSFVOSywgaCA9IE1hdGgubWF4KDAsIGgpO1xuICAgICAgdmFyIGogPSAoMCwgbC5pc0RhdGVzWWVhck91dHNpZGVNaW5Pck1heCkoKDAsIGwuc2V0WWVhcikodCwgaCAtIDEpLCByLCBhKSxcbiAgICAgICAgICBNID0gKDAsIGwuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXgpKCgwLCBsLnNldFllYXIpKHQsIGggKyBpLllFQVJfQ0hVTkspLCByLCBhKTtcbiAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IFwiU2hvd2luZyB5ZWFycyBcIiArIGggKyBcIiB0byBcIiArIChoICsgaS5ZRUFSX0NIVU5LIC0gMSkgKyBcIi4gU2VsZWN0IGEgeWVhci5cIjtcbiAgICAgICAgYyhbZV0pO1xuICAgICAgICB2YXIgdCA9IGdbMF0sXG4gICAgICAgICAgICByID0gZ1sxXTtcbiAgICAgICAgaWYgKHQgJiYgcikgdC5kaXNhYmxlZCA/IHIuZm9jdXMoKSA6IHQuZm9jdXMoKSwgXyhbbnVsbCwgbnVsbF0pO2Vsc2Uge1xuICAgICAgICAgIHZhciBhID0gcC5jdXJyZW50ICYmIHAuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLnVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXItLWZvY3VzZWRcIik7XG4gICAgICAgICAgYSAmJiBhLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIFtiXSksICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHAuY3VycmVudCAmJiBwLmN1cnJlbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdmFsdWU9XCInICsgYiArICdcIl0nKTtcbiAgICAgICAgZSAmJiBlLmZvY3VzKCk7XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIGZvciAodmFyIE4gPSBmdW5jdGlvbiBOKGUpIHtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgICBvLFxuICAgICAgICAgICAgdSA9IGUudGFyZ2V0LFxuICAgICAgICAgICAgYyA9IHBhcnNlSW50KChudWxsID09PSAobiA9IHUuZGF0YXNldCkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi52YWx1ZSkgfHwgXCJcIiwgMTApLFxuICAgICAgICAgICAgcyA9ICgwLCBsLnNldFllYXIpKHQsIGMpO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICAgIGNhc2UgXCJVcFwiOlxuICAgICAgICAgICAgbyA9IGMgLSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgY2FzZSBcIkRvd25cIjpcbiAgICAgICAgICAgIG8gPSBjICsgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICAgIGNhc2UgXCJMZWZ0XCI6XG4gICAgICAgICAgICBvID0gYyAtIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcIlJpZ2h0XCI6XG4gICAgICAgICAgICBvID0gYyArIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgICBvID0gYyAtIGMgJSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgICBvID0gYyArIDIgLSBjICUgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VEb3duXCI6XG4gICAgICAgICAgICBvID0gYyArIGkuWUVBUl9DSFVOSztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VVcFwiOlxuICAgICAgICAgICAgbyA9IGMgLSBpLllFQVJfQ0hVTks7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodm9pZCAwICE9PSBvKSB7XG4gICAgICAgICAgbyA9IE1hdGgubWF4KDAsIG8pO1xuICAgICAgICAgIHZhciBkID0gKDAsIGwuc2V0WWVhcikodCwgbyksXG4gICAgICAgICAgICAgIGYgPSAoMCwgbC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKGQsIHIsIGEpO1xuICAgICAgICAgICgwLCBsLmlzU2FtZVllYXIpKHMsIGYpIHx8IHYoZi5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIEUgPSBbXSwgUCA9IGgsIHcgPSBmdW5jdGlvbiB3KCkge1xuICAgICAgICB2YXIgZSA9IFAsXG4gICAgICAgICAgICBpID0gKDAsIGwuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXgpKCgwLCBsLnNldFllYXIpKHQsIGUpLCByLCBhKSxcbiAgICAgICAgICAgIGMgPSBlID09PSBtLFxuICAgICAgICAgICAgcyA9IGUgPT09IGIsXG4gICAgICAgICAgICBkID0gcyA/IDAgOiAtMSxcbiAgICAgICAgICAgIHAgPSAoMCwgby5kZWZhdWx0KShcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXJcIiwge1xuICAgICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci0tc2VsZWN0ZWRcIjogYyxcbiAgICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXItLWZvY3VzZWRcIjogc1xuICAgICAgICB9KTtcbiAgICAgICAgRS5wdXNoKG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgIHRhYkluZGV4OiBkLFxuICAgICAgICAgIHJlZjogcyA/IGYgOiBudWxsLFxuICAgICAgICAgIGNsYXNzTmFtZTogcCxcbiAgICAgICAgICBcImRhdGEtdmFsdWVcIjogZSxcbiAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogYyxcbiAgICAgICAgICBkaXNhYmxlZDogaSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdShlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uS2V5RG93bjogTixcbiAgICAgICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7XG4gICAgICAgICAgICBpIHx8ICgwLCBsLmlzSW9zRGV2aWNlKSgpIHx8IGUgIT09IGIgJiYgdihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGUpKSwgUCArPSAxO1xuICAgICAgfTsgRS5sZW5ndGggPCBpLllFQVJfQ0hVTks7KSB7XG4gICAgICAgIHcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci1waWNrZXJcIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNhbGVuZGFyLXllYXItcGlja2VyXCIsXG4gICAgICAgIHJlZjogcCxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgICgwLCBsLmhhbmRsZVRhYktleSkoZSwgW251bGwgPT0gcyA/IHZvaWQgMCA6IHMuY3VycmVudCwgbnVsbCA9PSBmID8gdm9pZCAwIDogZi5jdXJyZW50LCBudWxsID09IGQgPyB2b2lkIDAgOiBkLmN1cnJlbnRdKTtcbiAgICAgICAgfVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX190YWJsZVwiLFxuICAgICAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgbnVsbCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJwcmV2aW91cy15ZWFyLWNodW5rXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19wcmV2aW91cy15ZWFyLWNodW5rXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIk5hdmlnYXRlIGJhY2sgXCIgKyBpLllFQVJfQ0hVTksgKyBcIiB5ZWFyc1wiLFxuICAgICAgICBkaXNhYmxlZDogaixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZSA9IGIgLSBpLllFQVJfQ0hVTks7XG4gICAgICAgICAgZSA9IE1hdGgubWF4KDAsIGUpO1xuICAgICAgICAgIHZhciBuID0gKDAsIGwuc2V0WWVhcikodCwgZSk7XG4gICAgICAgICAgbiA9ICgwLCBsLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkobiwgciwgYSksIF8oW3MuY3VycmVudCwgcC5jdXJyZW50XSksIHYobi5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmOiBzXG4gICAgICB9LCBcIsKgXCIpKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7XG4gICAgICAgIGNvbFNwYW46IDNcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fdGFibGVcIixcbiAgICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCAoMCwgbC5saXN0VG9UYWJsZSkoRSwgMykpKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGRcIiwgbnVsbCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwibmV4dC15ZWFyLWNodW5rXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19uZXh0LXllYXItY2h1bmtcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiTmF2aWdhdGUgZm9yd2FyZCBcIiArIGkuWUVBUl9DSFVOSyArIFwiIHllYXJzXCIsXG4gICAgICAgIGRpc2FibGVkOiBNLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHZhciBlID0gYiArIGkuWUVBUl9DSFVOSztcbiAgICAgICAgICBlID0gTWF0aC5tYXgoMCwgZSk7XG4gICAgICAgICAgdmFyIG4gPSAoMCwgbC5zZXRZZWFyKSh0LCBlKTtcbiAgICAgICAgICBuID0gKDAsIGwua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShuLCByLCBhKSwgXyhbZC5jdXJyZW50LCBwLmN1cnJlbnRdKSwgdihuLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IGRcbiAgICAgIH0sIFwiwqBcIikpKSkpKTtcbiAgICB9O1xuXG4gICAgdC5ZZWFyUGlja2VyID0gYywgYy5kaXNwbGF5TmFtZSA9IFwiWWVhclBpY2tlclwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5EYXRlUmFuZ2VQaWNrZXIgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBvID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gZCh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgaSA9IHIoNiksXG4gICAgICAgIGwgPSByKDEyKSxcbiAgICAgICAgdSA9IHIoMyksXG4gICAgICAgIGMgPSByKDgpLFxuICAgICAgICBzID0gcig1KTtcblxuICAgIGZ1bmN0aW9uIGQoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfZjIgPSBmdW5jdGlvbiBmKCkge1xuICAgICAgcmV0dXJuIChfZjIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICB0LkRhdGVSYW5nZVBpY2tlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCxcbiAgICAgICAgICByLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgeSA9IGUuc3RhcnREYXRlTGFiZWwsXG4gICAgICAgICAgYiA9IGUuc3RhcnREYXRlSGludCxcbiAgICAgICAgICB2ID0gZS5zdGFydERhdGVQaWNrZXJQcm9wcyxcbiAgICAgICAgICBPID0gZS5lbmREYXRlTGFiZWwsXG4gICAgICAgICAgZyA9IGUuZW5kRGF0ZUhpbnQsXG4gICAgICAgICAgXyA9IGUuZW5kRGF0ZVBpY2tlclByb3BzLFxuICAgICAgICAgIGggPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBqID0gKDAsIG8udXNlU3RhdGUpKHYuZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICBNID0galswXSxcbiAgICAgICAgICBOID0galsxXSxcbiAgICAgICAgICBFID0gKDAsIG8udXNlU3RhdGUpKF8uZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICBQID0gRVswXSxcbiAgICAgICAgICB3ID0gRVsxXSxcbiAgICAgICAgICBJID0gZnVuY3Rpb24gSShlLCB0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHZhciBhID0gciAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHIsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCk7XG5cbiAgICAgICAgICBpZiAoYSkge1xuICAgICAgICAgICAgdmFyIG4gPSAoMCwgdS5mb3JtYXREYXRlKShhKTtcbiAgICAgICAgICAgIHQobik7XG4gICAgICAgICAgfSBlbHNlIHQocik7XG5cbiAgICAgICAgICBlICYmIGUocik7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgICAgIEQgPSBJKHYub25DaGFuZ2UsIE4pLFxuICAgICAgICAgIFMgPSBJKF8ub25DaGFuZ2UsIHcpLFxuICAgICAgICAgIHggPSAoMCwgbi5kZWZhdWx0KShoLCBcInVzYS1kYXRlLXJhbmdlLXBpY2tlclwiKSxcbiAgICAgICAgICBrID0gKDAsIG4uZGVmYXVsdCkodi5jbGFzc05hbWUsIFwidXNhLWRhdGUtcmFuZ2UtcGlja2VyX19yYW5nZS1zdGFydFwiKSxcbiAgICAgICAgICBBID0gKDAsIG4uZGVmYXVsdCkoXy5jbGFzc05hbWUsIFwidXNhLWRhdGUtcmFuZ2UtcGlja2VyX19yYW5nZS1lbmRcIiksXG4gICAgICAgICAgVCA9IHYuaWQgKyBcIi1sYWJlbFwiLFxuICAgICAgICAgIEwgPSB2LmlkICsgXCItaGludFwiLFxuICAgICAgICAgIEMgPSBbeSAmJiBULCBiICYmIExdLmpvaW4oXCIgXCIpLnRyaW0oKSB8fCB2b2lkIDAsXG4gICAgICAgICAgRiA9IF8uaWQgKyBcIi1sYWJlbFwiLFxuICAgICAgICAgIFIgPSBfLmlkICsgXCItaGludFwiLFxuICAgICAgICAgIFUgPSBbTyAmJiBGLCBnICYmIFJdLmpvaW4oXCIgXCIpLnRyaW0oKSB8fCB2b2lkIDA7XG5cbiAgICAgIHJldHVybiBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogeCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcmFuZ2UtcGlja2VyXCJcbiAgICAgIH0sIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuRm9ybUdyb3VwLCBudWxsLCB5ICYmIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHMuTGFiZWwsIHtcbiAgICAgICAgaWQ6IFQsXG4gICAgICAgIGh0bWxGb3I6IHYuaWRcbiAgICAgIH0sIHkpLCBiICYmIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1oaW50XCIsXG4gICAgICAgIGlkOiBMXG4gICAgICB9LCBiKSwgby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobC5EYXRlUGlja2VyLCBfZjIoe1xuICAgICAgICBjbGFzc05hbWU6IGssXG4gICAgICAgIHJhbmdlRGF0ZTogUFxuICAgICAgfSwgdiwge1xuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogQyxcbiAgICAgICAgb25DaGFuZ2U6IEQsXG4gICAgICAgIG1heERhdGU6IChkID0gdi5tYXhEYXRlLCBwID0gZCAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKGQpLCBtID0gUCAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKFApLCBtICYmIHAgPyBtLmdldFRpbWUoKSA8IHAuZ2V0VGltZSgpID8gKDAsIHUuZm9ybWF0RGF0ZSkobSkgOiAoMCwgdS5mb3JtYXREYXRlKShwKSA6IG0gJiYgKDAsIHUuZm9ybWF0RGF0ZSkobSkgfHwgcCAmJiAoMCwgdS5mb3JtYXREYXRlKShwKSB8fCB2b2lkIDApXG4gICAgICB9KSkpLCBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLkZvcm1Hcm91cCwgbnVsbCwgTyAmJiBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChzLkxhYmVsLCB7XG4gICAgICAgIGlkOiBGLFxuICAgICAgICBodG1sRm9yOiBfLmlkXG4gICAgICB9LCBPKSwgZyAmJiBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaGludFwiLFxuICAgICAgICBpZDogUlxuICAgICAgfSwgZyksIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuRGF0ZVBpY2tlciwgX2YyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBBLFxuICAgICAgICByYW5nZURhdGU6IE1cbiAgICAgIH0sIF8sIHtcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IFUsXG4gICAgICAgIG9uQ2hhbmdlOiBTLFxuICAgICAgICBtaW5EYXRlOiAodCA9IF8ubWluRGF0ZSwgciA9IHQgJiYgKDAsIHUucGFyc2VEYXRlU3RyaW5nKSh0KSwgYSA9IE0gJiYgKDAsIHUucGFyc2VEYXRlU3RyaW5nKShNKSwgYSAmJiByID8gYS5nZXRUaW1lKCkgPiByLmdldFRpbWUoKSA/ICgwLCB1LmZvcm1hdERhdGUpKGEpIDogKDAsIHUuZm9ybWF0RGF0ZSkocikgOiBhICYmICgwLCB1LmZvcm1hdERhdGUpKGEpIHx8IHIgJiYgKDAsIHUuZm9ybWF0RGF0ZSkocikgfHwgdm9pZCAwKVxuICAgICAgfSkpKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuRHJvcGRvd24gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxOCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5pZCxcbiAgICAgICAgICByID0gZS5uYW1lLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gZS5pbnB1dFJlZixcbiAgICAgICAgICBjID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBzID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJpbnB1dFJlZlwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICBkID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc2VsZWN0XCIsIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIsIF9pMTgoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZHJvcGRvd25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBkLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgcmVmOiB1XG4gICAgICB9LCBzKSwgYyk7XG4gICAgfTtcblxuICAgIHQuRHJvcGRvd24gPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5FcnJvck1lc3NhZ2UgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IGZ1bmN0aW9uIGkoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gZS5pZCxcbiAgICAgICAgICBpID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZXJyb3ItbWVzc2FnZVwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZXJyb3JNZXNzYWdlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogaSxcbiAgICAgICAgaWQ6IG8sXG4gICAgICAgIHJvbGU6IFwiYWxlcnRcIlxuICAgICAgfSwgdCk7XG4gICAgfTtcblxuICAgIHQuRXJyb3JNZXNzYWdlID0gaTtcbiAgICB2YXIgbCA9IGk7XG4gICAgdC5kZWZhdWx0ID0gbDtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRmllbGRzZXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5GaWVsZHNldCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUubGVnZW5kLFxuICAgICAgICAgIGkgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBsID0gZS5sZWdlbmRTck9ubHksXG4gICAgICAgICAgdSA9IGUubGVnZW5kU3R5bGUsXG4gICAgICAgICAgYyA9IHZvaWQgMCA9PT0gdSA/IFwiZGVmYXVsdFwiIDogdSxcbiAgICAgICAgICBzID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZmllbGRzZXRcIiwgaSk7XG4gICAgICBsICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGaWVsZHNldCBwcm9wZXJ0eSBsZWdlbmRTck9ubHkgaXMgZGVwcmVjYXRlZC4gVXNlIGxlZ2VuZFN0eWxlID0gJ3NyT25seScuXCIpO1xuICAgICAgdmFyIGQgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWxlZ2VuZFwiOiBcImRlZmF1bHRcIiA9PT0gYyxcbiAgICAgICAgXCJ1c2EtbGVnZW5kLS1sYXJnZVwiOiBcImxhcmdlXCIgPT09IGMsXG4gICAgICAgIFwidXNhLXNyLW9ubHlcIjogXCJzck9ubHlcIiA9PT0gYyB8fCBsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpZWxkc2V0XCIsXG4gICAgICAgIGNsYXNzTmFtZTogc1xuICAgICAgfSwgciAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxlZ2VuZFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogZFxuICAgICAgfSwgciksIHQpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkZpbGVJbnB1dCA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig2MiksXG4gICAgICAgIGwgPSByKDYzKTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfYzMgPSBmdW5jdGlvbiBjKCkge1xuICAgICAgcmV0dXJuIChfYzMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGQgPSAoMCwgbi5mb3J3YXJkUmVmKShmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdmFyIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuaWQsXG4gICAgICAgICAgdSA9IGUuZGlzYWJsZWQsXG4gICAgICAgICAgZCA9IGUubXVsdGlwbGUsXG4gICAgICAgICAgZiA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHAgPSBlLmFjY2VwdCxcbiAgICAgICAgICBtID0gZS5vbkNoYW5nZSxcbiAgICAgICAgICB5ID0gZS5vbkRyb3AsXG4gICAgICAgICAgYiA9IHMoZSwgW1wibmFtZVwiLCBcImlkXCIsIFwiZGlzYWJsZWRcIiwgXCJtdWx0aXBsZVwiLCBcImNsYXNzTmFtZVwiLCBcImFjY2VwdFwiLCBcIm9uQ2hhbmdlXCIsIFwib25Ecm9wXCJdKSxcbiAgICAgICAgICB2ID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBPID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBnID0gT1swXSxcbiAgICAgICAgICBfID0gT1sxXSxcbiAgICAgICAgICBoID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBqID0gaFswXSxcbiAgICAgICAgICBNID0gaFsxXSxcbiAgICAgICAgICBOID0gKDAsIG4udXNlU3RhdGUpKFtdKSxcbiAgICAgICAgICBFID0gTlswXSxcbiAgICAgICAgICBQID0gTlsxXTtcbiAgICAgICgwLCBuLnVzZUltcGVyYXRpdmVIYW5kbGUpKHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnB1dDogdi5jdXJyZW50LFxuICAgICAgICAgIGNsZWFyRmlsZXM6IGZ1bmN0aW9uIGNsZWFyRmlsZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gUChbXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWxlczogRVxuICAgICAgICB9O1xuICAgICAgfSwgW0VdKTtcbiAgICAgIHZhciB3ID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZmlsZS1pbnB1dFwiLCB7XG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXQtLWRpc2FibGVkXCI6IHVcbiAgICAgIH0sIGYpLFxuICAgICAgICAgIEkgPSAoMCwgby5kZWZhdWx0KShcInVzYS1maWxlLWlucHV0X190YXJnZXRcIiwge1xuICAgICAgICBcInVzYS1maWxlLWlucHV0LS1kcmFnXCI6IGcsXG4gICAgICAgIFwiaGFzLWludmFsaWQtZmlsZVwiOiBqXG4gICAgICB9KSxcbiAgICAgICAgICBEID0gL3J2OjExLjAvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IC9FZGdlXFwvXFxkLi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksXG4gICAgICAgICAgUyA9IGQgPyBcIkRyYWcgZmlsZXMgaGVyZSBvciBcIiA6IFwiRHJhZyBmaWxlIGhlcmUgb3IgXCIsXG4gICAgICAgICAgeCA9IFtdO1xuICAgICAgaWYgKEUpIGZvciAodmFyIGsgPSAwOyBrIDwgKG51bGwgPT0gRSA/IHZvaWQgMCA6IEUubGVuZ3RoKTsgaysrKSB7XG4gICAgICAgIHZhciBBID0gKDAsIGwubWFrZVNhZmVGb3JJRCkoRVtwYXJzZUludChcIlwiICsgayldLm5hbWUpLFxuICAgICAgICAgICAgVCA9IFwiZmlsZVByZXZpZXdfXCIgKyBBO1xuICAgICAgICB4LnB1c2gobi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5GaWxlUHJldmlldywge1xuICAgICAgICAgIGtleTogVCxcbiAgICAgICAgICBpbWFnZUlkOiBBLFxuICAgICAgICAgIGZpbGU6IEVbcGFyc2VJbnQoXCJcIiArIGspXVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICB2YXIgTCA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWZpbGUtaW5wdXRfX2luc3RydWN0aW9uc1wiLCB7XG4gICAgICAgIFwiZGlzcGxheS1ub25lXCI6IHgubGVuZ3RoID4gMFxuICAgICAgfSksXG4gICAgICAgICAgQyA9IHgubGVuZ3RoID4gMSA/IHgubGVuZ3RoICsgXCIgZmlsZXMgc2VsZWN0ZWRcIiA6IFwiU2VsZWN0ZWQgZmlsZVwiO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXRcIixcbiAgICAgICAgY2xhc3NOYW1lOiB3LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogdVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1kcm9wdGFyZ2V0XCIsXG4gICAgICAgIGNsYXNzTmFtZTogSSxcbiAgICAgICAgb25EcmFnT3ZlcjogZnVuY3Rpb24gb25EcmFnT3ZlcigpIHtcbiAgICAgICAgICByZXR1cm4gXyghMCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRHJhZ0xlYXZlOiBmdW5jdGlvbiBvbkRyYWdMZWF2ZSgpIHtcbiAgICAgICAgICByZXR1cm4gXyghMSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRHJvcDogZnVuY3Rpb24gb25Ecm9wKGUpIHtcbiAgICAgICAgICAhZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChNKCExKSwgcCkge1xuICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gcC5zcGxpdChcIixcIiksIHIgPSAhMCwgYSA9IDA7IGEgPCBlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gZS5kYXRhVHJhbnNmZXIuZmlsZXNbcGFyc2VJbnQoXCJcIiArIGEpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXIpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgaSA9IHRbcGFyc2VJbnQoXCJcIiArIG8pXTtcbiAgICAgICAgICAgICAgICAgIGlmIChyID0gbi5uYW1lLmluZGV4T2YoaSkgPiAwIHx8IG4udHlwZS5pbmNsdWRlcyhpLnJlcGxhY2UoL1xcKi9nLCBcIlwiKSkpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHIgfHwgKFAoW10pLCBNKCEwKSwgZS5wcmV2ZW50RGVmYXVsdCgpLCBlLnN0b3BQcm9wYWdhdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KGUpLCBfKCExKSwgeSAmJiB5KGUpO1xuICAgICAgICB9XG4gICAgICB9LCB4Lmxlbmd0aCA+IDAgJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1wcmV2aWV3LWhlYWRpbmdcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWhlYWRpbmdcIlxuICAgICAgfSwgQywgXCIgXCIsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fY2hvb3NlXCJcbiAgICAgIH0sIFwiQ2hhbmdlIGZpbGVcIiwgeC5sZW5ndGggPiAxICYmIFwic1wiKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtaW5zdHJ1Y3Rpb25zXCIsXG4gICAgICAgIGNsYXNzTmFtZTogTCxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSwgIUQgJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19kcmFnLXRleHRcIlxuICAgICAgfSwgUyksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fY2hvb3NlXCJcbiAgICAgIH0sIFwiY2hvb3NlIGZyb20gZm9sZGVyXCIpKSwgeCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1ib3hcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19ib3hcIlxuICAgICAgfSksIGogJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1lcnJvclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX2FjY2VwdGVkLWZpbGVzLW1lc3NhZ2VcIlxuICAgICAgfSwgXCJUaGlzIGlzIG5vdCBhIHZhbGlkIGZpbGUgdHlwZS5cIiksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2MzKHt9LCBiLCB7XG4gICAgICAgIHJlZjogdixcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJmaWxlLWlucHV0LWlucHV0XCIsXG4gICAgICAgIG5hbWU6IHIsXG4gICAgICAgIGlkOiBhLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX2lucHV0XCIsXG4gICAgICAgIGRpc2FibGVkOiB1LFxuICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgIHZhciB0LCByLCBhLCBuO1xuICAgICAgICAgIE0oITEpO1xuICAgICAgICAgIHZhciBvID0gW107XG4gICAgICAgICAgaWYgKG51bGwgPT09IChyID0gbnVsbCA9PT0gKHQgPSBlLnRhcmdldCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5maWxlcykgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci5sZW5ndGgpIGZvciAodmFyIGkgPSAobnVsbCA9PT0gKG4gPSBudWxsID09PSAoYSA9IGUudGFyZ2V0KSB8fCB2b2lkIDAgPT09IGEgPyB2b2lkIDAgOiBhLmZpbGVzKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLmxlbmd0aCkgfHwgMCwgbCA9IDA7IGwgPCBpOyBsKyspIHtcbiAgICAgICAgICAgIHZhciB1ID0gZS50YXJnZXQuZmlsZXMuaXRlbShsKTtcbiAgICAgICAgICAgIHUgJiYgby5wdXNoKHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBQKG8pLCBtICYmIG0oZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpcGxlOiBkLFxuICAgICAgICBhY2NlcHQ6IHBcbiAgICAgIH0pKSkpO1xuICAgIH0pO1xuXG4gICAgdC5GaWxlSW5wdXQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5GaWxlUHJldmlldyA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gaSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgbCA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBsICYmIChsLmdldCB8fCBsLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgbCkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAoaSA9IGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8veUg1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlCUkFBN1wiO1xuXG4gICAgdC5GaWxlUHJldmlldyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaW1hZ2VJZCxcbiAgICAgICAgICByID0gZS5maWxlLFxuICAgICAgICAgIGEgPSAoMCwgbi51c2VSZWYpKG5ldyBGaWxlUmVhZGVyKCkpLFxuICAgICAgICAgIGkgPSAoMCwgbi51c2VTdGF0ZSkoITApLFxuICAgICAgICAgIHUgPSBpWzBdLFxuICAgICAgICAgIGMgPSBpWzFdLFxuICAgICAgICAgIHMgPSAoMCwgbi51c2VTdGF0ZSkobCksXG4gICAgICAgICAgZCA9IHNbMF0sXG4gICAgICAgICAgZiA9IHNbMV0sXG4gICAgICAgICAgcCA9ICgwLCBuLnVzZVN0YXRlKSghMSksXG4gICAgICAgICAgbSA9IHBbMF0sXG4gICAgICAgICAgeSA9IHBbMV07XG4gICAgICAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGEuY3VycmVudC5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYyghMSksIGYoYS5jdXJyZW50LnJlc3VsdCk7XG4gICAgICAgIH0sIGEuY3VycmVudC5yZWFkQXNEYXRhVVJMKHIpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYS5jdXJyZW50Lm9ubG9hZGVuZCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIHZhciBiID0gci5uYW1lLFxuICAgICAgICAgIHYgPSBiLmluZGV4T2YoXCIucGRmXCIpID4gMCxcbiAgICAgICAgICBPID0gYi5pbmRleE9mKFwiLmRvY1wiKSA+IDAgfHwgYi5pbmRleE9mKFwiLnBhZ2VzXCIpID4gMCxcbiAgICAgICAgICBnID0gYi5pbmRleE9mKFwiLm1vdlwiKSA+IDAgfHwgYi5pbmRleE9mKFwiLm1wNFwiKSA+IDAsXG4gICAgICAgICAgXyA9IGIuaW5kZXhPZihcIi54bHNcIikgPiAwIHx8IGIuaW5kZXhPZihcIi5udW1iZXJzXCIpID4gMCxcbiAgICAgICAgICBoID0gISh2IHx8IE8gfHwgZyB8fCBfKSxcbiAgICAgICAgICBqID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZmlsZS1pbnB1dF9fcHJldmlldy1pbWFnZVwiLCB7XG4gICAgICAgIFwiaXMtbG9hZGluZ1wiOiB1LFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS1wZGZcIjogbSAmJiB2LFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS13b3JkXCI6IG0gJiYgTyxcbiAgICAgICAgXCJ1c2EtZmlsZS1pbnB1dF9fcHJldmlldy1pbWFnZS0tdmlkZW9cIjogbSAmJiBnLFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS1leGNlbFwiOiBtICYmIF8sXG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXctaW1hZ2UtLWdlbmVyaWNcIjogbSAmJiBoXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtcHJldmlld1wiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXdcIixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBpZDogdCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtcHJldmlldy1pbWFnZVwiLFxuICAgICAgICBzcmM6IGQsXG4gICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBqLFxuICAgICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgICAgICAgIGYobCksIHkoITApO1xuICAgICAgICB9XG4gICAgICB9KSwgYik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQubWFrZVNhZmVGb3JJRCA9IHZvaWQgMDtcblxuICAgIHQubWFrZVNhZmVGb3JJRCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5yZXBsYWNlKC9bXmEtejAtOV0vZywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHQgPSBlLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIHJldHVybiAzMiA9PT0gdCA/IFwiLVwiIDogdCA+PSA2NSAmJiB0IDw9IDkwID8gXCJpbWdfXCIgKyBlLnRvTG93ZXJDYXNlKCkgOiBcIl9fXCIgKyB0LnRvU3RyaW5nKDE2KS5zbGljZSgtNCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5SYWRpbyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE5ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxOSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhYmVsLFxuICAgICAgICAgIGMgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIHMgPSBlLnRpbGUsXG4gICAgICAgICAgZCA9IGUubGFiZWxEZXNjcmlwdGlvbixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJsYWJlbFwiLCBcImlucHV0UmVmXCIsIFwidGlsZVwiLCBcImxhYmVsRGVzY3JpcHRpb25cIl0pLFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1yYWRpb1wiLCBvKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtcmFkaW9fX2lucHV0XCIsIHtcbiAgICAgICAgXCJ1c2EtcmFkaW9fX2lucHV0LS10aWxlXCI6IHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInJhZGlvXCIsXG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfaTE5KHtcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICByZWY6IGNcbiAgICAgIH0sIGYpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtcmFkaW9fX2xhYmVsXCIsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIHUsIGQgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jaGVja2JveF9fbGFiZWwtZGVzY3JpcHRpb25cIlxuICAgICAgfSwgZCkpKTtcbiAgICB9O1xuXG4gICAgdC5SYWRpbyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlJhbmdlSW5wdXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyMCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjAgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuaW5wdXRSZWYsXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiaW5wdXRSZWZcIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1yYW5nZVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9pMjAoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwicmFuZ2VcIixcbiAgICAgICAgY2xhc3NOYW1lOiB1LFxuICAgICAgICByZWY6IHIsXG4gICAgICAgIHR5cGU6IFwicmFuZ2VcIlxuICAgICAgfSwgbykpO1xuICAgIH07XG5cbiAgICB0LlJhbmdlSW5wdXQgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5UaW1lUGlja2VyID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBkKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDgpLFxuICAgICAgICBsID0gcig1KSxcbiAgICAgICAgdSA9IHIoMTEpLFxuICAgICAgICBjID0gcig2NyksXG4gICAgICAgIHMgPSByKDY4KTtcblxuICAgIGZ1bmN0aW9uIGQoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHQuVGltZVBpY2tlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICBhID0gZS5vbkNoYW5nZSxcbiAgICAgICAgICBkID0gZS5sYWJlbCxcbiAgICAgICAgICBmID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgcCA9IGUuZGlzYWJsZWQsXG4gICAgICAgICAgbSA9IGUubWluVGltZSxcbiAgICAgICAgICB5ID0gdm9pZCAwID09PSBtID8gcy5ERUZBVUxUX01JTl9USU1FIDogbSxcbiAgICAgICAgICBiID0gZS5tYXhUaW1lLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBzLkRFRkFVTFRfTUFYX1RJTUUgOiBiLFxuICAgICAgICAgIE8gPSBlLnN0ZXAsXG4gICAgICAgICAgZyA9IHZvaWQgMCA9PT0gTyA/IHMuREVGQVVMVF9TVEVQIDogTyxcbiAgICAgICAgICBfID0gZS5oaW50LFxuICAgICAgICAgIGggPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBqID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtdGltZS1waWNrZXJcIiwgaCksXG4gICAgICAgICAgTSA9ICgwLCBjLnBhcnNlVGltZVN0cmluZykoeSkgfHwgcy5ERUZBVUxUX01JTl9USU1FX01JTlVURVMsXG4gICAgICAgICAgTiA9ICgwLCBjLnBhcnNlVGltZVN0cmluZykodikgfHwgcy5ERUZBVUxUX01BWF9USU1FX01JTlVURVMsXG4gICAgICAgICAgRSA9IGcgPCBzLk1JTl9TVEVQID8gcy5NSU5fU1RFUCA6IGcsXG4gICAgICAgICAgUCA9ICgwLCBuLnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBjLmdldFRpbWVPcHRpb25zKShNLCBOLCBFKTtcbiAgICAgIH0sIFt5LCB2LCBnXSksXG4gICAgICAgICAgdyA9IHIgKyBcIi1sYWJlbFwiLFxuICAgICAgICAgIEkgPSByICsgXCItaGludFwiO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuRm9ybUdyb3VwLCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLkxhYmVsLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtbGFiZWxcIixcbiAgICAgICAgaWQ6IHcsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIGQpLCBfICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1oaW50XCIsXG4gICAgICAgIGlkOiBJXG4gICAgICB9LCBfKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodS5Db21ib0JveCwge1xuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgY2xhc3NOYW1lOiBqLFxuICAgICAgICBvbkNoYW5nZTogYSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBmLFxuICAgICAgICBvcHRpb25zOiBQLFxuICAgICAgICBkaXNhYmxlZDogcCxcbiAgICAgICAgY3VzdG9tRmlsdGVyOiBzLlRJTUVfUElDS0VSX0NVU1RPTV9GSUxURVIsXG4gICAgICAgIGRpc2FibGVGaWx0ZXJpbmc6ICEwXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZ2V0VGltZU9wdGlvbnMgPSB0LnBhcnNlVGltZVN0cmluZyA9IHZvaWQgMDtcblxuICAgIHQucGFyc2VUaW1lU3RyaW5nID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0O1xuXG4gICAgICBpZiAoZSkge1xuICAgICAgICB2YXIgciA9IGUuc3BsaXQoXCI6XCIpLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgICByID0gcGFyc2VJbnQoZSwgMTApO1xuICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocikgfHwgKHQgPSByKSwgdDtcbiAgICAgICAgfSksXG4gICAgICAgICAgICBhID0gclswXSxcbiAgICAgICAgICAgIG4gPSByWzFdO1xuICAgICAgICBudWxsICE9IGEgJiYgbnVsbCAhPSBuICYmICh0ID0gNjAgKiBhICsgbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoZSkge1xuICAgICAgdmFyIHQgPSBlICUgNjAsXG4gICAgICAgICAgciA9IE1hdGguZmxvb3IoZSAvIDYwKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1pbnV0ZTogdCxcbiAgICAgICAgaG91cjI0OiByLFxuICAgICAgICBob3VyMTI6IHIgJSAxMiB8fCAxMixcbiAgICAgICAgYW1wbTogciA8IDEyID8gXCJhbVwiIDogXCJwbVwiXG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIG4gPSBmdW5jdGlvbiBuKGUsIHQpIHtcbiAgICAgIHJldHVybiAoXCIwMDAwXCIgKyBlKS5zbGljZSgtdCk7XG4gICAgfTtcblxuICAgIHQuZ2V0VGltZU9wdGlvbnMgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgZm9yICh2YXIgbyA9IFtdLCBpID0gZTsgaSA8PSB0OyBpICs9IHIpIHtcbiAgICAgICAgdmFyIGwgPSBhKGkpLFxuICAgICAgICAgICAgdSA9IGwubWludXRlLFxuICAgICAgICAgICAgYyA9IGwuaG91cjI0LFxuICAgICAgICAgICAgcyA9IGwuaG91cjEyLFxuICAgICAgICAgICAgZCA9IGwuYW1wbTtcbiAgICAgICAgby5wdXNoKHtcbiAgICAgICAgICB2YWx1ZTogbihjLCAyKSArIFwiOlwiICsgbih1LCAyKSxcbiAgICAgICAgICBsYWJlbDogcyArIFwiOlwiICsgbih1LCAyKSArIGRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlRJTUVfUElDS0VSX0NVU1RPTV9GSUxURVIgPSB0Lk1JTl9TVEVQID0gdC5ERUZBVUxUX1NURVAgPSB0LkRFRkFVTFRfTUlOX1RJTUVfTUlOVVRFUyA9IHQuREVGQVVMVF9NSU5fVElNRSA9IHQuREVGQVVMVF9NQVhfVElNRV9NSU5VVEVTID0gdC5ERUZBVUxUX01BWF9USU1FID0gdm9pZCAwO1xuICAgIHQuREVGQVVMVF9NQVhfVElNRSA9IFwiMjM6NTlcIjtcbiAgICB0LkRFRkFVTFRfTUFYX1RJTUVfTUlOVVRFUyA9IDE0Mzk7XG4gICAgdC5ERUZBVUxUX01JTl9USU1FID0gXCIwMDowMFwiO1xuICAgIHQuREVGQVVMVF9NSU5fVElNRV9NSU5VVEVTID0gMDtcbiAgICB0LkRFRkFVTFRfU1RFUCA9IDMwO1xuICAgIHQuTUlOX1NURVAgPSAxO1xuICAgIHQuVElNRV9QSUNLRVJfQ1VTVE9NX0ZJTFRFUiA9IHtcbiAgICAgIGZpbHRlcjogXCIwP3t7IGhvdXJRdWVyeUZpbHRlciB9fTp7e21pbnV0ZVF1ZXJ5RmlsdGVyfX0uKnt7IGFwUXVlcnlGaWx0ZXIgfX1tP1wiLFxuICAgICAgZXh0cmFzOiB7XG4gICAgICAgIGFwUXVlcnlGaWx0ZXI6IFwiKFthcF0pXCIsXG4gICAgICAgIGhvdXJRdWVyeUZpbHRlcjogXCIoWzEtOV1bMC0yXT8pXCIsXG4gICAgICAgIG1pbnV0ZVF1ZXJ5RmlsdGVyOiBcIltcXFxcZF0rOihbMC05XXswLDJ9KVwiXG4gICAgICB9XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVmFsaWRhdGlvbkNoZWNrbGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTIxID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyMSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKHIsIFwidXNhLWNoZWNrbGlzdFwiKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIF9pMjEoe1xuICAgICAgICBjbGFzc05hbWU6IHUsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJ2YWxpZGF0aW9uQ2hlY2tsaXN0XCJcbiAgICAgIH0sIG8pLCB0KTtcbiAgICB9O1xuXG4gICAgdC5WYWxpZGF0aW9uQ2hlY2tsaXN0ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVmFsaWRhdGlvbkl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyMiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGUuaXNWYWxpZCxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImlzVmFsaWRcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jaGVja2xpc3RfX2l0ZW1cIiwge1xuICAgICAgICBcInVzYS1jaGVja2xpc3RfX2l0ZW0tLWNoZWNrZWRcIjogb1xuICAgICAgfSwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTIyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1KSwgdCk7XG4gICAgfTtcblxuICAgIHQuVmFsaWRhdGlvbkl0ZW0gPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5FeHRlbmRlZE5hdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGwocigwKSksXG4gICAgICAgIG4gPSBsKHIoMSkpLFxuICAgICAgICBvID0gcigxMyksXG4gICAgICAgIGkgPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfdTIgPSBmdW5jdGlvbiB1KCkge1xuICAgICAgcmV0dXJuIChfdTIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHZhciB0ID0gZS5wcmltYXJ5SXRlbXMsXG4gICAgICAgICAgciA9IGUuc2Vjb25kYXJ5SXRlbXMsXG4gICAgICAgICAgbCA9IGUubW9iaWxlRXhwYW5kZWQsXG4gICAgICAgICAgcyA9IHZvaWQgMCAhPT0gbCAmJiBsLFxuICAgICAgICAgIGQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGYgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBwID0gZS5vblRvZ2dsZU1vYmlsZU5hdixcbiAgICAgICAgICBtID0gYyhlLCBbXCJwcmltYXJ5SXRlbXNcIiwgXCJzZWNvbmRhcnlJdGVtc1wiLCBcIm1vYmlsZUV4cGFuZGVkXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJvblRvZ2dsZU1vYmlsZU5hdlwiXSksXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLW5hdlwiLCB7XG4gICAgICAgIFwiaXMtdmlzaWJsZVwiOiBzXG4gICAgICB9LCBmKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm5hdlwiLCBfdTIoe1xuICAgICAgICBjbGFzc05hbWU6IHlcbiAgICAgIH0sIG0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtbmF2X19pbm5lclwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLk5hdkNsb3NlQnV0dG9uLCB7XG4gICAgICAgIG9uQ2xpY2s6IHBcbiAgICAgIH0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChpLk5hdkxpc3QsIHtcbiAgICAgICAgaXRlbXM6IHQsXG4gICAgICAgIHR5cGU6IFwicHJpbWFyeVwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW5hdl9fc2Vjb25kYXJ5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICBpdGVtczogcixcbiAgICAgICAgdHlwZTogXCJzZWNvbmRhcnlcIlxuICAgICAgfSksIGQpKSk7XG4gICAgfTtcblxuICAgIHQuRXh0ZW5kZWROYXYgPSBzO1xuICAgIHZhciBkID0gcztcbiAgICB0LmRlZmF1bHQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgci5yKHQpLCB0LmRlZmF1bHQgPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpUHo0OGMzWm5JSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkMmxrZEdnOUlqWTBJaUJvWldsbmFIUTlJalkwSWlCMmFXVjNRbTk0UFNJd0lEQWdOalFnTmpRaVBqeDBhWFJzWlQ1amJHOXpaVHd2ZEdsMGJHVStQSEJoZEdnZ1ptbHNiRDBpSXpVMk5VTTJOU0lnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCa1BTSk5OVGN1TURReUlERXVNVFZzTlM0NE1Ea2dOUzQ0TURoaE5DQTBJREFnTUNBeElEQWdOUzQyTlRkTU5ETXVORFkxSURNeWJERTVMak00TmlBeE9TNHpPRFZoTkNBMElEQWdNQ0F4SURBZ05TNDJOVGRzTFRVdU9EQTVJRFV1T0RBNVlUUWdOQ0F3SURBZ01TMDFMalkxTnlBd1RETXlJRFF6TGpRMk5TQXhNaTQyTVRVZ05qSXVPRFV4WVRRZ05DQXdJREFnTVMwMUxqWTFOeUF3YkMwMUxqZ3dPUzAxTGpnd09XRTBJRFFnTUNBd0lERWdNQzAxTGpZMU4wd3lNQzQxTXpVZ016SWdNUzR4TkRrZ01USXVOakUxWVRRZ05DQXdJREFnTVNBd0xUVXVOalUzYkRVdU9EQTVMVFV1T0RBNVlUUWdOQ0F3SURBZ01TQTFMalkxTnlBd1RETXlJREl3TGpVek5TQTFNUzR6T0RVZ01TNHhORGxoTkNBMElEQWdNQ0F4SURVdU5qVTNJREI2SWk4K1BDOXpkbWMrXCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkhlYWRlciA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTIzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuSGVhZGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5iYXNpYyxcbiAgICAgICAgICByID0gZS5leHRlbmRlZCxcbiAgICAgICAgICBvID0gZS5iYXNpY1dpdGhNZWdhTWVudSxcbiAgICAgICAgICB1ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBjID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgcyA9IGwoZSwgW1wiYmFzaWNcIiwgXCJleHRlbmRlZFwiLCBcImJhc2ljV2l0aE1lZ2FNZW51XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGQgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1oZWFkZXJcIiwge1xuICAgICAgICBcInVzYS1oZWFkZXItLWJhc2ljXCI6IHQsXG4gICAgICAgIFwidXNhLWhlYWRlci0tbWVnYW1lbnVcIjogbyxcbiAgICAgICAgXCJ1c2EtaGVhZGVyLS1leHRlbmRlZFwiOiByXG4gICAgICB9LCBjKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImhlYWRlclwiLCBfaTIzKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImhlYWRlclwiLFxuICAgICAgICBjbGFzc05hbWU6IGRcbiAgICAgIH0sIHMpLCB1KTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5NZWdhTWVudSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcig0KTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2w5ID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2w5ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUuaXNPcGVuLFxuICAgICAgICAgIGkgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBjID0gdShlLCBbXCJpdGVtc1wiLCBcImlzT3BlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgcyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLW5hdl9fc3VibWVudSB1c2EtbWVnYW1lbnVcIiwgaSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHMsXG4gICAgICAgIGhpZGRlbjogIXIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJtZWdhbWVudVwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLXJvdyBncmlkLWdhcC00XCJcbiAgICAgIH0sIHQubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xcIixcbiAgICAgICAgICBrZXk6IFwic3VibmF2X2NvbF9cIiArIHRcbiAgICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5OYXZMaXN0LCBfbDkoe1xuICAgICAgICAgIGl0ZW1zOiBlLFxuICAgICAgICAgIHR5cGU6IFwibWVnYW1lbnVcIlxuICAgICAgICB9LCBjKSkpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuXG4gICAgdC5NZWdhTWVudSA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0Lk1lbnUgPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgbyA9IHIoNCk7XG5cbiAgICB2YXIgX2kyNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuaXRlbXMsXG4gICAgICAgICAgYSA9IGUuaXNPcGVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcIml0ZW1zXCIsIFwiaXNPcGVuXCJdKTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLk5hdkxpc3QsIF9pMjQoe1xuICAgICAgICBjbGFzc05hbWU6IHQsXG4gICAgICAgIGl0ZW1zOiByLFxuICAgICAgICB0eXBlOiBcInN1Ym5hdlwiLFxuICAgICAgICBoaWRkZW46ICFhXG4gICAgICB9LCB1KSk7XG4gICAgfTtcblxuICAgIHQuTWVudSA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0Lk5hdk1lbnVCdXR0b24gPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfTtcblxuICAgIHZhciBfbyA9IGZ1bmN0aW9uIG8oKSB7XG4gICAgICByZXR1cm4gKF9vID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBpID0gZnVuY3Rpb24gaShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5OYXZNZW51QnV0dG9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5sYWJlbCxcbiAgICAgICAgICByID0gZS5vbkNsaWNrLFxuICAgICAgICAgIGEgPSBpKGUsIFtcImxhYmVsXCIsIFwib25DbGlja1wiXSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX28oe1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW1lbnUtYnRuXCIsXG4gICAgICAgIG9uQ2xpY2s6IHIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJuYXZNZW51QnV0dG9uXCJcbiAgICAgIH0sIGEsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSksIHQpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0Lk5hdkRyb3BEb3duQnV0dG9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMjUgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTI1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUubGFiZWwsXG4gICAgICAgICAgciA9IGUubWVudUlkLFxuICAgICAgICAgIG8gPSBlLmlzT3BlbixcbiAgICAgICAgICB1ID0gZS5vblRvZ2dsZSxcbiAgICAgICAgICBjID0gZS5pc0N1cnJlbnQsXG4gICAgICAgICAgcyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGQgPSBsKGUsIFtcImxhYmVsXCIsIFwibWVudUlkXCIsIFwiaXNPcGVuXCIsIFwib25Ub2dnbGVcIiwgXCJpc0N1cnJlbnRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGYgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1hY2NvcmRpb25fX2J1dHRvblwiLCBcInVzYS1uYXZfX2xpbmtcIiwge1xuICAgICAgICBcInVzYS1jdXJyZW50XCI6IGNcbiAgICAgIH0sIHMpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9pMjUoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwibmF2RHJvcERvd25CdXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBmLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogbyxcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgcmV0dXJuIHUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZCwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIHQpKTtcbiAgICB9O1xuXG4gICAgdC5OYXZEcm9wRG93bkJ1dHRvbiA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlByaW1hcnlOYXYgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBsKHIoMCkpLFxuICAgICAgICBuID0gbChyKDEpKSxcbiAgICAgICAgbyA9IHIoMTMpLFxuICAgICAgICBpID0gcig0KTtcblxuICAgIGZ1bmN0aW9uIGwoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3UzID0gZnVuY3Rpb24gdSgpIHtcbiAgICAgIHJldHVybiAoX3UzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICBzID0gZnVuY3Rpb24gcyhlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUub25Ub2dnbGVNb2JpbGVOYXYsXG4gICAgICAgICAgbCA9IGUubW9iaWxlRXhwYW5kZWQsXG4gICAgICAgICAgcyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgZCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGYgPSBjKGUsIFtcIml0ZW1zXCIsIFwib25Ub2dnbGVNb2JpbGVOYXZcIiwgXCJtb2JpbGVFeHBhbmRlZFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBwID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbmF2XCIsIHtcbiAgICAgICAgXCJpcy12aXNpYmxlXCI6IGxcbiAgICAgIH0sIGQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibmF2XCIsIF91Myh7XG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgZiksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTmF2Q2xvc2VCdXR0b24sIHtcbiAgICAgICAgb25DbGljazogclxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICBpdGVtczogdCxcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCJcbiAgICAgIH0pLCBzKTtcbiAgICB9O1xuXG4gICAgdC5QcmltYXJ5TmF2ID0gcztcbiAgICB2YXIgZCA9IHM7XG4gICAgdC5kZWZhdWx0ID0gZDtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVGl0bGUgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyNiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1sb2dvXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMjYoe1xuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImVtXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1sb2dvX190ZXh0XCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuXG4gICAgdC5UaXRsZSA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyNyA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pZGVudGlmaWVyXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMjcoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiaWRlbnRpZmllclwiLFxuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCByKTtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllckdvdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTI4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX3NlY3Rpb24gdXNhLWlkZW50aWZpZXJfX3NlY3Rpb24tLXVzYWdvdlwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2kyOCh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJpZGVudGlmaWVyR292XCIsXG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19jb250YWluZXJcIlxuICAgICAgfSwgdCkpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJHb3YgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5JZGVudGlmaWVySWRlbnRpdHkgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyOSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5kb21haW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiZG9tYWluXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9faWRlbnRpdHlcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2kyOSh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJpZGVudGlmaWVySWRlbnRpdHlcIixcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19pZGVudGl0eS1kb21haW5cIlxuICAgICAgfSwgciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaWRlbnRpZmllcl9faWRlbnRpdHktZGlzY2xhaW1lclwiXG4gICAgICB9LCB0KSk7XG4gICAgfTtcblxuICAgIHQuSWRlbnRpZmllcklkZW50aXR5ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuSWRlbnRpZmllckxpbmsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gdShlLCBbXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGkgPSAoMCwgbi5kZWZhdWx0KSh0LCBcInVzYS1pZGVudGlmaWVyX19yZXF1aXJlZC1saW5rXCIpLFxuICAgICAgICAgIGMgPSBfbDEwKF9sMTAoe30sIHIpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSk7XG5cbiAgICAgIGlmICgoMCwgby5pc0N1c3RvbVByb3BzKShjKSkgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMCh7fSwgYykpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMCh7fSwgYykpO1xuICAgIH07XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMTApO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDEwID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2wxMCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuSWRlbnRpZmllckxpbmtJdGVtID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyTGlua0l0ZW0gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX3JlcXVpcmVkLWxpbmtzLWl0ZW1cIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTMwKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllckxpbmtzID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzEgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMxID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLm5hdlByb3BzLFxuICAgICAgICAgIGwgPSBlLmxpc3RQcm9wcyxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fc2VjdGlvbiB1c2EtaWRlbnRpZmllcl9fc2VjdGlvbi0tcmVxdWlyZWQtbGlua3NcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJuYXZcIiwgX2kzMSh7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19jb250YWluZXJcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfaTMxKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19yZXF1aXJlZC1saW5rcy1saXN0XCJcbiAgICAgIH0sIGwpLCB0KSkpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJMaW5rcyA9IGw7XG4gICAgdmFyIHUgPSBsO1xuICAgIHQuZGVmYXVsdCA9IHU7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LklkZW50aWZpZXJMb2dvID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzIgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyTG9nbyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fbG9nb1wiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIiwgX2kzMih7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHQpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXJMb2dvcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTMzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX2xvZ29zXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMzMoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiaWRlbnRpZmllckxvZ29zXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHQpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJMb2dvcyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXJNYXN0aGVhZCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM0ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX3NlY3Rpb24gdXNhLWlkZW50aWZpZXJfX3NlY3Rpb24tLW1hc3RoZWFkXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCBfaTM0KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImlkZW50aWZpZXJNYXN0aGVhZFwiLFxuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaWRlbnRpZmllcl9fY29udGFpbmVyXCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyTWFzdGhlYWQgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5BZGRyZXNzID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHQuQWRkcmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuc2l6ZSxcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgaSA9IGUuYmlnLFxuICAgICAgICAgIGwgPSBlLm1lZGl1bSxcbiAgICAgICAgICB1ID0gZS5zbGltLFxuICAgICAgICAgIGMgPSBlLml0ZW1zO1xuICAgICAgaSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGwgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBtZWRpdW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCB1ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgc2xpbSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIik7XG4gICAgICB2YXIgcyA9IHQgPyBcImJpZ1wiID09PSB0IDogaSxcbiAgICAgICAgICBkID0gdCA/IFwibWVkaXVtXCIgPT09IHQgOiBsLFxuICAgICAgICAgIGYgPSB0ID8gXCJzbGltXCIgPT09IHQgOiB1LFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb290ZXJfX2FkZHJlc3NcIiwgciksXG4gICAgICAgICAgbSA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJncmlkLWNvbC1hdXRvXCI6IHMgfHwgZCxcbiAgICAgICAgXCJncmlkLWNvbC1hdXRvIG1vYmlsZS1sZzpncmlkLWNvbC0xMiBkZXNrdG9wOmdyaWQtY29sLWF1dG9cIjogZlxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhZGRyZXNzXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBwXG4gICAgICB9LCBmID8gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZ3JpZC1yb3cgZ3JpZC1nYXBcIlxuICAgICAgfSwgYy5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IG0sXG4gICAgICAgICAga2V5OiBcImFkZHJlc3NJdGVtLVwiICsgdFxuICAgICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1mb290ZXJfX2NvbnRhY3QtaW5mb1wiXG4gICAgICAgIH0sIGUpKTtcbiAgICAgIH0pKSA6IGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1mb290ZXJfX2NvbnRhY3QtaW5mbyBncmlkLXJvdyBncmlkLWdhcFwiXG4gICAgICB9LCBjLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogbSxcbiAgICAgICAgICBrZXk6IFwiYWRkcmVzc0l0ZW0tXCIgKyB0XG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb290ZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMTEgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDExID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Gb290ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnNpemUsXG4gICAgICAgICAgciA9IGUuYmlnLFxuICAgICAgICAgIGkgPSBlLm1lZGl1bSxcbiAgICAgICAgICBjID0gZS5zbGltLFxuICAgICAgICAgIHMgPSBlLnJldHVyblRvVG9wLFxuICAgICAgICAgIGQgPSBlLnByaW1hcnksXG4gICAgICAgICAgZiA9IGUuc2Vjb25kYXJ5LFxuICAgICAgICAgIHAgPSB1KGUsIFtcInNpemVcIiwgXCJiaWdcIiwgXCJtZWRpdW1cIiwgXCJzbGltXCIsIFwicmV0dXJuVG9Ub3BcIiwgXCJwcmltYXJ5XCIsIFwic2Vjb25kYXJ5XCJdKTtcbiAgICAgIHIgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3RlciBwcm9wZXJ0eSBiaWcgaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCBpICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXIgcHJvcGVydHkgbWVkaXVtIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgYyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyIHByb3BlcnR5IHNsaW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpO1xuICAgICAgdmFyIG0gPSB0ID8gXCJiaWdcIiA9PT0gdCA6IHIsXG4gICAgICAgICAgeSA9IHQgPyBcIm1lZGl1bVwiID09PSB0IDogaSxcbiAgICAgICAgICBiID0gdCA/IFwic2xpbVwiID09PSB0IDogYyxcbiAgICAgICAgICB2ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyXCIsIHtcbiAgICAgICAgXCJ1c2EtZm9vdGVyLS1iaWdcIjogbSxcbiAgICAgICAgXCJ1c2EtZm9vdGVyLS1tZWRpdW1cIjogeSxcbiAgICAgICAgXCJ1c2EtZm9vdGVyLS1zbGltXCI6IGJcbiAgICAgIH0sIHAuY2xhc3NOYW1lKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImZvb3RlclwiLCBfbDExKHt9LCBwLCB7XG4gICAgICAgIGNsYXNzTmFtZTogdlxuICAgICAgfSksIHMgJiYgcywgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZvb3Rlcl9fcHJpbWFyeS1zZWN0aW9uXCJcbiAgICAgIH0sIGQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZm9vdGVyX19zZWNvbmRhcnktc2VjdGlvblwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLWNvbnRhaW5lclwiXG4gICAgICB9LCBmKSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkZvb3Rlck5hdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGwocigwKSksXG4gICAgICAgIG4gPSByKDE4KSxcbiAgICAgICAgbyA9IGwocigxKSksXG4gICAgICAgIGkgPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfdTQgPSBmdW5jdGlvbiB1KCkge1xuICAgICAgcmV0dXJuIChfdTQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHJldHVybiBlWzBdLmNvbnN0cnVjdG9yID09PSBBcnJheTtcbiAgICB9XG5cbiAgICB0LkZvb3Rlck5hdiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLnNpemUsXG4gICAgICAgICAgbCA9IGUuYmlnLFxuICAgICAgICAgIGQgPSBlLm1lZGl1bSxcbiAgICAgICAgICBmID0gZS5zbGltLFxuICAgICAgICAgIHAgPSBlLmlzTW9iaWxlLFxuICAgICAgICAgIG0gPSBlLmxpbmtzLFxuICAgICAgICAgIHkgPSBjKGUsIFtcImNsYXNzTmFtZVwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJtZWRpdW1cIiwgXCJzbGltXCIsIFwiaXNNb2JpbGVcIiwgXCJsaW5rc1wiXSk7XG4gICAgICBsICYmICgwLCBpLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgYmlnIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgZCAmJiAoMCwgaS5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IG1lZGl1bSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGYgJiYgKDAsIGkuZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBzbGltIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKTtcblxuICAgICAgdmFyIGIgPSByID8gXCJiaWdcIiA9PT0gciA6IGwsXG4gICAgICAgICAgdiA9IHIgPyBcIm1lZGl1bVwiID09PSByIDogZCxcbiAgICAgICAgICBPID0gciA/IFwic2xpbVwiID09PSByIDogZixcbiAgICAgICAgICBnID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyX19uYXZcIiwgdCksXG4gICAgICAgICAgXyA9ICgwLCBvLmRlZmF1bHQpKFwiZGVza3RvcDpncmlkLWNvbC1hdXRvIHVzYS1mb290ZXJfX3ByaW1hcnktY29udGVudFwiLCB7XG4gICAgICAgIFwibW9iaWxlLWxnOmdyaWQtY29sLTRcIjogYiB8fCB2LFxuICAgICAgICBcIm1vYmlsZS1sZzpncmlkLWNvbC02XCI6IE9cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJuYXZcIiwgX3U0KHtcbiAgICAgICAgY2xhc3NOYW1lOiBnXG4gICAgICB9LCB5KSwgYiAmJiBzKG0pICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uRm9vdGVyRXh0ZW5kZWROYXZMaXN0LCB7XG4gICAgICAgIGlzTW9iaWxlOiBwLFxuICAgICAgICBuZXN0ZWRMaW5rczogbVxuICAgICAgfSksICFzKG0pICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZ3JpZC1yb3cgZ3JpZC1nYXBcIlxuICAgICAgfSwgbS5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgIGtleTogXCJuYXZMaW5rLVwiICsgdCxcbiAgICAgICAgICBjbGFzc05hbWU6IF9cbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkxvZ28gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkxvZ28gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnNpemUsXG4gICAgICAgICAgciA9IGUuYmlnLFxuICAgICAgICAgIGkgPSBlLm1lZGl1bSxcbiAgICAgICAgICB1ID0gZS5zbGltLFxuICAgICAgICAgIGMgPSBlLmhlYWRpbmcsXG4gICAgICAgICAgcyA9IGUuaW1hZ2UsXG4gICAgICAgICAgZCA9IGwoZSwgW1wic2l6ZVwiLCBcImJpZ1wiLCBcIm1lZGl1bVwiLCBcInNsaW1cIiwgXCJoZWFkaW5nXCIsIFwiaW1hZ2VcIl0pO1xuICAgICAgciAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGkgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBtZWRpdW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCB1ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgc2xpbSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIik7XG4gICAgICB2YXIgZiA9IHQgPyBcImJpZ1wiID09PSB0IDogcixcbiAgICAgICAgICBwID0gdCA/IFwibWVkaXVtXCIgPT09IHQgOiBpLFxuICAgICAgICAgIG0gPSB0ID8gXCJzbGltXCIgPT09IHQgOiB1LFxuICAgICAgICAgIHkgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb290ZXJfX2xvZ28gZ3JpZC1yb3dcIiwge1xuICAgICAgICBcIm1vYmlsZS1sZzpncmlkLWNvbC02IG1vYmlsZS1sZzpncmlkLWdhcC0yXCI6IGYgfHwgcCxcbiAgICAgICAgXCJncmlkLWdhcC0yXCI6IG1cbiAgICAgIH0sIGQuY2xhc3NOYW1lKSxcbiAgICAgICAgICBiID0gKDAsIG4uZGVmYXVsdCkoe1xuICAgICAgICBcIm1vYmlsZS1sZzpncmlkLWNvbC1hdXRvXCI6IGYgfHwgcCxcbiAgICAgICAgXCJncmlkLWNvbC1hdXRvXCI6IG1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB5LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9vdGVyTG9nb1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBiXG4gICAgICB9LCBzKSwgYyAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYlxuICAgICAgfSwgYykpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Tb2NpYWxMaW5rcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHQuU29jaWFsTGlua3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5saW5rcyxcbiAgICAgICAgICBvID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyX19zb2NpYWwtbGlua3MgZ3JpZC1yb3cgZ3JpZC1nYXAtMVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogb1xuICAgICAgfSwgci5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBrZXk6IFwic29jaWFsTGlua1wiICsgdCxcbiAgICAgICAgICBjbGFzc05hbWU6IFwiZ3JpZC1jb2wtYXV0b1wiXG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRHcm91cCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmQtZ3JvdXBcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfaTM1KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiQ2FyZEdyb3VwXCJcbiAgICAgIH0sIG8pLCB0KTtcbiAgICB9O1xuXG4gICAgdC5DYXJkR3JvdXAgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DYXJkID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDE1KTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wxMiA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMTIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0ID0gZS5sYXlvdXQsXG4gICAgICAgICAgciA9IHZvaWQgMCA9PT0gdCA/IFwic3RhbmRhcmREZWZhdWx0XCIgOiB0LFxuICAgICAgICAgIGkgPSBlLmhlYWRlckZpcnN0LFxuICAgICAgICAgIGMgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHMgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBkID0gZS5ncmlkTGF5b3V0LFxuICAgICAgICAgIGYgPSBlLmNvbnRhaW5lclByb3BzLFxuICAgICAgICAgIHAgPSB1KGUsIFtcImxheW91dFwiLCBcImhlYWRlckZpcnN0XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJncmlkTGF5b3V0XCIsIFwiY29udGFpbmVyUHJvcHNcIl0pLFxuICAgICAgICAgIG0gPSBmIHx8IHt9LFxuICAgICAgICAgIHkgPSBtLmNsYXNzTmFtZSxcbiAgICAgICAgICBiID0gdShtLCBbXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHYgPSBkICYmICgwLCBvLmFwcGx5R3JpZENsYXNzZXMpKGQpLFxuICAgICAgICAgIE8gPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jYXJkXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZC0taGVhZGVyLWZpcnN0XCI6IGksXG4gICAgICAgIFwidXNhLWNhcmQtLWZsYWdcIjogXCJmbGFnRGVmYXVsdFwiID09PSByIHx8IFwiZmxhZ01lZGlhUmlnaHRcIiA9PT0gcixcbiAgICAgICAgXCJ1c2EtY2FyZC0tbWVkaWEtcmlnaHRcIjogXCJmbGFnTWVkaWFSaWdodFwiID09PSByXG4gICAgICB9LCB2LCBzKSxcbiAgICAgICAgICBnID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9fY29udGFpbmVyXCIsIHkpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2wxMih7XG4gICAgICAgIGNsYXNzTmFtZTogTyxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIkNhcmRcIlxuICAgICAgfSwgcCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9sMTIoe1xuICAgICAgICBjbGFzc05hbWU6IGdcbiAgICAgIH0sIGIpLCBjKSk7XG4gICAgfTtcblxuICAgIHQuQ2FyZCA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRIZWFkZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzNiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5leGRlbnQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImV4ZGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9faGVhZGVyXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZF9faGVhZGVyLS1leGRlbnRcIjogdFxuICAgICAgfSwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwgX2kzNih7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiQ2FyZEhlYWRlclwiXG4gICAgICB9KSwgcik7XG4gICAgfTtcblxuICAgIHQuQ2FyZEhlYWRlciA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRNZWRpYSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM3ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmV4ZGVudCxcbiAgICAgICAgICByID0gZS5pbnNldCxcbiAgICAgICAgICBvID0gZS5pbWFnZUNsYXNzLFxuICAgICAgICAgIHUgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGMgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBzID0gbChlLCBbXCJleGRlbnRcIiwgXCJpbnNldFwiLCBcImltYWdlQ2xhc3NcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgZCA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRfX21lZGlhXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZF9fbWVkaWEtLWV4ZGVudFwiOiB0LFxuICAgICAgICBcInVzYS1jYXJkX19tZWRpYS0taW5zZXRcIjogclxuICAgICAgfSwgYyksXG4gICAgICAgICAgZiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRfX2ltZ1wiLCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTM3KHtcbiAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICB9LCBzLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJDYXJkTWVkaWFcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBmXG4gICAgICB9LCB1KSk7XG4gICAgfTtcblxuICAgIHQuQ2FyZE1lZGlhID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQ2FyZEJvZHkgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzOCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5leGRlbnQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImV4ZGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9fYm9keVwiLCB7XG4gICAgICAgIFwidXNhLWNhcmRfX2JvZHktLWV4ZGVudFwiOiB0XG4gICAgICB9LCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTM4KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1LCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJDYXJkQm9keVwiXG4gICAgICB9KSwgcik7XG4gICAgfTtcblxuICAgIHQuQ2FyZEJvZHkgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DYXJkRm9vdGVyID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzkgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTM5ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuZXhkZW50LFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJleGRlbnRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRfX2Zvb3RlclwiLCB7XG4gICAgICAgIFwidXNhLWNhcmRfX2Zvb3Rlci0tZXhkZW50XCI6IHRcbiAgICAgIH0sIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMzkoe1xuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIkNhcmRGb290ZXJcIlxuICAgICAgfSksIHIpO1xuICAgIH07XG5cbiAgICB0LkNhcmRGb290ZXIgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5CcmVhZGNydW1iQmFyID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdC5CcmVhZGNydW1iQmFyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS52YXJpYW50LFxuICAgICAgICAgIHIgPSB2b2lkIDAgPT09IHQgPyBcImRlZmF1bHRcIiA6IHQsXG4gICAgICAgICAgbyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLm5hdlByb3BzLFxuICAgICAgICAgIGMgPSBlLmxpc3RQcm9wcyxcbiAgICAgICAgICBzID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtYnJlYWRjcnVtYlwiLCB7XG4gICAgICAgIFwidXNhLWJyZWFkY3J1bWItLXdyYXBcIjogXCJ3cmFwXCIgPT09IHJcbiAgICAgIH0sIGwpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibmF2XCIsIF9pNDAoe1xuICAgICAgICBjbGFzc05hbWU6IHNcbiAgICAgIH0sIHUsIHtcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiQnJlYWRjcnVtYnNcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib2xcIiwgX2k0MCh7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYnJlYWRjcnVtYl9fbGlzdFwiXG4gICAgICB9LCBjKSwgbykpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkJyZWFkY3J1bWIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0MSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmN1cnJlbnQsXG4gICAgICAgICAgbyA9IHZvaWQgMCAhPT0gciAmJiByLFxuICAgICAgICAgIHUgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBjID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImN1cnJlbnRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1icmVhZGNydW1iX19saXN0LWl0ZW1cIiwge1xuICAgICAgICBcInVzYS1jdXJyZW50XCI6IG9cbiAgICAgIH0sIHUpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2k0MSh7XG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogbyA/IFwicGFnZVwiIDogdm9pZCAwXG4gICAgICB9LCBjKSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQnJlYWRjcnVtYkxpbmsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gdShlLCBbXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGkgPSAoMCwgYS5kZWZhdWx0KSh0LCBcInVzYS1icmVhZGNydW1iX19saW5rXCIpLFxuICAgICAgICAgIGMgPSBfbDEzKF9sMTMoe30sIHIpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSk7XG5cbiAgICAgIGlmICgoMCwgby5pc0N1c3RvbVByb3BzKShjKSkgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMyh7fSwgYywge1xuICAgICAgICB2YXJpYW50OiBcInVuc3R5bGVkXCJcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLkxpbmssIF9sMTMoe30sIGMsIHtcbiAgICAgICAgdmFyaWFudDogXCJ1bnN0eWxlZFwiXG4gICAgICB9KSk7XG4gICAgfTtcbiAgICB2YXIgYSA9IGkocigxKSksXG4gICAgICAgIG4gPSBpKHIoMCkpLFxuICAgICAgICBvID0gcigxMCk7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMTMgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDEzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5TdGVwSW5kaWNhdG9yID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDIgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdC5TdGVwSW5kaWNhdG9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0LFxuICAgICAgICAgIHIgPSBlLnNob3dMYWJlbHMsXG4gICAgICAgICAgbyA9IHZvaWQgMCA9PT0gciB8fCByLFxuICAgICAgICAgIGwgPSBlLmNvdW50ZXJzLFxuICAgICAgICAgIHUgPSB2b2lkIDAgPT09IGwgPyBcIm5vbmVcIiA6IGwsXG4gICAgICAgICAgYyA9IGUuY2VudGVyZWQsXG4gICAgICAgICAgcyA9IHZvaWQgMCAhPT0gYyAmJiBjLFxuICAgICAgICAgIGQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGYgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBwID0gZS5kaXZQcm9wcyxcbiAgICAgICAgICBtID0gZS5saXN0UHJvcHMsXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXN0ZXAtaW5kaWNhdG9yXCIsIHtcbiAgICAgICAgXCJ1c2Etc3RlcC1pbmRpY2F0b3ItLW5vLWxhYmVsc1wiOiAhbyxcbiAgICAgICAgXCJ1c2Etc3RlcC1pbmRpY2F0b3ItLWNvdW50ZXJzXCI6IFwiZGVmYXVsdFwiID09PSB1LFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvci0tY291bnRlcnMtc21cIjogXCJzbWFsbFwiID09PSB1LFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvci0tY2VudGVyXCI6IHNcbiAgICAgIH0sIGYpLFxuICAgICAgICAgIGIgPSAtMSA9PT0gKHQgPSBkLmZpbmRJbmRleChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gXCJjdXJyZW50XCIgPT09IGUucHJvcHMuc3RhdHVzO1xuICAgICAgfSkpID8gMCA6IHQsXG4gICAgICAgICAgdiA9IGIgKyAxLFxuICAgICAgICAgIE8gPSBkW3BhcnNlSW50KFwiXCIgKyBiKV0ucHJvcHMubGFiZWwsXG4gICAgICAgICAgZyA9IGQubGVuZ3RoO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pNDIoe1xuICAgICAgICBjbGFzc05hbWU6IHksXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzdGVwLWluZGljYXRvclwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJwcm9ncmVzc1wiXG4gICAgICB9LCBwKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvbFwiLCBfaTQyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudHNcIlxuICAgICAgfSwgbSksIGQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX2hlYWRlclwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgyXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9faGVhZGluZ1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19oZWFkaW5nLWNvdW50ZXJcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zci1vbmx5XCJcbiAgICAgIH0sIFwiU3RlcFwiKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fY3VycmVudC1zdGVwXCJcbiAgICAgIH0sIHYpLCBcIsKgXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX3RvdGFsLXN0ZXBzXCJcbiAgICAgIH0sIFwib2YgXCIgKyBnKSwgXCLCoFwiKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9faGVhZGluZy10ZXh0XCJcbiAgICAgIH0sIE8pKSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlN0ZXBJbmRpY2F0b3JTdGVwID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDEpKSxcbiAgICAgICAgbiA9IG8ocigwKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5TdGVwSW5kaWNhdG9yU3RlcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUubGFiZWwsXG4gICAgICAgICAgciA9IGUuc3RhdHVzLFxuICAgICAgICAgIG8gPSB2b2lkIDAgPT09IHIgPyBcImluY29tcGxldGVcIiA6IHIsXG4gICAgICAgICAgdSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGMgPSBsKGUsIFtcImxhYmVsXCIsIFwic3RhdHVzXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBzID0gKDAsIGEuZGVmYXVsdCkoXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX3NlZ21lbnRcIiwge1xuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudC0tY29tcGxldGVcIjogXCJjb21wbGV0ZVwiID09PSBvLFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudC0tY3VycmVudFwiOiBcImN1cnJlbnRcIiA9PT0gb1xuICAgICAgfSwgdSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTQzKHtcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBcImN1cnJlbnRcIiA9PT0gbyA/IFwidHJ1ZVwiIDogdm9pZCAwXG4gICAgICB9LCBjKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudC1sYWJlbFwiXG4gICAgICB9LCB0LCBcIsKgXCIsIFwiY3VycmVudFwiICE9PSBvICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3Itb25seVwiXG4gICAgICB9LCBcImNvbXBsZXRlXCIgPT09IG8gPyBcImNvbXBsZXRlZFwiIDogXCJub3QgY29tcGxldGVkXCIpKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuU2VhcmNoID0gdm9pZCAwO1xuICAgIHZhciBhID0gcyhyKDApKSxcbiAgICAgICAgbiA9IHMocigxKSksXG4gICAgICAgIG8gPSByKDIpLFxuICAgICAgICBpID0gcigxNCksXG4gICAgICAgIGwgPSByKDE3KSxcbiAgICAgICAgdSA9IHIoNSksXG4gICAgICAgIGMgPSByKDcpO1xuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfZDIgPSBmdW5jdGlvbiBkKCkge1xuICAgICAgcmV0dXJuIChfZDIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHAgPSBmdW5jdGlvbiBwKGUpIHtcbiAgICAgIHZhciB0ID0gZS5vblN1Ym1pdCxcbiAgICAgICAgICByID0gZS5zaXplLFxuICAgICAgICAgIHMgPSBlLmJpZyxcbiAgICAgICAgICBwID0gZS5zbWFsbCxcbiAgICAgICAgICBtID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgeSA9IGUucGxhY2Vob2xkZXIsXG4gICAgICAgICAgYiA9IGUuaW5wdXROYW1lLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBcInNlYXJjaFwiIDogYixcbiAgICAgICAgICBPID0gZS5sYWJlbCxcbiAgICAgICAgICBnID0gdm9pZCAwID09PSBPID8gXCJTZWFyY2hcIiA6IE8sXG4gICAgICAgICAgXyA9IGUuaW5wdXRJZCxcbiAgICAgICAgICBoID0gdm9pZCAwID09PSBfID8gXCJzZWFyY2gtZmllbGRcIiA6IF8sXG4gICAgICAgICAgaiA9IGUuaTE4bixcbiAgICAgICAgICBNID0gZihlLCBbXCJvblN1Ym1pdFwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJzbWFsbFwiLCBcImNsYXNzTmFtZVwiLCBcInBsYWNlaG9sZGVyXCIsIFwiaW5wdXROYW1lXCIsIFwibGFiZWxcIiwgXCJpbnB1dElkXCIsIFwiaTE4blwiXSk7XG4gICAgICBzICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJTZWFyY2ggcHJvcGVydHkgYmlnIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgcCAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiU2VhcmNoIHByb3BlcnR5IHNtYWxsIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKTtcbiAgICAgIHZhciBOID0gKG51bGwgPT0gaiA/IHZvaWQgMCA6IGouYnV0dG9uVGV4dCkgfHwgXCJTZWFyY2hcIixcbiAgICAgICAgICBFID0gciA/IFwiYmlnXCIgPT09IHIgOiBzLFxuICAgICAgICAgIFAgPSByID8gXCJzbWFsbFwiID09PSByIDogcCxcbiAgICAgICAgICB3ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc2VhcmNoXCIsIHtcbiAgICAgICAgXCJ1c2Etc2VhcmNoLS1zbWFsbFwiOiBQLFxuICAgICAgICBcInVzYS1zZWFyY2gtLWJpZ1wiOiBFXG4gICAgICB9LCBtKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLkZvcm0sIF9kMih7XG4gICAgICAgIG9uU3VibWl0OiB0LFxuICAgICAgICBjbGFzc05hbWU6IHcsXG4gICAgICAgIHJvbGU6IFwic2VhcmNoXCIsXG4gICAgICAgIHNlYXJjaDogITBcbiAgICAgIH0sIE0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LkxhYmVsLCB7XG4gICAgICAgIHNyT25seTogITAsXG4gICAgICAgIGh0bWxGb3I6IGhcbiAgICAgIH0sIGcpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLlRleHRJbnB1dCwge1xuICAgICAgICBpZDogaCxcbiAgICAgICAgdHlwZTogXCJzZWFyY2hcIixcbiAgICAgICAgbmFtZTogdixcbiAgICAgICAgcGxhY2Vob2xkZXI6IHlcbiAgICAgIH0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChpLkJ1dHRvbiwge1xuICAgICAgICB0eXBlOiBcInN1Ym1pdFwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFAgPyBcInVzYS1zci1vbmx5XCIgOiBcInVzYS1zZWFyY2hfX3N1Ym1pdC10ZXh0XCJcbiAgICAgIH0sIE4pKSk7XG4gICAgfTtcblxuICAgIHQuU2VhcmNoID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuU3VtbWFyeUJveCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTQ0ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k0NCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmhlYWRpbmcsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImhlYWRpbmdcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXN1bW1hcnktYm94XCIsIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pNDQoe1xuICAgICAgICBjbGFzc05hbWU6IGMsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzdW1tYXJ5LWJveFwiXG4gICAgICB9LCB1KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN1bW1hcnktYm94X19ib2R5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN1bW1hcnktYm94X19oZWFkaW5nXCJcbiAgICAgIH0sIHQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3VtbWFyeS1ib3hfX3RleHRcIlxuICAgICAgfSwgcikpKTtcbiAgICB9O1xuXG4gICAgdC5TdW1tYXJ5Qm94ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuUHJvY2Vzc0xpc3QgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0NSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDUgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1wcm9jZXNzLWxpc3RcIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvbFwiLCBfaTQ1KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcblxuICAgIHQuUHJvY2Vzc0xpc3QgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Qcm9jZXNzTGlzdEl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0NiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1wcm9jZXNzLWxpc3RfX2l0ZW1cIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTQ2KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcblxuICAgIHQuUHJvY2Vzc0xpc3RJdGVtID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuUHJvY2Vzc0xpc3RIZWFkaW5nID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDcgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQ3ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Qcm9jZXNzTGlzdEhlYWRpbmcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnR5cGUsXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcInR5cGVcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXByb2Nlc3MtbGlzdF9faGVhZGluZ1wiLCByKSxcbiAgICAgICAgICBzID0gdDtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChzLCBfaTQ3KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInByb2Nlc3NMaXN0SGVhZGluZ1wiLFxuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUpLCBvKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5TaXRlQWxlcnQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0OCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS52YXJpYW50LFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLmhlYWRpbmcsXG4gICAgICAgICAgdSA9IGUuc2hvd0ljb24sXG4gICAgICAgICAgYyA9IHZvaWQgMCA9PT0gdSB8fCB1LFxuICAgICAgICAgIHMgPSBlLnNsaW0sXG4gICAgICAgICAgZCA9IHZvaWQgMCAhPT0gcyAmJiBzLFxuICAgICAgICAgIGYgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBwID0gbChlLCBbXCJ2YXJpYW50XCIsIFwiY2hpbGRyZW5cIiwgXCJoZWFkaW5nXCIsIFwic2hvd0ljb25cIiwgXCJzbGltXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc2l0ZS1hbGVydFwiLCB7XG4gICAgICAgIFwidXNhLXNpdGUtYWxlcnQtLWluZm9cIjogXCJpbmZvXCIgPT09IHQsXG4gICAgICAgIFwidXNhLXNpdGUtYWxlcnQtLWVtZXJnZW5jeVwiOiBcImVtZXJnZW5jeVwiID09PSB0LFxuICAgICAgICBcInVzYS1zaXRlLWFsZXJ0LS1uby1oZWFkaW5nXCI6IHZvaWQgMCA9PT0gbyAmJiAhZCxcbiAgICAgICAgXCJ1c2Etc2l0ZS1hbGVydC0tbm8taWNvblwiOiAhYyxcbiAgICAgICAgXCJ1c2Etc2l0ZS1hbGVydC0tc2xpbVwiOiBkXG4gICAgICB9LCBmKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2k0OCh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzaXRlQWxlcnRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJTaXRlIGFsZXJ0XCJcbiAgICAgIH0sIHApLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWFsZXJ0X19ib2R5XCJcbiAgICAgIH0sIG8gJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRfX2hlYWRpbmdcIlxuICAgICAgfSwgbyksIHIpKSk7XG4gICAgfTtcblxuICAgIHQuU2l0ZUFsZXJ0ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfV0pO1xufSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2593\n')}}]); \ No newline at end of file diff --git a/main/404.html b/main/404.html index 78c81807..3e4afad7 100644 --- a/main/404.html +++ b/main/404.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/404/index.html b/main/404/index.html index 7cefb104..d425a4b9 100644 --- a/main/404/index.html +++ b/main/404/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/cejst/index.html b/main/cejst/index.html index 5b99234f..3a28172d 100644 --- a/main/cejst/index.html +++ b/main/cejst/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/chunk-map.json b/main/chunk-map.json index 7cf9f39a..d4f3a0ff 100644 --- a/main/chunk-map.json +++ b/main/chunk-map.json @@ -1 +1 @@ -{"polyfill":["/polyfill-8caaca0a42de0d6c5634.js"],"app":["/app-d491eba5963f67a585fa.js"],"component---src-pages-404-tsx":["/component---src-pages-404-tsx-24406dc9f292d4577bcf.js"],"component---src-pages-cejst-tsx":["/component---src-pages-cejst-tsx-5dc23ba646a4748f7e4c.js"],"component---src-pages-contact-tsx":["/component---src-pages-contact-tsx-266f3c657ad2540a2a94.js"],"component---src-pages-index-tsx":["/component---src-pages-index-tsx-1145e55e3ba8d5f93dea.js"],"component---src-pages-methodology-tsx":["/component---src-pages-methodology-tsx-81f2bf4fb8f983241e36.js"],"component---src-pages-timeline-tsx":["/component---src-pages-timeline-tsx-ae59bed14a7fa87b4dd6.js"]} \ No newline at end of file +{"polyfill":["/polyfill-8caaca0a42de0d6c5634.js"],"app":["/app-d491eba5963f67a585fa.js"],"component---src-pages-404-tsx":["/component---src-pages-404-tsx-df85057ad1cff117a810.js"],"component---src-pages-cejst-tsx":["/component---src-pages-cejst-tsx-36e3b57a031deac49ebc.js"],"component---src-pages-contact-tsx":["/component---src-pages-contact-tsx-08cf4a56d94a01466036.js"],"component---src-pages-index-tsx":["/component---src-pages-index-tsx-1cdcc7425e603bdf3264.js"],"component---src-pages-methodology-tsx":["/component---src-pages-methodology-tsx-928e808aca461578a225.js"],"component---src-pages-timeline-tsx":["/component---src-pages-timeline-tsx-ae59bed14a7fa87b4dd6.js"]} \ No newline at end of file diff --git a/main/commons-998feabb7c385ffda83d.js b/main/commons-d531077097b62d3a8b54.js similarity index 69% rename from main/commons-998feabb7c385ffda83d.js rename to main/commons-d531077097b62d3a8b54.js index 45a7b4a3..625f7cfd 100644 --- a/main/commons-998feabb7c385ffda83d.js +++ b/main/commons-d531077097b62d3a8b54.js @@ -1 +1 @@ -(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[351],{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__(379);\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/Mjc4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFbEQsMkJBQTJCLG1CQUFPLENBQUMsSUFBMkI7O0FBRTlELGlDQUFpQyxtQkFBTyxDQUFDLEdBQWlDOztBQUUxRSxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFzQjs7QUFFcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiMzAzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiKTtcblxudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\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__(379);\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzPzQ0OGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhELHNCQUFzQixtQkFBTyxDQUFDLElBQXNCOztBQUVwRCxpQ0FBaUMsbUJBQU8sQ0FBQyxHQUFpQzs7QUFFMUUsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjMxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///319\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')},379: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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzY2MTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIzNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///379\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")},4424:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "vU": function() { return /* binding */ defineMessages; }\n});\n\n// UNUSED EXPORTS: FormattedDate, FormattedDateParts, FormattedDateTimeRange, FormattedDisplayName, FormattedList, FormattedListParts, FormattedMessage, FormattedNumber, FormattedNumberParts, FormattedPlural, FormattedRelativeTime, FormattedTime, FormattedTimeParts, IntlContext, IntlProvider, InvalidConfigError, MessageFormatError, MissingDataError, MissingTranslationError, RawIntlProvider, ReactIntlError, ReactIntlErrorCode, UnsupportedFormatterError, createIntl, createIntlCache, defineMessage, injectIntl, useIntl\n\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _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\nfunction __extends(d, b) {\n if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n\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\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(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\n\nfunction tslib_es6_rest(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}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator["throw"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n "throw": verb(1),\n "return": verb(2)\n }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nvar __createBinding = Object.create ? function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, {\n enumerable: true,\n get: function get() {\n return m[k];\n }\n });\n} : function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n};\nfunction __exportStar(m, o) {\n for (var p in m) {\n if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n }\n}\nfunction __values(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}\nfunction __read(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/** @deprecated */\n\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\n/** @deprecated */\n\nfunction __spreadArrays() {\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}\nfunction tslib_es6_spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || from);\n}\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume("next", value);\n }\n\n function reject(value) {\n resume("throw", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) {\n throw e;\n }), verb("return"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === "return"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, "raw", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\n\nvar __setModuleDefault = Object.create ? function (o, v) {\n Object.defineProperty(o, "default", {\n enumerable: true,\n value: v\n });\n} : function (o, v) {\n o["default"] = v;\n};\n\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n }\n\n __setModuleDefault(result, mod);\n\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === "m") throw new TypeError("Private method is not writable");\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n}\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\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);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/injectIntl.js\n\n\n\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 = (/* unused pure expression or super */ null && (IntlProvider));\nvar Context = IntlContext;\nfunction injectIntl(WrappedComponent, options) {\n var _a = options || {},\n _b = _a.intlPropName,\n intlPropName = _b === void 0 ? \'intl\' : _b,\n _c = _a.forwardRef,\n forwardRef = _c === void 0 ? false : _c,\n _d = _a.enforceContext,\n enforceContext = _d === void 0 ? true : _d;\n\n var WithIntl = function WithIntl(props) {\n return React.createElement(IntlConsumer, null, function (intl) {\n var _a;\n\n if (enforceContext) {\n invariantIntlContext(intl);\n }\n\n var intlProp = (_a = {}, _a[intlPropName] = intl, _a);\n return React.createElement(WrappedComponent, __assign({}, props, intlProp, {\n ref: forwardRef ? props.forwardedRef : null\n }));\n });\n };\n\n WithIntl.displayName = "injectIntl(" + getDisplayName(WrappedComponent) + ")";\n WithIntl.WrappedComponent = WrappedComponent;\n\n if (forwardRef) {\n return hoistNonReactStatics(React.forwardRef(function (props, ref) {\n return React.createElement(WithIntl, __assign({}, props, {\n forwardedRef: ref\n }));\n }), WrappedComponent);\n }\n\n return hoistNonReactStatics(WithIntl, WrappedComponent);\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/ecma402-abstract/lib/utils.js\n/**\n * Cannot do Math.log(x) / Math.log(10) bc if IEEE floating point issue\n * @param x number\n */\nfunction getMagnitude(x) {\n // Cannot count string length via Number.toString because it may use scientific notation\n // for very small or very large numbers.\n return Math.floor(Math.log(x) * Math.LOG10E);\n}\nfunction repeat(s, times) {\n if (typeof s.repeat === \'function\') {\n return s.repeat(times);\n }\n\n var arr = new Array(times);\n\n for (var i = 0; i < arr.length; i++) {\n arr[i] = s;\n }\n\n return arr.join(\'\');\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}\n/*\n 17 ECMAScript Standard Built-in Objects:\n Every built-in Function object, including constructors, that is not\n identified as an anonymous function has a name property whose value\n is a String.\n\n Unless otherwise specified, the name property of a built-in Function\n object, if it exists, has the attributes { [[Writable]]: false,\n [[Enumerable]]: false, [[Configurable]]: true }.\n*/\n\nfunction defineProperty(target, name, _a) {\n var value = _a.value;\n Object.defineProperty(target, name, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: value\n });\n}\nvar UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\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}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/fast-memoize/lib/index.js\n//\n// Main\n//\nfunction lib_memoize(fn, options) {\n var cache = options && options.cache ? options.cache : cacheDefault;\n var serializer = options && options.serializer ? options.serializer : serializerDefault;\n var strategy = options && options.strategy ? options.strategy : strategyDefault;\n return strategy(fn, {\n cache: cache,\n serializer: serializer\n });\n} //\n// Strategy\n//\n\nfunction isPrimitive(value) {\n return value == null || typeof value === \'number\' || typeof value === \'boolean\'; // || typeof value === "string" \'unsafe\' primitive for our needs\n}\n\nfunction monadic(fn, cache, serializer, arg) {\n var cacheKey = isPrimitive(arg) ? arg : serializer(arg);\n var computedValue = cache.get(cacheKey);\n\n if (typeof computedValue === \'undefined\') {\n computedValue = fn.call(this, arg);\n cache.set(cacheKey, computedValue);\n }\n\n return computedValue;\n}\n\nfunction variadic(fn, cache, serializer) {\n var args = Array.prototype.slice.call(arguments, 3);\n var cacheKey = serializer(args);\n var computedValue = cache.get(cacheKey);\n\n if (typeof computedValue === \'undefined\') {\n computedValue = fn.apply(this, args);\n cache.set(cacheKey, computedValue);\n }\n\n return computedValue;\n}\n\nfunction assemble(fn, context, strategy, cache, serialize) {\n return strategy.bind(context, fn, cache, serialize);\n}\n\nfunction strategyDefault(fn, options) {\n var strategy = fn.length === 1 ? monadic : variadic;\n return assemble(fn, this, strategy, options.cache.create(), options.serializer);\n}\n\nfunction strategyVariadic(fn, options) {\n return assemble(fn, this, variadic, options.cache.create(), options.serializer);\n}\n\nfunction strategyMonadic(fn, options) {\n return assemble(fn, this, monadic, options.cache.create(), options.serializer);\n} //\n// Serializer\n//\n\n\nvar serializerDefault = function serializerDefault() {\n return JSON.stringify(arguments);\n}; //\n// Cache\n//\n\n\nfunction ObjectWithoutPrototypeCache() {\n this.cache = Object.create(null);\n}\n\nObjectWithoutPrototypeCache.prototype.has = function (key) {\n return key in this.cache;\n};\n\nObjectWithoutPrototypeCache.prototype.get = function (key) {\n return this.cache[key];\n};\n\nObjectWithoutPrototypeCache.prototype.set = function (key, value) {\n this.cache[key] = value;\n};\n\nvar cacheDefault = {\n create: function create() {\n // @ts-ignore\n return new ObjectWithoutPrototypeCache();\n }\n};\nvar lib_strategies = {\n variadic: strategyVariadic,\n monadic: strategyMonadic\n};\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl/lib/src/utils.js\n\n\n\n\nfunction filterProps(props, whitelist, defaults) {\n if (defaults === void 0) {\n defaults = {};\n }\n\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}\n\nvar defaultErrorHandler = function defaultErrorHandler(error) {\n if (false) {}\n};\n\nvar DEFAULT_INTL_CONFIG = {\n formats: {},\n messages: {},\n timeZone: undefined,\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\nfunction createFastMemoizeCache(store) {\n return {\n create: function create() {\n return {\n has: function has(key) {\n return key in store;\n },\n get: function get(key) {\n return store[key];\n },\n set: function set(key, value) {\n store[key] = value;\n }\n };\n }\n };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\n\n\nfunction createFormatters(cache) {\n if (cache === void 0) {\n cache = createIntlCache();\n }\n\n var RelativeTimeFormat = Intl.RelativeTimeFormat;\n var ListFormat = Intl.ListFormat;\n var DisplayNames = Intl.DisplayNames;\n var getDateTimeFormat = memoize(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 return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.dateTime),\n strategy: strategies.variadic\n });\n var getNumberFormat = memoize(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 return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.number),\n strategy: strategies.variadic\n });\n var getPluralRules = memoize(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 return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.pluralRules),\n strategy: strategies.variadic\n });\n return {\n getDateTimeFormat: getDateTimeFormat,\n getNumberFormat: getNumberFormat,\n getMessageFormat: memoize(function (message, locales, overrideFormats, opts) {\n return new IntlMessageFormat(message, locales, overrideFormats, __assign({\n formatters: {\n getNumberFormat: getNumberFormat,\n getDateTimeFormat: getDateTimeFormat,\n getPluralRules: getPluralRules\n }\n }, opts || {}));\n }, {\n cache: createFastMemoizeCache(cache.message),\n strategy: strategies.variadic\n }),\n getRelativeTimeFormat: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (RelativeTimeFormat.bind.apply(RelativeTimeFormat, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.relativeTime),\n strategy: strategies.variadic\n }),\n getPluralRules: getPluralRules,\n getListFormat: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (ListFormat.bind.apply(ListFormat, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.list),\n strategy: strategies.variadic\n }),\n getDisplayNames: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (DisplayNames.bind.apply(DisplayNames, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.displayNames),\n strategy: strategies.variadic\n })\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(new UnsupportedFormatterError("No " + type + " format named: " + name));\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/utils.js\n\n\n\n\nfunction utils_invariantIntlContext(intl) {\n invariant(intl, \'[React Intl] Could not find required `intl` object. \' + \' needs to exist in the component ancestry.\');\n}\nvar utils_DEFAULT_INTL_CONFIG = _assign(_assign({}, DEFAULT_INTL_CONFIG), {\n textComponent: react.Fragment\n});\n/**\n * Takes a `formatXMLElementFn`, and composes it in function, which passes\n * argument `parts` through, assigning unique key to each part, to prevent\n * "Each child in a list should have a unique "key"" React error.\n * @param formatXMLElementFn\n */\n\nfunction assignUniqueKeysToParts(formatXMLElementFn) {\n return function (parts) {\n // eslint-disable-next-line prefer-rest-params\n return formatXMLElementFn(React.Children.toArray(parts));\n };\n}\nfunction shallowEqual(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;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/useIntl.js\n\n\n\nfunction useIntl_useIntl() {\n var intl = react.useContext(Context);\n utils_invariantIntlContext(intl);\n return intl;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/createFormattedComponent.js\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 var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props, ["value", "children"]);\n\n return children(intl.formatNumberToParts(value, formatProps));\n};\nFormattedNumberParts.displayName = \'FormattedNumberParts\';\nvar FormattedListParts = function FormattedListParts(props) {\n var intl = useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = __rest(props, ["value", "children"]);\n\n return children(intl.formatListToParts(value, formatProps));\n};\nFormattedNumberParts.displayName = \'FormattedNumberParts\';\nfunction createFormattedDateTimePartsComponent(name) {\n var ComponentParts = function ComponentParts(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_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 ComponentParts.displayName = DisplayNameParts[name];\n return ComponentParts;\n}\nfunction createFormattedComponent(name) {\n var Component = function Component(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props // TODO: fix TS type definition for localeMatcher upstream\n , ["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 Component.displayName = DisplayName[name];\n return Component;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/index.js\n\n\nfunction defineMessages(msgs) {\n return msgs;\n}\nfunction defineMessage(msg) {\n return msg;\n}\n\n\n // IMPORTANT: Explicit here to prevent api-extractor from outputing `import(\'./src/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//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/YjA1NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9zcmMvY29tcG9uZW50cy9pbmplY3RJbnRsLmpzP2RlYTkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2VjbWE0MDItYWJzdHJhY3QvbGliL3V0aWxzLmpzPzFjNjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2Zhc3QtbWVtb2l6ZS9saWIvaW5kZXguanM/NzRiOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC9saWIvc3JjL3V0aWxzLmpzPzQzZjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvc3JjL3V0aWxzLmpzPzlkMjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvc3JjL2NvbXBvbmVudHMvdXNlSW50bC5qcz9mODUzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL3NyYy9jb21wb25lbnRzL2NyZWF0ZUZvcm1hdHRlZENvbXBvbmVudC5qcz83YTUyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2luZGV4LmpzPzUzZmMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7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QTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGVBQU87O0FBRXRCO0FBQ0E7QUFDQSxzQkFBc0IsY0FBTTtBQUM1Qiw2QkFBNkI7OztBQUc3Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLGNBQWM7QUFDbkQsV0FBVyxtQkFBbUI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBLEM7O0FDbEY0SDtBQUNxRztBQUMxTjtBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDeUg7QUFDM0Q7QUFDa0I7O0FBRXpFLG9CQUFvQix3QkFBd0I7QUFDNUMsb0JBQW9CLHdCQUF3QjtBQUM1QyxzQkFBc0Isd0JBQXdCO0FBQzlDLG9CQUFvQix3QkFBd0I7QUFDNUMsMkJBQTJCLHdCQUF3QjtBQUNuRCx5QkFBeUIscUNBQXFDO0FBQzlELHlCQUF5QixxQ0FBcUM7QUFDZ0M7QUFDeEI7QUFDUjtBQUNFIiwiZmlsZSI6IjQ0MjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xudmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICBfX3Byb3RvX186IFtdXG4gIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGQuX19wcm90b19fID0gYjtcbiAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cblxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbnZhciBfYXNzaWduID0gZnVuY3Rpb24gX19hc3NpZ24oKSB7XG4gIF9hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IHsgX2Fzc2lnbiBhcyBfX2Fzc2lnbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYyxcbiAgICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7ZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIH1cbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7XG4gICAgbGFiZWw6IDAsXG4gICAgc2VudDogZnVuY3Rpb24gc2VudCgpIHtcbiAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgIHJldHVybiB0WzFdO1xuICAgIH0sXG4gICAgdHJ5czogW10sXG4gICAgb3BzOiBbXVxuICB9LFxuICAgICAgZixcbiAgICAgIHksXG4gICAgICB0LFxuICAgICAgZztcbiAgcmV0dXJuIGcgPSB7XG4gICAgbmV4dDogdmVyYigwKSxcbiAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGc7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gc3RlcChbbiwgdl0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuXG4gICAgd2hpbGUgKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuXG4gICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG5cbiAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvcCA9IFs2LCBlXTtcbiAgICAgICAgeSA9IDA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmID0gdCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgZG9uZTogdHJ1ZVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uIChvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG1ba107XG4gICAgfVxuICB9KTtcbn0gOiBmdW5jdGlvbiAobywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIHtcbiAgICBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsXG4gICAgICBtID0gcyAmJiBvW3NdLFxuICAgICAgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbyAmJiBvW2krK10sXG4gICAgICAgIGRvbmU6ICFvXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksXG4gICAgICByLFxuICAgICAgYXIgPSBbXSxcbiAgICAgIGU7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkge1xuICAgICAgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXI7XG59XG4vKiogQGRlcHJlY2F0ZWQgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbi8qKiBAZGVwcmVjYXRlZCAqL1xuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBmcm9tKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksXG4gICAgICBpLFxuICAgICAgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUobiwgdikge1xuICAgIHRyeSB7XG4gICAgICBzdGVwKGdbbl0odikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldHRsZShxWzBdWzNdLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkge1xuICAgIHJlc3VtZShcInRocm93XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkge1xuICAgIHRocm93IGU7XG4gIH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGk7XG5cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7XG4gICAgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIChwID0gIXApID8ge1xuICAgICAgICB2YWx1ZTogX19hd2FpdChvW25dKHYpKSxcbiAgICAgICAgZG9uZTogbiA9PT0gXCJyZXR1cm5cIlxuICAgICAgfSA6IGYgPyBmKHYpIDogdjtcbiAgICB9IDogZjtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLFxuICAgICAgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbiAodikge1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBkb25lOiBkXG4gICAgICB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHtcbiAgICAgIHZhbHVlOiByYXdcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb29rZWQucmF3ID0gcmF3O1xuICB9XG5cbiAgcmV0dXJuIGNvb2tlZDtcbn1cbjtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbiAobywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2XG4gIH0pO1xufSA6IGZ1bmN0aW9uIChvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkge1xuICAgIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgfVxuXG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpLCB2YWx1ZTtcbn0iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IGludmFyaWFudEludGxDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShDb21wb25lbnQpIHtcbiAgcmV0dXJuIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jztcbn0gLy8gVE9ETzogV2Ugc2hvdWxkIHByb3ZpZGUgaW5pdGlhbCB2YWx1ZSBoZXJlXG5cblxudmFyIEludGxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBJbnRsQ29uc3VtZXIgPSBJbnRsQ29udGV4dC5Db25zdW1lcixcbiAgICBJbnRsUHJvdmlkZXIgPSBJbnRsQ29udGV4dC5Qcm92aWRlcjtcbmV4cG9ydCB2YXIgUHJvdmlkZXIgPSBJbnRsUHJvdmlkZXI7XG5leHBvcnQgdmFyIENvbnRleHQgPSBJbnRsQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluamVjdEludGwoV3JhcHBlZENvbXBvbmVudCwgb3B0aW9ucykge1xuICB2YXIgX2EgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgX2IgPSBfYS5pbnRsUHJvcE5hbWUsXG4gICAgICBpbnRsUHJvcE5hbWUgPSBfYiA9PT0gdm9pZCAwID8gJ2ludGwnIDogX2IsXG4gICAgICBfYyA9IF9hLmZvcndhcmRSZWYsXG4gICAgICBmb3J3YXJkUmVmID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2MsXG4gICAgICBfZCA9IF9hLmVuZm9yY2VDb250ZXh0LFxuICAgICAgZW5mb3JjZUNvbnRleHQgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kO1xuXG4gIHZhciBXaXRoSW50bCA9IGZ1bmN0aW9uIFdpdGhJbnRsKHByb3BzKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW50bENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoZW5mb3JjZUNvbnRleHQpIHtcbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoaW50bCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnRsUHJvcCA9IChfYSA9IHt9LCBfYVtpbnRsUHJvcE5hbWVdID0gaW50bCwgX2EpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgX19hc3NpZ24oe30sIHByb3BzLCBpbnRsUHJvcCwge1xuICAgICAgICByZWY6IGZvcndhcmRSZWYgPyBwcm9wcy5mb3J3YXJkZWRSZWYgOiBudWxsXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH07XG5cbiAgV2l0aEludGwuZGlzcGxheU5hbWUgPSBcImluamVjdEludGwoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiO1xuICBXaXRoSW50bC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcblxuICBpZiAoZm9yd2FyZFJlZikge1xuICAgIHJldHVybiBob2lzdE5vblJlYWN0U3RhdGljcyhSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXaXRoSW50bCwgX19hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGZvcndhcmRlZFJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSksIFdyYXBwZWRDb21wb25lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKFdpdGhJbnRsLCBXcmFwcGVkQ29tcG9uZW50KTtcbn0iLCIvKipcbiAqIENhbm5vdCBkbyBNYXRoLmxvZyh4KSAvIE1hdGgubG9nKDEwKSBiYyBpZiBJRUVFIGZsb2F0aW5nIHBvaW50IGlzc3VlXG4gKiBAcGFyYW0geCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hZ25pdHVkZSh4KSB7XG4gIC8vIENhbm5vdCBjb3VudCBzdHJpbmcgbGVuZ3RoIHZpYSBOdW1iZXIudG9TdHJpbmcgYmVjYXVzZSBpdCBtYXkgdXNlIHNjaWVudGlmaWMgbm90YXRpb25cbiAgLy8gZm9yIHZlcnkgc21hbGwgb3IgdmVyeSBsYXJnZSBudW1iZXJzLlxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAqIE1hdGguTE9HMTBFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXBlYXQocywgdGltZXMpIHtcbiAgaWYgKHR5cGVvZiBzLnJlcGVhdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzLnJlcGVhdCh0aW1lcyk7XG4gIH1cblxuICB2YXIgYXJyID0gbmV3IEFycmF5KHRpbWVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IHM7XG4gIH1cblxuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBmaWVsZCwgdmFsdWUpIHtcbiAgaWYgKCFtYXAuZ2V0KHBsKSkge1xuICAgIG1hcC5zZXQocGwsIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICB9XG5cbiAgdmFyIHNsb3RzID0gbWFwLmdldChwbCk7XG4gIHNsb3RzW2ZpZWxkXSA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrID0gX2FbX2ldO1xuICAgIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBrLCBwcm9wc1trXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbFNsb3QobWFwLCBwbCwgZmllbGQpIHtcbiAgcmV0dXJuIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBmaWVsZClbZmllbGRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsKSB7XG4gIHZhciBmaWVsZHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGZpZWxkc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBzbG90cyA9IG1hcC5nZXQocGwpO1xuXG4gIGlmICghc2xvdHMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHBsICsgXCIgSW50ZXJuYWxTbG90IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGYpIHtcbiAgICBhbGxbZl0gPSBzbG90c1tmXTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSB7XG4gIHJldHVybiBwYXR0ZXJuUGFydC50eXBlID09PSAnbGl0ZXJhbCc7XG59XG4vKlxuICAxNyBFQ01BU2NyaXB0IFN0YW5kYXJkIEJ1aWx0LWluIE9iamVjdHM6XG4gICAgRXZlcnkgYnVpbHQtaW4gRnVuY3Rpb24gb2JqZWN0LCBpbmNsdWRpbmcgY29uc3RydWN0b3JzLCB0aGF0IGlzIG5vdFxuICAgIGlkZW50aWZpZWQgYXMgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIGhhcyBhIG5hbWUgcHJvcGVydHkgd2hvc2UgdmFsdWVcbiAgICBpcyBhIFN0cmluZy5cblxuICAgIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgbmFtZSBwcm9wZXJ0eSBvZiBhIGJ1aWx0LWluIEZ1bmN0aW9uXG4gICAgb2JqZWN0LCBpZiBpdCBleGlzdHMsIGhhcyB0aGUgYXR0cmlidXRlcyB7IFtbV3JpdGFibGVdXTogZmFsc2UsXG4gICAgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiB0cnVlIH0uXG4qL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBfYSkge1xuICB2YXIgdmFsdWUgPSBfYS52YWx1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5leHBvcnQgdmFyIFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYID0gLy11KD86LVswLTlhLXpdezIsOH0pKy9naTtcbmV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlLCBFcnIpIHtcbiAgaWYgKEVyciA9PT0gdm9pZCAwKSB7XG4gICAgRXJyID0gRXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnIobWVzc2FnZSk7XG4gIH1cbn0iLCIvL1xuLy8gTWFpblxuLy9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lbW9pemUoZm4sIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlID0gb3B0aW9ucyAmJiBvcHRpb25zLmNhY2hlID8gb3B0aW9ucy5jYWNoZSA6IGNhY2hlRGVmYXVsdDtcbiAgdmFyIHNlcmlhbGl6ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplciA/IG9wdGlvbnMuc2VyaWFsaXplciA6IHNlcmlhbGl6ZXJEZWZhdWx0O1xuICB2YXIgc3RyYXRlZ3kgPSBvcHRpb25zICYmIG9wdGlvbnMuc3RyYXRlZ3kgPyBvcHRpb25zLnN0cmF0ZWd5IDogc3RyYXRlZ3lEZWZhdWx0O1xuICByZXR1cm4gc3RyYXRlZ3koZm4sIHtcbiAgICBjYWNoZTogY2FjaGUsXG4gICAgc2VyaWFsaXplcjogc2VyaWFsaXplclxuICB9KTtcbn0gLy9cbi8vIFN0cmF0ZWd5XG4vL1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nOyAvLyB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJ3Vuc2FmZScgcHJpbWl0aXZlIGZvciBvdXIgbmVlZHNcbn1cblxuZnVuY3Rpb24gbW9uYWRpYyhmbiwgY2FjaGUsIHNlcmlhbGl6ZXIsIGFyZykge1xuICB2YXIgY2FjaGVLZXkgPSBpc1ByaW1pdGl2ZShhcmcpID8gYXJnIDogc2VyaWFsaXplcihhcmcpO1xuICB2YXIgY29tcHV0ZWRWYWx1ZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgaWYgKHR5cGVvZiBjb21wdXRlZFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbXB1dGVkVmFsdWUgPSBmbi5jYWxsKHRoaXMsIGFyZyk7XG4gICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBjb21wdXRlZFZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb21wdXRlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YXJpYWRpYyhmbiwgY2FjaGUsIHNlcmlhbGl6ZXIpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemVyKGFyZ3MpO1xuICB2YXIgY29tcHV0ZWRWYWx1ZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgaWYgKHR5cGVvZiBjb21wdXRlZFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbXB1dGVkVmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjYWNoZS5zZXQoY2FjaGVLZXksIGNvbXB1dGVkVmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzc2VtYmxlKGZuLCBjb250ZXh0LCBzdHJhdGVneSwgY2FjaGUsIHNlcmlhbGl6ZSkge1xuICByZXR1cm4gc3RyYXRlZ3kuYmluZChjb250ZXh0LCBmbiwgY2FjaGUsIHNlcmlhbGl6ZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmF0ZWd5RGVmYXVsdChmbiwgb3B0aW9ucykge1xuICB2YXIgc3RyYXRlZ3kgPSBmbi5sZW5ndGggPT09IDEgPyBtb25hZGljIDogdmFyaWFkaWM7XG4gIHJldHVybiBhc3NlbWJsZShmbiwgdGhpcywgc3RyYXRlZ3ksIG9wdGlvbnMuY2FjaGUuY3JlYXRlKCksIG9wdGlvbnMuc2VyaWFsaXplcik7XG59XG5cbmZ1bmN0aW9uIHN0cmF0ZWd5VmFyaWFkaWMoZm4sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFzc2VtYmxlKGZuLCB0aGlzLCB2YXJpYWRpYywgb3B0aW9ucy5jYWNoZS5jcmVhdGUoKSwgb3B0aW9ucy5zZXJpYWxpemVyKTtcbn1cblxuZnVuY3Rpb24gc3RyYXRlZ3lNb25hZGljKGZuLCBvcHRpb25zKSB7XG4gIHJldHVybiBhc3NlbWJsZShmbiwgdGhpcywgbW9uYWRpYywgb3B0aW9ucy5jYWNoZS5jcmVhdGUoKSwgb3B0aW9ucy5zZXJpYWxpemVyKTtcbn0gLy9cbi8vIFNlcmlhbGl6ZXJcbi8vXG5cblxudmFyIHNlcmlhbGl6ZXJEZWZhdWx0ID0gZnVuY3Rpb24gc2VyaWFsaXplckRlZmF1bHQoKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmd1bWVudHMpO1xufTsgLy9cbi8vIENhY2hlXG4vL1xuXG5cbmZ1bmN0aW9uIE9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZSgpIHtcbiAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbk9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5IGluIHRoaXMuY2FjaGU7XG59O1xuXG5PYmplY3RXaXRob3V0UHJvdG90eXBlQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbn07XG5cbk9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5jYWNoZVtrZXldID0gdmFsdWU7XG59O1xuXG52YXIgY2FjaGVEZWZhdWx0ID0ge1xuICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5ldyBPYmplY3RXaXRob3V0UHJvdG90eXBlQ2FjaGUoKTtcbiAgfVxufTtcbmV4cG9ydCB2YXIgc3RyYXRlZ2llcyA9IHtcbiAgdmFyaWFkaWM6IHN0cmF0ZWd5VmFyaWFkaWMsXG4gIG1vbmFkaWM6IHN0cmF0ZWd5TW9uYWRpY1xufTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW50bE1lc3NhZ2VGb3JtYXQgfSBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IG1lbW9pemUsIHsgc3RyYXRlZ2llcyB9IGZyb20gJ0Bmb3JtYXRqcy9mYXN0LW1lbW9pemUnO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRGb3JtYXR0ZXJFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclByb3BzKHByb3BzLCB3aGl0ZWxpc3QsIGRlZmF1bHRzKSB7XG4gIGlmIChkZWZhdWx0cyA9PT0gdm9pZCAwKSB7XG4gICAgZGVmYXVsdHMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiB3aGl0ZWxpc3QucmVkdWNlKGZ1bmN0aW9uIChmaWx0ZXJlZCwgbmFtZSkge1xuICAgIGlmIChuYW1lIGluIHByb3BzKSB7XG4gICAgICBmaWx0ZXJlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgIH0gZWxzZSBpZiAobmFtZSBpbiBkZWZhdWx0cykge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH0sIHt9KTtcbn1cblxudmFyIGRlZmF1bHRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycm9yKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IHtcbiAgZm9ybWF0czoge30sXG4gIG1lc3NhZ2VzOiB7fSxcbiAgdGltZVpvbmU6IHVuZGVmaW5lZCxcbiAgZGVmYXVsdExvY2FsZTogJ2VuJyxcbiAgZGVmYXVsdEZvcm1hdHM6IHt9LFxuICBvbkVycm9yOiBkZWZhdWx0RXJyb3JIYW5kbGVyXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGxDYWNoZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRlVGltZToge30sXG4gICAgbnVtYmVyOiB7fSxcbiAgICBtZXNzYWdlOiB7fSxcbiAgICByZWxhdGl2ZVRpbWU6IHt9LFxuICAgIHBsdXJhbFJ1bGVzOiB7fSxcbiAgICBsaXN0OiB7fSxcbiAgICBkaXNwbGF5TmFtZXM6IHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhc3RNZW1vaXplQ2FjaGUoc3RvcmUpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICAgIHJldHVybiBrZXkgaW4gc3RvcmU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICAgIHJldHVybiBzdG9yZVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgc3RvcmVba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGludGwgZm9ybWF0dGVycyBhbmQgcG9wdWxhdGUgY2FjaGVcbiAqIEBwYXJhbSBjYWNoZSBleHBsaWNpdCBjYWNoZSB0byBwcmV2ZW50IGxlYWtpbmcgbWVtb3J5XG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVycyhjYWNoZSkge1xuICBpZiAoY2FjaGUgPT09IHZvaWQgMCkge1xuICAgIGNhY2hlID0gY3JlYXRlSW50bENhY2hlKCk7XG4gIH1cblxuICB2YXIgUmVsYXRpdmVUaW1lRm9ybWF0ID0gSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIHZhciBMaXN0Rm9ybWF0ID0gSW50bC5MaXN0Rm9ybWF0O1xuICB2YXIgRGlzcGxheU5hbWVzID0gSW50bC5EaXNwbGF5TmFtZXM7XG4gIHZhciBnZXREYXRlVGltZUZvcm1hdCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKChfYSA9IEludGwuRGF0ZVRpbWVGb3JtYXQpLmJpbmQuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgfSwge1xuICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLmRhdGVUaW1lKSxcbiAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICB9KTtcbiAgdmFyIGdldE51bWJlckZvcm1hdCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKChfYSA9IEludGwuTnVtYmVyRm9ybWF0KS5iaW5kLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gIH0sIHtcbiAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5udW1iZXIpLFxuICAgIHN0cmF0ZWd5OiBzdHJhdGVnaWVzLnZhcmlhZGljXG4gIH0pO1xuICB2YXIgZ2V0UGx1cmFsUnVsZXMgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3ICgoX2EgPSBJbnRsLlBsdXJhbFJ1bGVzKS5iaW5kLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gIH0sIHtcbiAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5wbHVyYWxSdWxlcyksXG4gICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgZ2V0RGF0ZVRpbWVGb3JtYXQ6IGdldERhdGVUaW1lRm9ybWF0LFxuICAgIGdldE51bWJlckZvcm1hdDogZ2V0TnVtYmVyRm9ybWF0LFxuICAgIGdldE1lc3NhZ2VGb3JtYXQ6IG1lbW9pemUoZnVuY3Rpb24gKG1lc3NhZ2UsIGxvY2FsZXMsIG92ZXJyaWRlRm9ybWF0cywgb3B0cykge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsTWVzc2FnZUZvcm1hdChtZXNzYWdlLCBsb2NhbGVzLCBvdmVycmlkZUZvcm1hdHMsIF9fYXNzaWduKHtcbiAgICAgICAgZm9ybWF0dGVyczoge1xuICAgICAgICAgIGdldE51bWJlckZvcm1hdDogZ2V0TnVtYmVyRm9ybWF0LFxuICAgICAgICAgIGdldERhdGVUaW1lRm9ybWF0OiBnZXREYXRlVGltZUZvcm1hdCxcbiAgICAgICAgICBnZXRQbHVyYWxSdWxlczogZ2V0UGx1cmFsUnVsZXNcbiAgICAgICAgfVxuICAgICAgfSwgb3B0cyB8fCB7fSkpO1xuICAgIH0sIHtcbiAgICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLm1lc3NhZ2UpLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgICB9KSxcbiAgICBnZXRSZWxhdGl2ZVRpbWVGb3JtYXQ6IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IChSZWxhdGl2ZVRpbWVGb3JtYXQuYmluZC5hcHBseShSZWxhdGl2ZVRpbWVGb3JtYXQsIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgICB9LCB7XG4gICAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5yZWxhdGl2ZVRpbWUpLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgICB9KSxcbiAgICBnZXRQbHVyYWxSdWxlczogZ2V0UGx1cmFsUnVsZXMsXG4gICAgZ2V0TGlzdEZvcm1hdDogbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgKExpc3RGb3JtYXQuYmluZC5hcHBseShMaXN0Rm9ybWF0LCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gICAgfSwge1xuICAgICAgY2FjaGU6IGNyZWF0ZUZhc3RNZW1vaXplQ2FjaGUoY2FjaGUubGlzdCksXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICAgIH0pLFxuICAgIGdldERpc3BsYXlOYW1lczogbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgKERpc3BsYXlOYW1lcy5iaW5kLmFwcGx5KERpc3BsYXlOYW1lcywgX19zcHJlYWRBcnJheShbdm9pZCAwXSwgYXJncykpKSgpO1xuICAgIH0sIHtcbiAgICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLmRpc3BsYXlOYW1lcyksXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICAgIH0pXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgdHlwZSwgbmFtZSwgb25FcnJvcikge1xuICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdHMgJiYgZm9ybWF0c1t0eXBlXTtcbiAgdmFyIGZvcm1hdDtcblxuICBpZiAoZm9ybWF0VHlwZSkge1xuICAgIGZvcm1hdCA9IGZvcm1hdFR5cGVbbmFtZV07XG4gIH1cblxuICBpZiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIG9uRXJyb3IobmV3IFVuc3VwcG9ydGVkRm9ybWF0dGVyRXJyb3IoXCJObyBcIiArIHR5cGUgKyBcIiBmb3JtYXQgbmFtZWQ6IFwiICsgbmFtZSkpO1xufSIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAZm9ybWF0anMvZWNtYTQwMi1hYnN0cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX0lOVExfQ09ORklHIGFzIENPUkVfREVGQVVMVF9JTlRMX0NPTkZJRyB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsJztcbmV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKSB7XG4gIGludmFyaWFudChpbnRsLCAnW1JlYWN0IEludGxdIENvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIGBpbnRsYCBvYmplY3QuICcgKyAnPEludGxQcm92aWRlcj4gbmVlZHMgdG8gZXhpc3QgaW4gdGhlIGNvbXBvbmVudCBhbmNlc3RyeS4nKTtcbn1cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBDT1JFX0RFRkFVTFRfSU5UTF9DT05GSUcpLCB7XG4gIHRleHRDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50XG59KTtcbi8qKlxuICogVGFrZXMgYSBgZm9ybWF0WE1MRWxlbWVudEZuYCwgYW5kIGNvbXBvc2VzIGl0IGluIGZ1bmN0aW9uLCB3aGljaCBwYXNzZXNcbiAqIGFyZ3VtZW50IGBwYXJ0c2AgdGhyb3VnaCwgYXNzaWduaW5nIHVuaXF1ZSBrZXkgdG8gZWFjaCBwYXJ0LCB0byBwcmV2ZW50XG4gKiBcIkVhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCJcIiBSZWFjdCBlcnJvci5cbiAqIEBwYXJhbSBmb3JtYXRYTUxFbGVtZW50Rm5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVW5pcXVlS2V5c1RvUGFydHMoZm9ybWF0WE1MRWxlbWVudEZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocGFydHMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgcmV0dXJuIGZvcm1hdFhNTEVsZW1lbnRGbihSZWFjdC5DaGlsZHJlbi50b0FycmF5KHBhcnRzKSk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghb2JqQSB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIgYktleXMgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgdmFyIGxlbiA9IGFLZXlzLmxlbmd0aDtcblxuICBpZiAoYktleXMubGVuZ3RoICE9PSBsZW4pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGFLZXlzW2ldO1xuXG4gICAgaWYgKG9iakFba2V5XSAhPT0gb2JqQltrZXldIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2luamVjdEludGwnO1xuaW1wb3J0IHsgaW52YXJpYW50SW50bENvbnRleHQgfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJbnRsKCkge1xuICB2YXIgaW50bCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gIGludmFyaWFudEludGxDb250ZXh0KGludGwpO1xuICByZXR1cm4gaW50bDtcbn0iLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VJbnRsIGZyb20gJy4vdXNlSW50bCc7XG52YXIgRGlzcGxheU5hbWU7XG5cbihmdW5jdGlvbiAoRGlzcGxheU5hbWUpIHtcbiAgRGlzcGxheU5hbWVbXCJmb3JtYXREYXRlXCJdID0gXCJGb3JtYXR0ZWREYXRlXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0VGltZVwiXSA9IFwiRm9ybWF0dGVkVGltZVwiO1xuICBEaXNwbGF5TmFtZVtcImZvcm1hdE51bWJlclwiXSA9IFwiRm9ybWF0dGVkTnVtYmVyXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0TGlzdFwiXSA9IFwiRm9ybWF0dGVkTGlzdFwiOyAvLyBOb3RlIHRoYXQgdGhpcyBEaXNwbGF5TmFtZSBpcyB0aGUgbG9jYWxlIGRpc3BsYXkgbmFtZSwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGhcbiAgLy8gdGhlIG5hbWUgb2YgdGhlIGVudW0sIHdoaWNoIGlzIGZvciBSZWFjdCBjb21wb25lbnQgZGlzcGxheSBuYW1lIGluIGRldiB0b29scy5cblxuICBEaXNwbGF5TmFtZVtcImZvcm1hdERpc3BsYXlOYW1lXCJdID0gXCJGb3JtYXR0ZWREaXNwbGF5TmFtZVwiO1xufSkoRGlzcGxheU5hbWUgfHwgKERpc3BsYXlOYW1lID0ge30pKTtcblxudmFyIERpc3BsYXlOYW1lUGFydHM7XG5cbihmdW5jdGlvbiAoRGlzcGxheU5hbWVQYXJ0cykge1xuICBEaXNwbGF5TmFtZVBhcnRzW1wiZm9ybWF0RGF0ZVwiXSA9IFwiRm9ybWF0dGVkRGF0ZVBhcnRzXCI7XG4gIERpc3BsYXlOYW1lUGFydHNbXCJmb3JtYXRUaW1lXCJdID0gXCJGb3JtYXR0ZWRUaW1lUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdE51bWJlclwiXSA9IFwiRm9ybWF0dGVkTnVtYmVyUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdExpc3RcIl0gPSBcIkZvcm1hdHRlZExpc3RQYXJ0c1wiO1xufSkoRGlzcGxheU5hbWVQYXJ0cyB8fCAoRGlzcGxheU5hbWVQYXJ0cyA9IHt9KSk7XG5cbmV4cG9ydCB2YXIgRm9ybWF0dGVkTnVtYmVyUGFydHMgPSBmdW5jdGlvbiBGb3JtYXR0ZWROdW1iZXJQYXJ0cyhwcm9wcykge1xuICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TnVtYmVyVG9QYXJ0cyh2YWx1ZSwgZm9ybWF0UHJvcHMpKTtcbn07XG5Gb3JtYXR0ZWROdW1iZXJQYXJ0cy5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWROdW1iZXJQYXJ0cyc7XG5leHBvcnQgdmFyIEZvcm1hdHRlZExpc3RQYXJ0cyA9IGZ1bmN0aW9uIEZvcm1hdHRlZExpc3RQYXJ0cyhwcm9wcykge1xuICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TGlzdFRvUGFydHModmFsdWUsIGZvcm1hdFByb3BzKSk7XG59O1xuRm9ybWF0dGVkTnVtYmVyUGFydHMuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTnVtYmVyUGFydHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQobmFtZSkge1xuICB2YXIgQ29tcG9uZW50UGFydHMgPSBmdW5jdGlvbiBDb21wb25lbnRQYXJ0cyhwcm9wcykge1xuICAgIHZhciBpbnRsID0gdXNlSW50bCgpO1xuXG4gICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGZvcm1hdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTtcblxuICAgIHZhciBkYXRlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHZhbHVlIHx8IDApIDogdmFsdWU7XG4gICAgdmFyIGZvcm1hdHRlZFBhcnRzID0gbmFtZSA9PT0gJ2Zvcm1hdERhdGUnID8gaW50bC5mb3JtYXREYXRlVG9QYXJ0cyhkYXRlLCBmb3JtYXRQcm9wcykgOiBpbnRsLmZvcm1hdFRpbWVUb1BhcnRzKGRhdGUsIGZvcm1hdFByb3BzKTtcbiAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkUGFydHMpO1xuICB9O1xuXG4gIENvbXBvbmVudFBhcnRzLmRpc3BsYXlOYW1lID0gRGlzcGxheU5hbWVQYXJ0c1tuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudFBhcnRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudChuYW1lKSB7XG4gIHZhciBDb21wb25lbnQgPSBmdW5jdGlvbiBDb21wb25lbnQocHJvcHMpIHtcbiAgICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcyAvLyBUT0RPOiBmaXggVFMgdHlwZSBkZWZpbml0aW9uIGZvciBsb2NhbGVNYXRjaGVyIHVwc3RyZWFtXG4gICAgLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTsgLy8gVE9ETzogZml4IFRTIHR5cGUgZGVmaW5pdGlvbiBmb3IgbG9jYWxlTWF0Y2hlciB1cHN0cmVhbVxuXG5cbiAgICB2YXIgZm9ybWF0dGVkVmFsdWUgPSBpbnRsW25hbWVdKHZhbHVlLCBmb3JtYXRQcm9wcyk7XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkVmFsdWUpO1xuICAgIH1cblxuICAgIHZhciBUZXh0ID0gaW50bC50ZXh0Q29tcG9uZW50IHx8IFJlYWN0LkZyYWdtZW50O1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRleHQsIG51bGwsIGZvcm1hdHRlZFZhbHVlKTtcbiAgfTtcblxuICBDb21wb25lbnQuZGlzcGxheU5hbWUgPSBEaXNwbGF5TmFtZVtuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudDtcbn0iLCJpbXBvcnQgeyBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQsIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL2NyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCc7XG5leHBvcnQgeyBjcmVhdGVJbnRsQ2FjaGUsIFVuc3VwcG9ydGVkRm9ybWF0dGVyRXJyb3IsIEludmFsaWRDb25maWdFcnJvciwgTWlzc2luZ0RhdGFFcnJvciwgTWVzc2FnZUZvcm1hdEVycm9yLCBNaXNzaW5nVHJhbnNsYXRpb25FcnJvciwgSW50bEVycm9yQ29kZSBhcyBSZWFjdEludGxFcnJvckNvZGUsIEludGxFcnJvciBhcyBSZWFjdEludGxFcnJvciB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsJztcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVNZXNzYWdlcyhtc2dzKSB7XG4gIHJldHVybiBtc2dzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZU1lc3NhZ2UobXNnKSB7XG4gIHJldHVybiBtc2c7XG59XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluamVjdEludGwsIFByb3ZpZGVyIGFzIFJhd0ludGxQcm92aWRlciwgQ29udGV4dCBhcyBJbnRsQ29udGV4dCB9IGZyb20gJy4vc3JjL2NvbXBvbmVudHMvaW5qZWN0SW50bCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZUludGwgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3VzZUludGwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnRsUHJvdmlkZXIsIGNyZWF0ZUludGwgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3Byb3ZpZGVyJzsgLy8gSU1QT1JUQU5UOiBFeHBsaWNpdCBoZXJlIHRvIHByZXZlbnQgYXBpLWV4dHJhY3RvciBmcm9tIG91dHB1dGluZyBgaW1wb3J0KCcuL3NyYy90eXBlcycpLkN1c3RvbUZvcm1hdENvbmZpZ2BcblxuZXhwb3J0IHZhciBGb3JtYXR0ZWREYXRlID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXREYXRlJyk7XG5leHBvcnQgdmFyIEZvcm1hdHRlZFRpbWUgPSBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQoJ2Zvcm1hdFRpbWUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkTnVtYmVyID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXROdW1iZXInKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkTGlzdCA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0TGlzdCcpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWREaXNwbGF5TmFtZSA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0RGlzcGxheU5hbWUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkRGF0ZVBhcnRzID0gY3JlYXRlRm9ybWF0dGVkRGF0ZVRpbWVQYXJ0c0NvbXBvbmVudCgnZm9ybWF0RGF0ZScpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWRUaW1lUGFydHMgPSBjcmVhdGVGb3JtYXR0ZWREYXRlVGltZVBhcnRzQ29tcG9uZW50KCdmb3JtYXRUaW1lJyk7XG5leHBvcnQgeyBGb3JtYXR0ZWROdW1iZXJQYXJ0cywgRm9ybWF0dGVkTGlzdFBhcnRzIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9jcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtYXR0ZWRSZWxhdGl2ZVRpbWUgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3JlbGF0aXZlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkUGx1cmFsIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9wbHVyYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9tZXNzYWdlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkRGF0ZVRpbWVSYW5nZSB9IGZyb20gJy4vc3JjL2NvbXBvbmVudHMvZGF0ZVRpbWVSYW5nZSc7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4424\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')},828: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/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/images/icon.png\n/* harmony default export */ var icon = (\"data:image/png;base64,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\");\n;// CONCATENATED MODULE: ./src/components/J40Header.tsx\n// @ts-ignore\nvar J40Header=function J40Header(){var intl=(0,gatsby_plugin_intl.useIntl)();var _useState=(0,react.useState)(false),mobileNavOpen=_useState[0],setMobileNavOpen=_useState[1];var messages=(0,react_intl_lib/* defineMessages */.vU)({titleLine1:{id:'header.title.line1',defaultMessage:\"Climate and Economic Justice\",description:'Title in nav header line 1 of 2'},titleLine2:{id:'header.title.line2',defaultMessage:\"Screening Tool\",description:'Title in nav header line 2 of 2'},about:{id:'header.about',defaultMessage:'About',description:'Header navigate item to the about page'},explore:{id:'header.explore',defaultMessage:'Explore the tool',description:'Header navigate item to the Explore the tool page'},methodology:{id:'header.methodology',defaultMessage:'Data & methodology',description:'Header navigate item to the Methodology page'},contact:{id:'header.contact',defaultMessage:'Contact',description:'Header navigate item to the Contact page'}});var titleL1=intl.formatMessage(messages.titleLine1);var titleL2=intl.formatMessage(messages.titleLine2);var toggleMobileNav=function toggleMobileNav(){return setMobileNavOpen(function(prevOpen){return!prevOpen;});};var headerLinks=function headerLinks(){// 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,{to:'/',key:'about',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.about))],['cejst',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/cejst',key:'cejst',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.explore))],['methodology',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology',key:'methodology',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.methodology))],['contact',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/contact',key:'contact',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.contact))]]);var menu=['about','cejst','methodology','contact'];return menu.map(function(key){return menuData.get(key);});};return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.GovBanner,null),/*#__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(\"h1\",{className:\"usa-logo\"},/*#__PURE__*/react.createElement(\"img\",{className:\"j40-sitelogo\",src:icon,alt:titleL1+\" \"+titleL2}),/*#__PURE__*/react.createElement(\"span\",{className:'usa-logo__text j40-title'},/*#__PURE__*/react.createElement(\"span\",{className:'j40-title-line1'},titleL1),/*#__PURE__*/react.createElement(\"br\",null),/*#__PURE__*/react.createElement(\"span\",{className:'j40-title-line2'},titleL2))),/*#__PURE__*/react.createElement(lib.NavMenuButton,{key:'mobileMenuButton',onClick:toggleMobileNav,label:\"Menu\"})),/*#__PURE__*/react.createElement(lib.PrimaryNav,{items:headerLinks(),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(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({arialabelfooter:{id:'footer.arialabel',defaultMessage:'Footer navigation',description:'aria-label text for whole footer'},logotitle:{id:'footer.logo.title',defaultMessage:'Council on Environmental Quality',description:'Footer under logo'},moreinfoheader:{id:'footer.moreinfoheader',defaultMessage:'More information',description:'Footer column header'},foia:{id:'footer.foialink',defaultMessage:'Freedom of Information Act (FOIA)',description:'Footer FOIA link text'},privacy:{id:'footer.privacylink',defaultMessage:'Privacy Policy',description:'Footer privacy policy link text'},whitehouselogoalt:{id:'footer.whitehouselogoalt',defaultMessage:'Whitehouse logo',description:'Footer Whitehouse logo alt text'},questionsheader:{id:'footer.questionsheader',defaultMessage:'Have a question about government services?',description:'Footer column header'},contactlink:{id:'footer.findcontactlink',defaultMessage:'Find a contact at USA.gov',description:'Footer find contact link text'}});// see https://designsystem.digital.gov/components/footer/\nreturn/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Footer,{size:\"big\",className:'j40-footer',primary:/*#__PURE__*/react.createElement(lib.GridContainer,null,/*#__PURE__*/react.createElement(lib.Grid,null,/*#__PURE__*/react.createElement(lib.FooterNav,{\"aria-label\":intl.formatMessage(messages.arialabelfooter),size:\"big\"// fyi you leave this off and it silently fails...\n,links:[['Contact',/*#__PURE__*/react.createElement(lib.Address,{key:'footeraddress',className:'j40-footer-address',size:'big',items:['730 Jackson Pl NW','Washington, D.C. 20506','(202) 395-5750']})],[intl.formatMessage(messages.moreinfoheader),/*#__PURE__*/react.createElement(\"a\",{key:'whitehouselink2',href:'https://www.whitehouse.gov/',target:'_blank',rel:'noreferrer'},\"Whitehouse.gov\"),/*#__PURE__*/react.createElement(\"a\",{key:\"foialink\",target:'_blank',rel:'noreferrer',href:'https://www.whitehouse.gov/ceq/foia'},intl.formatMessage(messages.foia)),/*#__PURE__*/react.createElement(\"a\",{key:'privacylink',target:'_blank',rel:'noreferrer',href:'https://www.whitehouse.gov/privacy/'},intl.formatMessage(messages.privacy))],[intl.formatMessage(messages.questionsheader),/*#__PURE__*/react.createElement(\"a\",{key:'contactlink',href:'https://www.usa.gov/'},intl.formatMessage(messages.contactlink))]]}))),secondary:/*#__PURE__*/react.createElement(lib.Logo,{size:\"medium\",key:'logoimg',className:'j40-footer-logo',image:/*#__PURE__*/react.createElement(\"img\",{className:'usa-footer__logo-img',src:eop_seal,alt:intl.formatMessage(messages.whitehouselogoalt)}),heading:/*#__PURE__*/react.createElement(\"p\",{className:'j40-footer-logo-heading'},intl.formatMessage(messages.logotitle))})}));};/* harmony default export */ var components_J40Footer = (J40Footer);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n;// CONCATENATED MODULE: ./src/components/layout.tsx\nvar Layout=function Layout(_ref){var children=_ref.children,location=_ref.location;// @ts-ignore\nreturn/*#__PURE__*/react.createElement(FlagContext/* URLFlagProvider */.RE,{location:location},/*#__PURE__*/react.createElement(components_J40Header,null),/*#__PURE__*/react.createElement(\"main\",{id:'main-content'},children),/*#__PURE__*/react.createElement(components_J40Footer,null));};/* harmony default export */ var layout = (Layout);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9pbWFnZXMvaWNvbi5wbmc/NWJiYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0MEhlYWRlci50c3g/ZmI1ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9pbWFnZXMvZW9wLXNlYWwuc3ZnP2UyNDQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBGb290ZXIudHN4P2RkNzkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9sYXlvdXQudHN4P2Y0MzgiXSwibmFtZXMiOlsiSjQwSGVhZGVyIiwiaW50bCIsInVzZUludGwiLCJ1c2VTdGF0ZSIsIm1vYmlsZU5hdk9wZW4iLCJzZXRNb2JpbGVOYXZPcGVuIiwibWVzc2FnZXMiLCJkZWZpbmVNZXNzYWdlcyIsInRpdGxlTGluZTEiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJ0aXRsZUxpbmUyIiwiYWJvdXQiLCJleHBsb3JlIiwibWV0aG9kb2xvZ3kiLCJjb250YWN0IiwidGl0bGVMMSIsImZvcm1hdE1lc3NhZ2UiLCJ0aXRsZUwyIiwidG9nZ2xlTW9iaWxlTmF2IiwicHJldk9wZW4iLCJoZWFkZXJMaW5rcyIsIm1lbnVEYXRhIiwiTWFwIiwibWVudSIsIm1hcCIsImtleSIsImdldCIsInNpdGVMb2dvIiwiSjQwRm9vdGVyIiwiYXJpYWxhYmVsZm9vdGVyIiwibG9nb3RpdGxlIiwibW9yZWluZm9oZWFkZXIiLCJmb2lhIiwicHJpdmFjeSIsIndoaXRlaG91c2Vsb2dvYWx0IiwicXVlc3Rpb25zaGVhZGVyIiwiY29udGFjdGxpbmsiLCJ3aGl0ZWhvdXNlSWNvbiIsIkxheW91dCIsImNoaWxkcmVuIiwibG9jYXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFlLGdCQUFnQiw0akc7O0FD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QUhILENBRkYsQ0FuQ0ssQ0FIVCxFQURhLENBQWYsQ0FKSixDQXNERSxTQUFTLGNBQ1Asb0JBQUMsUUFBRCxFQUNFLElBQUksQ0FBQyxRQURQLENBRUUsR0FBRyxDQUFFLFNBRlAsQ0FHRSxTQUFTLENBQUUsaUJBSGIsQ0FJRSxLQUFLLGNBQ0gsMkJBQ0UsU0FBUyxDQUFFLHNCQURiLENBRUUsR0FBRyxDQUFFQyxRQUZQLENBR0UsR0FBRyxDQUFFdEMsSUFBSSxDQUFDaUIsYUFBTCxDQUFtQlosUUFBUSxDQUFDOEIsaUJBQTVCLENBSFAsRUFMSixDQVVFLE9BQU8sY0FBRSx5QkFDUCxTQUFTLENBQUUseUJBREosRUFFTm5DLElBQUksQ0FBQ2lCLGFBQUwsQ0FBbUJaLFFBQVEsQ0FBQzBCLFNBQTVCLENBRk0sQ0FWWCxFQXZESixFQURGLENBREYsQ0EwRUQsQ0F4SEQsQ0EwSEEseURBQWVGLFNBQWYsRTs7OztBQy9IQSxHQUFNVSxPQUFNLENBQUcsUUFBVEEsT0FBUyxNQUF3QyxJQUF0Q0MsU0FBc0MsTUFBdENBLFFBQXNDLENBQTVCQyxRQUE0QixNQUE1QkEsUUFBNEIsQ0FDckQ7QUFDQSxtQkFDRSxvQkFBQyxtQ0FBRCxFQUFpQixRQUFRLENBQUVBLFFBQTNCLGVBQ0Usb0JBQUMsb0JBQUQsTUFERixjQUVFLDRCQUFNLEVBQUUsQ0FBRSxjQUFWLEVBQ0dELFFBREgsQ0FGRixjQUtFLG9CQUFDLG9CQUFELE1BTEYsQ0FERixDQVNELENBWEQsQ0FhQSwyQ0FBZUQsTUFBZiIsImZpbGUiOiI4MjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSElBQUFCSENBWUFBQURiYWhOakFBQUFDWEJJV1hNQUFCWWxBQUFXSlFGSlVpVHdBQUFJMlVsRVFWUjRuTzFkdTNJaVJ4VHQzVkl1VEVpeStBdk1acE9ZWlltaHJDL0FPRE9SRVJIWlNoa1JaaU5DQTErQUMySU1SSk1adnNBaUlhVEVGNnlycDA3THJXRWUvUmFET1ZYVWFuZEhtcGsrMDdmdlBmZE02OTIzYjkrSUNlVExyUndocElRUC9icUlENDluUXNnR2Y2ZC9QaDNXdzQyUkM3aFE3UDBhSGNNMnhwWGlpUkF5TFhqektYL0h5a1NDdUR0Q1NBV2ZEeHBEdVNLRUxPbm5zQjR1WFZLeTkydDNFWVAwN1BJYTRyRDNhd05DeUc4eC83Mmw0ODZ1VlpySWZMbEZiN3hKQ1BuSjB2VWY2V0FTUWdZMlp5c0lITVE4Z0Y4TDNyeHQ2OXhwMlBzMU9rbEdBbVA4UXFZd2tmbHlpNUwzb0RuelpMR2o1enlzaHlPVFAzVHYxK2k5L0pGeTJLc24zaFgyZnEwRUVuOFFQT1c0NE0yYnFVUmlCc1k5dWE1d3hBeDkwRDBmMXB4L0JBOTNTdWJlcjdVeFdXNGx2dTFZOE9hNVdDS3hCb3BNYjVlZ003UjlXQStucXVmYyt6VjZUejlMZkFzbHMxbnc1amJEZkJGai9VbnhSM3lPSkJLemNDVDVaTGdFVFk2YWgvWHdTZmFjZTcrMmtRaGJERUZFS0hoejdZZ1F1cFlpWnFETWd4V0ZVeUx6NVJhZDNyK2J2R0JMT0dKMlNxMmZlNyttVTIvdE1QQmFtUzBTclRzREJESjhmRVZrdnR5U0RUdm5nREVJRlJyWXZWOTdNckRlczh3NktKa0szand4TW1EbXNUTHR6bkNrMnhXOGVmR0Z5SXlTeUJBa0pTSmtLcXlSb2xqRkhLZTY3b25pdnVETkJ3R1IrWEtMaG9zdmxrOW9HMGVRbVppVTdQMGFuUlYvWmZ4ZUdZTFNnMzc5N3JzZmY1Vkp4ODhkb21RbUtTWlp3UXVKRkRlSTJhYXhndHdWWGp1WUhsdTBWSmZlb3VhdEpCMUVWUnVvSjFsZFNvSnd5djhEblpGVEE3WGlEb3YvU0ZSV3k1ZGJOaE9BanlMWFlYRzl0QVVhY2U0SzN2eEVqNlpFTGpVV1pDTVNHaWZBdHhWcXZDamNIOWJEZ2NpQlVGT3lVRzZ0UUdKa1FuZURkcElza1VjUUtEUllhVUMyU1IrR1ViN2NxaUE4NmhDYUV6MlFoaWlJQk5NekZVQ0NzUTZIMGpEZW94YVNBVXYxalpBWUJtMWpIZFpEdW83ZTR5WlVJRldzSTFUUlVQK25qWHZTQUsyUmkya2tFdGJHeXBkYm91RlZ1RjR6QVlUY3FVTEUrRjVGdmlQL2xTZTZFVUVYWTh4QzRYdGdST1l3TTVNdTNpbUpQQ1RyM05WaFBVek1Xa1dBVmxmVFFVSFBjTVR5TXBBaGtJRlhkbko0RXNOWm5MRVdrZzdRRDAzcklkSnJMWnA4Mk5BZmJGdklyQWtuOVoxWU4yUVJKWnJuT09zRGNXMjlTRUsrM0NyaHhxTnEwQ0Nyc3hreFFDcXp0NVFVaUQwaXVXUWFyYkd4TldhK2NnbTAyVXJjS2FkdlllS0NHRjdraEk0b2JKanB6R2FET3BORVhuR0s5OWN4dVF4Y2lid1EzSmk4RGFneXZERzVGRkpaMk9MK3pCbVVsZXE5L3d2cVBiK0lNb2lWVklFS05ldDZyeElsWFlNeUU3eExHZ1UweStTbU1DZzdUVnJxUGI4U0dxVGxyT3VkaFVHNTN2T1QybTFCbHM2dVZjV2dYTUVUWXF0cklOMUpVUUVJSEVXVU1rSGRQT3Q2YjFZMzEzdCtYRTBmUmlEU1VETFAzYUM4aFJoaDFLQmM3L2tpNHNKNDF2V2FLY2NZQjBMcFZDTENmWjExdmJhSVFUbnV5WFVKWTQ1ekROUkdzSmluSW5yVFZhaXQ5M3dWRytweDF2VXlhVkJ1NnFoTktldE9GTFpZaTZ3bFpYaTRCaHBqSFd0UXJweHhmNDZ3bWFJaXg5Vjd2cXBCK1dIVzlZeTI3ckFXdGcwWTN5SU55aUxyeHpuZ0NES2x4T1o2ejljMktNKzZubGFJci9kOEpzUmZEY29jeG9mMVVEZ3BxZmQ4a3dibHFVaTVncG5IKzVOTTVodTdXZGNydmdnQ0dUWW8vNHl1aUdpdmRHTmdJRzh4VnNGNDFYditqbk1NYnJnM3RvbGlsMFFHUVhTNEpJUHlEbTJzeE5vVDllUEZHSlJaaVhTSkJ1VlNtdXhYNy9sWmZqMkM0VldkYTh1Z3ZFV29DYzhPcHNQYUNqZTNDRFdKVmc4NkFQV2VUekpNNW1OWWVUSmxVR1orazZsb2pjY1psTzhzMUtwQ0J1VU16c3dqQklxVFRQM2NETXFtSkVCaGczSzk1MmNsUDFpQnhNaGxneEtwOGtLTE5VT1dJVTMzVWViYUZLVXhWeEFTSTNRTXlsYTZBM1IySDliRG9rdURNa0xWMlJxVVJSUWxWbjZJeWxhdURjcXFteVFJclpGUlNHaHZ1Y1FZczFEYW9DelNFWGhMZzdKTStEZGlVRWFyeTJYYmpxbEZVZ1F5Q0J1VXNTYStXZWRjd3FDY1drZktBRE8wYWNtZ1RCRE9wN0J2S0k5djFnektTV0ZQZWNzV1VTQXBZdVprMVV4L3hWbEt0TnpsUEs0R1pRMmdpNUdMTUpueFlHOXVQOW5zYVY0TnloZUNxNi8xUW1EYTE4cHY5aERlZEplQmVWcWZyNXZ1cHFNenFUTFZpNDBuSGI5cHY3RjRGYWExUWl2ckEzSWZsYXh1eTk1T2dxL1ZhV2JjbVZUNWgrNjUzMWljemNQVm1WU1Rkb3NNZHZ6cU54Ykt2dFlpOTc2Z2pScHJ5L1lUc0VscVoxSXRvYXdLWjUrQmZ0eHZMSXhhTUdYUm1WUkZCUDF0djdFSWtqNFpYMnNGQkxwMDFZMUJxTkVTQ0NRdVV5TEl1TjlZT1BlMUlwVEt1QmNmKzQzRmc0aXZWWGN2VVJOWW9jdWlUU2dHNmtsd0dYQktabWRTVlpFSGovM0dJdDdYU3VUZjNYZUJGWGFDVkY3SE9wT3E3RDBGMWt1MkZ0a0FIcTRIalczVlBrYVdIelNKZ1pCK2JuMDZHaFgrcHRvck1tUVZ5T3F3Tk1SdE9wT3FEU2NGSmJHSkNLR3pOOTdwak16QTdza01TcTd6enFTcW80Q3NrQWhwaFhoa3lrM2tIQ2JHK1hQWTE1b1ZjeklQcVNaeVoxSjlOakI0TzJTOFM5RnlCUWtXRStCTjd1RVRySkc4cnpXTEpGSjhRVDByK2dyQjBrRG0vWUh0WDllWlZFbkNicGhNZzdXWktBWk41NERJREpQSVFJbFowaEpKZ0V3VFpyTXdQcjFSVnI5bFJGTFBqa3c2ZnU0UWFuNTNKbFViWkxwR2NLOHNtNzVCekxaQll0d2UzN1kyM1NWWWUwWUNYdDJtd0padDU0eVQrdGFVcjVWd25lNWxXbk9YRTlkWm85YjBnS1p1S29qYUxZdGszdmNiaXhNemxxNnYxWWdOaE5OdlRVV0hYMFM5dG9LYTVqa2dlTGNsTGt0K0g1RnBpZUlyTnZCNzBCVzM2ZXc1cklkdGhOMUhEUnNrUTF3TDdRUUlVZmVhNTdNTk90YWxwRktIemtqWmpQV0l0NTZzZVhrUWVuVWtLMkduT1FQcVBKbmZFdWNDSzdTcVVtdFZab2NVZmZsekN4S2RiSEtVc2h0a0VwUjlyU2s5UUZlUVZwQVlrU0p0blRmeHRTYllOT09nN1d0Rkl0UTJLS0dKZ2lhTUF4VUprUGUxeGpWYWllenZuN0lCd1U2TTBDOXdrUUZFYlpzN0tiTkcrb2w5UXdaUm9qblRCSmxRa0ZwT3VBSVVxRUhNTEJGNlkxa1ZFTG9yWE1ta09sTjMzT2E3V3VUeHlKd2RFcUcyR2ZHd09iVm1jRjRmcHFkR2JiNGIza1J4WTZXdlNRajVGMElsbE5MUTIwY1pBQUFBQUVsRlRrU3VRbUNDXCIiLCJpbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rLCB1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtcbiAgSGVhZGVyLFxuICBOYXZNZW51QnV0dG9uLFxuICBQcmltYXJ5TmF2LFxuICBHb3ZCYW5uZXIsXG59IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHNpdGVMb2dvIGZyb20gJy4uLy4uL3NyYy9pbWFnZXMvaWNvbi5wbmcnO1xuXG5jb25zdCBKNDBIZWFkZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IFttb2JpbGVOYXZPcGVuLCBzZXRNb2JpbGVOYXZPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgdGl0bGVMaW5lMToge1xuICAgICAgaWQ6ICdoZWFkZXIudGl0bGUubGluZTEnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6IGBDbGltYXRlIGFuZCBFY29ub21pYyBKdXN0aWNlYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgaW4gbmF2IGhlYWRlciBsaW5lIDEgb2YgMicsXG4gICAgfSxcbiAgICB0aXRsZUxpbmUyOiB7XG4gICAgICBpZDogJ2hlYWRlci50aXRsZS5saW5lMicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogYFNjcmVlbmluZyBUb29sYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgaW4gbmF2IGhlYWRlciBsaW5lIDIgb2YgMicsXG4gICAgfSxcbiAgICBhYm91dDoge1xuICAgICAgaWQ6ICdoZWFkZXIuYWJvdXQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdBYm91dCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0hlYWRlciBuYXZpZ2F0ZSBpdGVtIHRvIHRoZSBhYm91dCBwYWdlJyxcbiAgICB9LFxuICAgIGV4cGxvcmU6IHtcbiAgICAgIGlkOiAnaGVhZGVyLmV4cGxvcmUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdFeHBsb3JlIHRoZSB0b29sJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVhZGVyIG5hdmlnYXRlIGl0ZW0gdG8gdGhlIEV4cGxvcmUgdGhlIHRvb2wgcGFnZScsXG4gICAgfSxcbiAgICBtZXRob2RvbG9neToge1xuICAgICAgaWQ6ICdoZWFkZXIubWV0aG9kb2xvZ3knLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhICYgbWV0aG9kb2xvZ3knLFxuICAgICAgZGVzY3JpcHRpb246ICdIZWFkZXIgbmF2aWdhdGUgaXRlbSB0byB0aGUgTWV0aG9kb2xvZ3kgcGFnZScsXG4gICAgfSxcbiAgICBjb250YWN0OiB7XG4gICAgICBpZDogJ2hlYWRlci5jb250YWN0JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ29udGFjdCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0hlYWRlciBuYXZpZ2F0ZSBpdGVtIHRvIHRoZSBDb250YWN0IHBhZ2UnLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCB0aXRsZUwxID0gaW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnRpdGxlTGluZTEpO1xuICBjb25zdCB0aXRsZUwyID0gaW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnRpdGxlTGluZTIpO1xuXG4gIGNvbnN0IHRvZ2dsZU1vYmlsZU5hdiA9ICgpOiB2b2lkID0+XG4gICAgc2V0TW9iaWxlTmF2T3BlbigocHJldk9wZW4pID0+ICFwcmV2T3Blbik7XG5cbiAgY29uc3QgaGVhZGVyTGlua3MgPSAoKSA9PiB7XG4gICAgLy8gc3RhdGljIG1hcCBvZiBhbGwgcG9zc2libGUgbWVudSBpdGVtcy4gT3JpZ2luYWxseSwgaXQgd2FzIGFsbCBzdHJpbmdzLFxuICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGhhbmRsZSBib3RoIG9uc2l0ZSBhbmQgb2Zmc2l0ZSBsaW5rcy5cbiAgICBjb25zdCBtZW51RGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBKU1guRWxlbWVudD4oW1xuICAgICAgWydhYm91dCcsXG4gICAgICAgIDxMaW5rXG4gICAgICAgICAgdG89eycvJ31cbiAgICAgICAgICBrZXk9eydhYm91dCd9XG4gICAgICAgICAgYWN0aXZlQ2xhc3NOYW1lPVwidXNhLWN1cnJlbnRcIlxuICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1oZWFkZXInfT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmFib3V0KX08L0xpbms+XSxcbiAgICAgIFsnY2Vqc3QnLFxuICAgICAgICA8TGlua1xuICAgICAgICAgIHRvPXsnL2NlanN0J31cbiAgICAgICAgICBrZXk9eydjZWpzdCd9XG4gICAgICAgICAgYWN0aXZlQ2xhc3NOYW1lPVwidXNhLWN1cnJlbnRcIlxuICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1oZWFkZXInfT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmV4cGxvcmUpfTwvTGluaz5dLFxuICAgICAgWydtZXRob2RvbG9neScsXG4gICAgICAgIDxMaW5rXG4gICAgICAgICAgdG89eycvbWV0aG9kb2xvZ3knfVxuICAgICAgICAgIGtleT17J21ldGhvZG9sb2d5J31cbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJ1c2EtY3VycmVudFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubWV0aG9kb2xvZ3kpfTwvTGluaz5dLFxuICAgICAgWydjb250YWN0JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy9jb250YWN0J31cbiAgICAgICAgICBrZXk9eydjb250YWN0J31cbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJ1c2EtY3VycmVudFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuY29udGFjdCl9PC9MaW5rPl0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBtZW51ID1bJ2Fib3V0JywgJ2NlanN0JywgJ21ldGhvZG9sb2d5JywgJ2NvbnRhY3QnXTtcbiAgICByZXR1cm4gbWVudS5tYXAoKGtleSkgPT4gbWVudURhdGEuZ2V0KGtleSkpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxHb3ZCYW5uZXIvPlxuICAgICAgPEhlYWRlclxuICAgICAgICBiYXNpYz17dHJ1ZX0gcm9sZT17J2Jhbm5lcid9XG4gICAgICAgIGNsYXNzTmFtZT17J3VzYS1oZWFkZXIgajQwLWhlYWRlcid9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYS1uYXYtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2EtbmF2YmFyXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidXNhLWxvZ29cIj5cbiAgICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJqNDAtc2l0ZWxvZ29cIiBzcmM9e3NpdGVMb2dvfSBhbHQ9e2Ake3RpdGxlTDF9ICR7dGl0bGVMMn1gfSAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eyd1c2EtbG9nb19fdGV4dCBqNDAtdGl0bGUnfT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtdGl0bGUtbGluZTEnfT57dGl0bGVMMX08L3NwYW4+PGJyLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtdGl0bGUtbGluZTInfT57dGl0bGVMMn08L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8TmF2TWVudUJ1dHRvblxuICAgICAgICAgICAgICBrZXk9eydtb2JpbGVNZW51QnV0dG9uJ31cbiAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlTW9iaWxlTmF2fVxuICAgICAgICAgICAgICBsYWJlbD1cIk1lbnVcIi8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPFByaW1hcnlOYXZcbiAgICAgICAgICAgIGl0ZW1zPXtoZWFkZXJMaW5rcygpfVxuICAgICAgICAgICAgbW9iaWxlRXhwYW5kZWQ9e21vYmlsZU5hdk9wZW59XG4gICAgICAgICAgICBvblRvZ2dsZU1vYmlsZU5hdj17dG9nZ2xlTW9iaWxlTmF2fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9XG4gICAgICAgICAgPlxuICAgICAgICAgIDwvUHJpbWFyeU5hdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0hlYWRlcj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEo0MEhlYWRlcjtcbiIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvZW9wLXNlYWwtMTJlNWRjYzQ0NTNjYjMzMjE1MTVmNTA4NzRkMWYxZjYuc3ZnXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIEZvb3RlcixcbiAgRm9vdGVyTmF2LFxuICBMb2dvLFxuICBHcmlkQ29udGFpbmVyLCBHcmlkLFxufSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge30gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aGl0ZWhvdXNlSWNvbiBmcm9tICcuLi9pbWFnZXMvZW9wLXNlYWwuc3ZnJztcblxuY29uc3QgSjQwRm9vdGVyID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICBhcmlhbGFiZWxmb290ZXI6IHtcbiAgICAgIGlkOiAnZm9vdGVyLmFyaWFsYWJlbCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0Zvb3RlciBuYXZpZ2F0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnYXJpYS1sYWJlbCB0ZXh0IGZvciB3aG9sZSBmb290ZXInLFxuICAgIH0sXG4gICAgbG9nb3RpdGxlOiB7XG4gICAgICBpZDogJ2Zvb3Rlci5sb2dvLnRpdGxlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ291bmNpbCBvbiBFbnZpcm9ubWVudGFsIFF1YWxpdHknLFxuICAgICAgZGVzY3JpcHRpb246ICdGb290ZXIgdW5kZXIgbG9nbycsXG4gICAgfSxcbiAgICBtb3JlaW5mb2hlYWRlcjoge1xuICAgICAgaWQ6ICdmb290ZXIubW9yZWluZm9oZWFkZXInLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdNb3JlIGluZm9ybWF0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9vdGVyIGNvbHVtbiBoZWFkZXInLFxuICAgIH0sXG4gICAgZm9pYToge1xuICAgICAgaWQ6ICdmb290ZXIuZm9pYWxpbmsnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGcmVlZG9tIG9mIEluZm9ybWF0aW9uIEFjdCAoRk9JQSknLFxuICAgICAgZGVzY3JpcHRpb246ICdGb290ZXIgRk9JQSBsaW5rIHRleHQnLFxuICAgIH0sXG4gICAgcHJpdmFjeToge1xuICAgICAgaWQ6ICdmb290ZXIucHJpdmFjeWxpbmsnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQcml2YWN5IFBvbGljeScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Zvb3RlciBwcml2YWN5IHBvbGljeSBsaW5rIHRleHQnLFxuICAgIH0sXG4gICAgd2hpdGVob3VzZWxvZ29hbHQ6IHtcbiAgICAgIGlkOiAnZm9vdGVyLndoaXRlaG91c2Vsb2dvYWx0JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnV2hpdGVob3VzZSBsb2dvJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9vdGVyIFdoaXRlaG91c2UgbG9nbyBhbHQgdGV4dCcsXG4gICAgfSxcbiAgICBxdWVzdGlvbnNoZWFkZXI6IHtcbiAgICAgIGlkOiAnZm9vdGVyLnF1ZXN0aW9uc2hlYWRlcicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0hhdmUgYSBxdWVzdGlvbiBhYm91dCBnb3Zlcm5tZW50IHNlcnZpY2VzPycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Zvb3RlciBjb2x1bW4gaGVhZGVyJyxcbiAgICB9LFxuICAgIGNvbnRhY3RsaW5rOiB7XG4gICAgICBpZDogJ2Zvb3Rlci5maW5kY29udGFjdGxpbmsnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGaW5kIGEgY29udGFjdCBhdCBVU0EuZ292JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9vdGVyIGZpbmQgY29udGFjdCBsaW5rIHRleHQnLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIHNlZSBodHRwczovL2Rlc2lnbnN5c3RlbS5kaWdpdGFsLmdvdi9jb21wb25lbnRzL2Zvb3Rlci9cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEZvb3RlclxuICAgICAgICBzaXplPVwiYmlnXCJcbiAgICAgICAgY2xhc3NOYW1lPXsnajQwLWZvb3Rlcid9XG4gICAgICAgIHByaW1hcnk9e1xuICAgICAgICAgIDxHcmlkQ29udGFpbmVyPjxHcmlkPlxuICAgICAgICAgICAgPEZvb3Rlck5hdlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYXJpYWxhYmVsZm9vdGVyKX1cbiAgICAgICAgICAgICAgc2l6ZT1cImJpZ1wiIC8vIGZ5aSB5b3UgbGVhdmUgdGhpcyBvZmYgYW5kIGl0IHNpbGVudGx5IGZhaWxzLi4uXG4gICAgICAgICAgICAgIGxpbmtzPXtbXG4gICAgICAgICAgICAgICAgWydDb250YWN0JyxcbiAgICAgICAgICAgICAgICAgIDxBZGRyZXNzXG4gICAgICAgICAgICAgICAgICAgIGtleT17J2Zvb3RlcmFkZHJlc3MnfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydqNDAtZm9vdGVyLWFkZHJlc3MnfVxuICAgICAgICAgICAgICAgICAgICBzaXplPXsnYmlnJ31cbiAgICAgICAgICAgICAgICAgICAgaXRlbXM9e1tcbiAgICAgICAgICAgICAgICAgICAgICAnNzMwIEphY2tzb24gUGwgTlcnLFxuICAgICAgICAgICAgICAgICAgICAgICdXYXNoaW5ndG9uLCBELkMuIDIwNTA2JyxcbiAgICAgICAgICAgICAgICAgICAgICAnKDIwMikgMzk1LTU3NTAnLFxuICAgICAgICAgICAgICAgICAgICBdfVxuICAgICAgICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubW9yZWluZm9oZWFkZXIpLFxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAga2V5PXsnd2hpdGVob3VzZWxpbmsyJ31cbiAgICAgICAgICAgICAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LndoaXRlaG91c2UuZ292Lyd9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgICAgICAgICAgICAgIHJlbD17J25vcmVmZXJyZXInfT5XaGl0ZWhvdXNlLmdvdjwvYT4sXG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBrZXk9XCJmb2lhbGlua1wiXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgICAgICAgICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICAgICAgICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3YvY2VxL2ZvaWEnfT5cbiAgICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5mb2lhKX1cbiAgICAgICAgICAgICAgICAgIDwvYT4sXG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBrZXk9eydwcml2YWN5bGluayd9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgICAgICAgICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICAgICAgICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3YvcHJpdmFjeS8nfT5cbiAgICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5wcml2YWN5KX1cbiAgICAgICAgICAgICAgICAgIDwvYT4sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucXVlc3Rpb25zaGVhZGVyKSxcbiAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIGtleT17J2NvbnRhY3RsaW5rJ31cbiAgICAgICAgICAgICAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LnVzYS5nb3YvJ30+XG4gICAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuY29udGFjdGxpbmspfVxuICAgICAgICAgICAgICAgICAgPC9hPixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBdfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0dyaWQ+PC9HcmlkQ29udGFpbmVyPn1cbiAgICAgICAgc2Vjb25kYXJ5PXtcbiAgICAgICAgICA8TG9nb1xuICAgICAgICAgICAgc2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgICAgICBrZXk9eydsb2dvaW1nJ31cbiAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1mb290ZXItbG9nbyd9XG4gICAgICAgICAgICBpbWFnZT17XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9eyd1c2EtZm9vdGVyX19sb2dvLWltZyd9XG4gICAgICAgICAgICAgICAgc3JjPXt3aGl0ZWhvdXNlSWNvbn1cbiAgICAgICAgICAgICAgICBhbHQ9e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy53aGl0ZWhvdXNlbG9nb2FsdCl9Lz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRpbmc9ezxwXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1mb290ZXItbG9nby1oZWFkaW5nJ30+XG4gICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubG9nb3RpdGxlKX08L3A+fVxuICAgICAgICAgIC8+fVxuICAgICAgLz5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEo0MEZvb3RlcjtcbiIsImltcG9ydCBSZWFjdCwge1JlYWN0Tm9kZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEo0MEhlYWRlciBmcm9tICcuL0o0MEhlYWRlcic7XG5pbXBvcnQgSjQwRm9vdGVyIGZyb20gJy4vSjQwRm9vdGVyJztcbmltcG9ydCB7VVJMRmxhZ1Byb3ZpZGVyfSBmcm9tICcuLi9jb250ZXh0cy9GbGFnQ29udGV4dCc7XG5cbmludGVyZmFjZSBJTGF5b3V0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlLFxuICBsb2NhdGlvbjogTG9jYXRpb25cbn1cblxuY29uc3QgTGF5b3V0ID0gKHtjaGlsZHJlbiwgbG9jYXRpb259OiBJTGF5b3V0UHJvcHMpID0+IHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gKFxuICAgIDxVUkxGbGFnUHJvdmlkZXIgbG9jYXRpb249e2xvY2F0aW9ufT5cbiAgICAgIDxKNDBIZWFkZXIgLz5cbiAgICAgIDxtYWluIGlkPXsnbWFpbi1jb250ZW50J30+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvbWFpbj5cbiAgICAgIDxKNDBGb290ZXIvPlxuICAgIDwvVVJMRmxhZ1Byb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGF5b3V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///828\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);\nfunction _createForOfIteratorHelperLoose(o,allowArrayLike){var it=typeof Symbol!=="undefined"&&o[Symbol.iterator]||o["@@iterator"];if(it)return(it=it.call(o)).next.bind(it);if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&typeof o.length==="number"){if(it)o=it;var i=0;return function(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]};};}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}function _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);}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i 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__(379);\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/Mjc4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFbEQsMkJBQTJCLG1CQUFPLENBQUMsSUFBMkI7O0FBRTlELGlDQUFpQyxtQkFBTyxDQUFDLEdBQWlDOztBQUUxRSxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFzQjs7QUFFcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiMzAzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiKTtcblxudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\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__(379);\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzPzQ0OGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhELHNCQUFzQixtQkFBTyxDQUFDLElBQXNCOztBQUVwRCxpQ0FBaUMsbUJBQU8sQ0FBQyxHQUFpQzs7QUFFMUUsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjMxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///319\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')},379: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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzY2MTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIzNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///379\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")},4424:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "vU": function() { return /* binding */ defineMessages; }\n});\n\n// UNUSED EXPORTS: FormattedDate, FormattedDateParts, FormattedDateTimeRange, FormattedDisplayName, FormattedList, FormattedListParts, FormattedMessage, FormattedNumber, FormattedNumberParts, FormattedPlural, FormattedRelativeTime, FormattedTime, FormattedTimeParts, IntlContext, IntlProvider, InvalidConfigError, MessageFormatError, MissingDataError, MissingTranslationError, RawIntlProvider, ReactIntlError, ReactIntlErrorCode, UnsupportedFormatterError, createIntl, createIntlCache, defineMessage, injectIntl, useIntl\n\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _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\nfunction __extends(d, b) {\n if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n\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\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(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\n\nfunction tslib_es6_rest(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}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator["throw"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n "throw": verb(1),\n "return": verb(2)\n }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nvar __createBinding = Object.create ? function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, {\n enumerable: true,\n get: function get() {\n return m[k];\n }\n });\n} : function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n};\nfunction __exportStar(m, o) {\n for (var p in m) {\n if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n }\n}\nfunction __values(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}\nfunction __read(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/** @deprecated */\n\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\n/** @deprecated */\n\nfunction __spreadArrays() {\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}\nfunction tslib_es6_spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || from);\n}\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume("next", value);\n }\n\n function reject(value) {\n resume("throw", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) {\n throw e;\n }), verb("return"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === "return"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, "raw", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\n\nvar __setModuleDefault = Object.create ? function (o, v) {\n Object.defineProperty(o, "default", {\n enumerable: true,\n value: v\n });\n} : function (o, v) {\n o["default"] = v;\n};\n\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n }\n\n __setModuleDefault(result, mod);\n\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === "m") throw new TypeError("Private method is not writable");\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n}\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\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);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/injectIntl.js\n\n\n\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 = (/* unused pure expression or super */ null && (IntlProvider));\nvar Context = IntlContext;\nfunction injectIntl(WrappedComponent, options) {\n var _a = options || {},\n _b = _a.intlPropName,\n intlPropName = _b === void 0 ? \'intl\' : _b,\n _c = _a.forwardRef,\n forwardRef = _c === void 0 ? false : _c,\n _d = _a.enforceContext,\n enforceContext = _d === void 0 ? true : _d;\n\n var WithIntl = function WithIntl(props) {\n return React.createElement(IntlConsumer, null, function (intl) {\n var _a;\n\n if (enforceContext) {\n invariantIntlContext(intl);\n }\n\n var intlProp = (_a = {}, _a[intlPropName] = intl, _a);\n return React.createElement(WrappedComponent, __assign({}, props, intlProp, {\n ref: forwardRef ? props.forwardedRef : null\n }));\n });\n };\n\n WithIntl.displayName = "injectIntl(" + getDisplayName(WrappedComponent) + ")";\n WithIntl.WrappedComponent = WrappedComponent;\n\n if (forwardRef) {\n return hoistNonReactStatics(React.forwardRef(function (props, ref) {\n return React.createElement(WithIntl, __assign({}, props, {\n forwardedRef: ref\n }));\n }), WrappedComponent);\n }\n\n return hoistNonReactStatics(WithIntl, WrappedComponent);\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/ecma402-abstract/lib/utils.js\n/**\n * Cannot do Math.log(x) / Math.log(10) bc if IEEE floating point issue\n * @param x number\n */\nfunction getMagnitude(x) {\n // Cannot count string length via Number.toString because it may use scientific notation\n // for very small or very large numbers.\n return Math.floor(Math.log(x) * Math.LOG10E);\n}\nfunction repeat(s, times) {\n if (typeof s.repeat === \'function\') {\n return s.repeat(times);\n }\n\n var arr = new Array(times);\n\n for (var i = 0; i < arr.length; i++) {\n arr[i] = s;\n }\n\n return arr.join(\'\');\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}\n/*\n 17 ECMAScript Standard Built-in Objects:\n Every built-in Function object, including constructors, that is not\n identified as an anonymous function has a name property whose value\n is a String.\n\n Unless otherwise specified, the name property of a built-in Function\n object, if it exists, has the attributes { [[Writable]]: false,\n [[Enumerable]]: false, [[Configurable]]: true }.\n*/\n\nfunction defineProperty(target, name, _a) {\n var value = _a.value;\n Object.defineProperty(target, name, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: value\n });\n}\nvar UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\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}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/fast-memoize/lib/index.js\n//\n// Main\n//\nfunction lib_memoize(fn, options) {\n var cache = options && options.cache ? options.cache : cacheDefault;\n var serializer = options && options.serializer ? options.serializer : serializerDefault;\n var strategy = options && options.strategy ? options.strategy : strategyDefault;\n return strategy(fn, {\n cache: cache,\n serializer: serializer\n });\n} //\n// Strategy\n//\n\nfunction isPrimitive(value) {\n return value == null || typeof value === \'number\' || typeof value === \'boolean\'; // || typeof value === "string" \'unsafe\' primitive for our needs\n}\n\nfunction monadic(fn, cache, serializer, arg) {\n var cacheKey = isPrimitive(arg) ? arg : serializer(arg);\n var computedValue = cache.get(cacheKey);\n\n if (typeof computedValue === \'undefined\') {\n computedValue = fn.call(this, arg);\n cache.set(cacheKey, computedValue);\n }\n\n return computedValue;\n}\n\nfunction variadic(fn, cache, serializer) {\n var args = Array.prototype.slice.call(arguments, 3);\n var cacheKey = serializer(args);\n var computedValue = cache.get(cacheKey);\n\n if (typeof computedValue === \'undefined\') {\n computedValue = fn.apply(this, args);\n cache.set(cacheKey, computedValue);\n }\n\n return computedValue;\n}\n\nfunction assemble(fn, context, strategy, cache, serialize) {\n return strategy.bind(context, fn, cache, serialize);\n}\n\nfunction strategyDefault(fn, options) {\n var strategy = fn.length === 1 ? monadic : variadic;\n return assemble(fn, this, strategy, options.cache.create(), options.serializer);\n}\n\nfunction strategyVariadic(fn, options) {\n return assemble(fn, this, variadic, options.cache.create(), options.serializer);\n}\n\nfunction strategyMonadic(fn, options) {\n return assemble(fn, this, monadic, options.cache.create(), options.serializer);\n} //\n// Serializer\n//\n\n\nvar serializerDefault = function serializerDefault() {\n return JSON.stringify(arguments);\n}; //\n// Cache\n//\n\n\nfunction ObjectWithoutPrototypeCache() {\n this.cache = Object.create(null);\n}\n\nObjectWithoutPrototypeCache.prototype.has = function (key) {\n return key in this.cache;\n};\n\nObjectWithoutPrototypeCache.prototype.get = function (key) {\n return this.cache[key];\n};\n\nObjectWithoutPrototypeCache.prototype.set = function (key, value) {\n this.cache[key] = value;\n};\n\nvar cacheDefault = {\n create: function create() {\n // @ts-ignore\n return new ObjectWithoutPrototypeCache();\n }\n};\nvar lib_strategies = {\n variadic: strategyVariadic,\n monadic: strategyMonadic\n};\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl/lib/src/utils.js\n\n\n\n\nfunction filterProps(props, whitelist, defaults) {\n if (defaults === void 0) {\n defaults = {};\n }\n\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}\n\nvar defaultErrorHandler = function defaultErrorHandler(error) {\n if (false) {}\n};\n\nvar DEFAULT_INTL_CONFIG = {\n formats: {},\n messages: {},\n timeZone: undefined,\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\nfunction createFastMemoizeCache(store) {\n return {\n create: function create() {\n return {\n has: function has(key) {\n return key in store;\n },\n get: function get(key) {\n return store[key];\n },\n set: function set(key, value) {\n store[key] = value;\n }\n };\n }\n };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\n\n\nfunction createFormatters(cache) {\n if (cache === void 0) {\n cache = createIntlCache();\n }\n\n var RelativeTimeFormat = Intl.RelativeTimeFormat;\n var ListFormat = Intl.ListFormat;\n var DisplayNames = Intl.DisplayNames;\n var getDateTimeFormat = memoize(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 return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.dateTime),\n strategy: strategies.variadic\n });\n var getNumberFormat = memoize(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 return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.number),\n strategy: strategies.variadic\n });\n var getPluralRules = memoize(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 return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.pluralRules),\n strategy: strategies.variadic\n });\n return {\n getDateTimeFormat: getDateTimeFormat,\n getNumberFormat: getNumberFormat,\n getMessageFormat: memoize(function (message, locales, overrideFormats, opts) {\n return new IntlMessageFormat(message, locales, overrideFormats, __assign({\n formatters: {\n getNumberFormat: getNumberFormat,\n getDateTimeFormat: getDateTimeFormat,\n getPluralRules: getPluralRules\n }\n }, opts || {}));\n }, {\n cache: createFastMemoizeCache(cache.message),\n strategy: strategies.variadic\n }),\n getRelativeTimeFormat: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (RelativeTimeFormat.bind.apply(RelativeTimeFormat, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.relativeTime),\n strategy: strategies.variadic\n }),\n getPluralRules: getPluralRules,\n getListFormat: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (ListFormat.bind.apply(ListFormat, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.list),\n strategy: strategies.variadic\n }),\n getDisplayNames: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (DisplayNames.bind.apply(DisplayNames, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.displayNames),\n strategy: strategies.variadic\n })\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(new UnsupportedFormatterError("No " + type + " format named: " + name));\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/utils.js\n\n\n\n\nfunction utils_invariantIntlContext(intl) {\n invariant(intl, \'[React Intl] Could not find required `intl` object. \' + \' needs to exist in the component ancestry.\');\n}\nvar utils_DEFAULT_INTL_CONFIG = _assign(_assign({}, DEFAULT_INTL_CONFIG), {\n textComponent: react.Fragment\n});\n/**\n * Takes a `formatXMLElementFn`, and composes it in function, which passes\n * argument `parts` through, assigning unique key to each part, to prevent\n * "Each child in a list should have a unique "key"" React error.\n * @param formatXMLElementFn\n */\n\nfunction assignUniqueKeysToParts(formatXMLElementFn) {\n return function (parts) {\n // eslint-disable-next-line prefer-rest-params\n return formatXMLElementFn(React.Children.toArray(parts));\n };\n}\nfunction shallowEqual(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;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/useIntl.js\n\n\n\nfunction useIntl_useIntl() {\n var intl = react.useContext(Context);\n utils_invariantIntlContext(intl);\n return intl;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/createFormattedComponent.js\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 var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props, ["value", "children"]);\n\n return children(intl.formatNumberToParts(value, formatProps));\n};\nFormattedNumberParts.displayName = \'FormattedNumberParts\';\nvar FormattedListParts = function FormattedListParts(props) {\n var intl = useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = __rest(props, ["value", "children"]);\n\n return children(intl.formatListToParts(value, formatProps));\n};\nFormattedNumberParts.displayName = \'FormattedNumberParts\';\nfunction createFormattedDateTimePartsComponent(name) {\n var ComponentParts = function ComponentParts(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_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 ComponentParts.displayName = DisplayNameParts[name];\n return ComponentParts;\n}\nfunction createFormattedComponent(name) {\n var Component = function Component(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props // TODO: fix TS type definition for localeMatcher upstream\n , ["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 Component.displayName = DisplayName[name];\n return Component;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/index.js\n\n\nfunction defineMessages(msgs) {\n return msgs;\n}\nfunction defineMessage(msg) {\n return msg;\n}\n\n\n // IMPORTANT: Explicit here to prevent api-extractor from outputing `import(\'./src/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//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/YjA1NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9zcmMvY29tcG9uZW50cy9pbmplY3RJbnRsLmpzP2RlYTkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2VjbWE0MDItYWJzdHJhY3QvbGliL3V0aWxzLmpzPzFjNjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2Zhc3QtbWVtb2l6ZS9saWIvaW5kZXguanM/NzRiOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC9saWIvc3JjL3V0aWxzLmpzPzQzZjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvc3JjL3V0aWxzLmpzPzlkMjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvc3JjL2NvbXBvbmVudHMvdXNlSW50bC5qcz9mODUzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL3NyYy9jb21wb25lbnRzL2NyZWF0ZUZvcm1hdHRlZENvbXBvbmVudC5qcz83YTUyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2luZGV4LmpzPzUzZmMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7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QTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGVBQU87O0FBRXRCO0FBQ0E7QUFDQSxzQkFBc0IsY0FBTTtBQUM1Qiw2QkFBNkI7OztBQUc3Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLGNBQWM7QUFDbkQsV0FBVyxtQkFBbUI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBLEM7O0FDbEY0SDtBQUNxRztBQUMxTjtBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDeUg7QUFDM0Q7QUFDa0I7O0FBRXpFLG9CQUFvQix3QkFBd0I7QUFDNUMsb0JBQW9CLHdCQUF3QjtBQUM1QyxzQkFBc0Isd0JBQXdCO0FBQzlDLG9CQUFvQix3QkFBd0I7QUFDNUMsMkJBQTJCLHdCQUF3QjtBQUNuRCx5QkFBeUIscUNBQXFDO0FBQzlELHlCQUF5QixxQ0FBcUM7QUFDZ0M7QUFDeEI7QUFDUjtBQUNFIiwiZmlsZSI6IjQ0MjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xudmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICBfX3Byb3RvX186IFtdXG4gIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGQuX19wcm90b19fID0gYjtcbiAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cblxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbnZhciBfYXNzaWduID0gZnVuY3Rpb24gX19hc3NpZ24oKSB7XG4gIF9hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IHsgX2Fzc2lnbiBhcyBfX2Fzc2lnbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYyxcbiAgICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7ZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIH1cbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7XG4gICAgbGFiZWw6IDAsXG4gICAgc2VudDogZnVuY3Rpb24gc2VudCgpIHtcbiAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgIHJldHVybiB0WzFdO1xuICAgIH0sXG4gICAgdHJ5czogW10sXG4gICAgb3BzOiBbXVxuICB9LFxuICAgICAgZixcbiAgICAgIHksXG4gICAgICB0LFxuICAgICAgZztcbiAgcmV0dXJuIGcgPSB7XG4gICAgbmV4dDogdmVyYigwKSxcbiAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGc7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gc3RlcChbbiwgdl0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuXG4gICAgd2hpbGUgKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuXG4gICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG5cbiAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvcCA9IFs2LCBlXTtcbiAgICAgICAgeSA9IDA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmID0gdCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgZG9uZTogdHJ1ZVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uIChvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG1ba107XG4gICAgfVxuICB9KTtcbn0gOiBmdW5jdGlvbiAobywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIHtcbiAgICBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsXG4gICAgICBtID0gcyAmJiBvW3NdLFxuICAgICAgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbyAmJiBvW2krK10sXG4gICAgICAgIGRvbmU6ICFvXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksXG4gICAgICByLFxuICAgICAgYXIgPSBbXSxcbiAgICAgIGU7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkge1xuICAgICAgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXI7XG59XG4vKiogQGRlcHJlY2F0ZWQgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbi8qKiBAZGVwcmVjYXRlZCAqL1xuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBmcm9tKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksXG4gICAgICBpLFxuICAgICAgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUobiwgdikge1xuICAgIHRyeSB7XG4gICAgICBzdGVwKGdbbl0odikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldHRsZShxWzBdWzNdLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkge1xuICAgIHJlc3VtZShcInRocm93XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkge1xuICAgIHRocm93IGU7XG4gIH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGk7XG5cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7XG4gICAgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIChwID0gIXApID8ge1xuICAgICAgICB2YWx1ZTogX19hd2FpdChvW25dKHYpKSxcbiAgICAgICAgZG9uZTogbiA9PT0gXCJyZXR1cm5cIlxuICAgICAgfSA6IGYgPyBmKHYpIDogdjtcbiAgICB9IDogZjtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLFxuICAgICAgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbiAodikge1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBkb25lOiBkXG4gICAgICB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHtcbiAgICAgIHZhbHVlOiByYXdcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb29rZWQucmF3ID0gcmF3O1xuICB9XG5cbiAgcmV0dXJuIGNvb2tlZDtcbn1cbjtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbiAobywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2XG4gIH0pO1xufSA6IGZ1bmN0aW9uIChvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkge1xuICAgIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgfVxuXG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpLCB2YWx1ZTtcbn0iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IGludmFyaWFudEludGxDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShDb21wb25lbnQpIHtcbiAgcmV0dXJuIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jztcbn0gLy8gVE9ETzogV2Ugc2hvdWxkIHByb3ZpZGUgaW5pdGlhbCB2YWx1ZSBoZXJlXG5cblxudmFyIEludGxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBJbnRsQ29uc3VtZXIgPSBJbnRsQ29udGV4dC5Db25zdW1lcixcbiAgICBJbnRsUHJvdmlkZXIgPSBJbnRsQ29udGV4dC5Qcm92aWRlcjtcbmV4cG9ydCB2YXIgUHJvdmlkZXIgPSBJbnRsUHJvdmlkZXI7XG5leHBvcnQgdmFyIENvbnRleHQgPSBJbnRsQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluamVjdEludGwoV3JhcHBlZENvbXBvbmVudCwgb3B0aW9ucykge1xuICB2YXIgX2EgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgX2IgPSBfYS5pbnRsUHJvcE5hbWUsXG4gICAgICBpbnRsUHJvcE5hbWUgPSBfYiA9PT0gdm9pZCAwID8gJ2ludGwnIDogX2IsXG4gICAgICBfYyA9IF9hLmZvcndhcmRSZWYsXG4gICAgICBmb3J3YXJkUmVmID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2MsXG4gICAgICBfZCA9IF9hLmVuZm9yY2VDb250ZXh0LFxuICAgICAgZW5mb3JjZUNvbnRleHQgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kO1xuXG4gIHZhciBXaXRoSW50bCA9IGZ1bmN0aW9uIFdpdGhJbnRsKHByb3BzKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW50bENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoZW5mb3JjZUNvbnRleHQpIHtcbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoaW50bCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnRsUHJvcCA9IChfYSA9IHt9LCBfYVtpbnRsUHJvcE5hbWVdID0gaW50bCwgX2EpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgX19hc3NpZ24oe30sIHByb3BzLCBpbnRsUHJvcCwge1xuICAgICAgICByZWY6IGZvcndhcmRSZWYgPyBwcm9wcy5mb3J3YXJkZWRSZWYgOiBudWxsXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH07XG5cbiAgV2l0aEludGwuZGlzcGxheU5hbWUgPSBcImluamVjdEludGwoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiO1xuICBXaXRoSW50bC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcblxuICBpZiAoZm9yd2FyZFJlZikge1xuICAgIHJldHVybiBob2lzdE5vblJlYWN0U3RhdGljcyhSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXaXRoSW50bCwgX19hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGZvcndhcmRlZFJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSksIFdyYXBwZWRDb21wb25lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKFdpdGhJbnRsLCBXcmFwcGVkQ29tcG9uZW50KTtcbn0iLCIvKipcbiAqIENhbm5vdCBkbyBNYXRoLmxvZyh4KSAvIE1hdGgubG9nKDEwKSBiYyBpZiBJRUVFIGZsb2F0aW5nIHBvaW50IGlzc3VlXG4gKiBAcGFyYW0geCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hZ25pdHVkZSh4KSB7XG4gIC8vIENhbm5vdCBjb3VudCBzdHJpbmcgbGVuZ3RoIHZpYSBOdW1iZXIudG9TdHJpbmcgYmVjYXVzZSBpdCBtYXkgdXNlIHNjaWVudGlmaWMgbm90YXRpb25cbiAgLy8gZm9yIHZlcnkgc21hbGwgb3IgdmVyeSBsYXJnZSBudW1iZXJzLlxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAqIE1hdGguTE9HMTBFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXBlYXQocywgdGltZXMpIHtcbiAgaWYgKHR5cGVvZiBzLnJlcGVhdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzLnJlcGVhdCh0aW1lcyk7XG4gIH1cblxuICB2YXIgYXJyID0gbmV3IEFycmF5KHRpbWVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IHM7XG4gIH1cblxuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBmaWVsZCwgdmFsdWUpIHtcbiAgaWYgKCFtYXAuZ2V0KHBsKSkge1xuICAgIG1hcC5zZXQocGwsIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICB9XG5cbiAgdmFyIHNsb3RzID0gbWFwLmdldChwbCk7XG4gIHNsb3RzW2ZpZWxkXSA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrID0gX2FbX2ldO1xuICAgIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBrLCBwcm9wc1trXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbFNsb3QobWFwLCBwbCwgZmllbGQpIHtcbiAgcmV0dXJuIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBmaWVsZClbZmllbGRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsKSB7XG4gIHZhciBmaWVsZHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGZpZWxkc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBzbG90cyA9IG1hcC5nZXQocGwpO1xuXG4gIGlmICghc2xvdHMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHBsICsgXCIgSW50ZXJuYWxTbG90IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGYpIHtcbiAgICBhbGxbZl0gPSBzbG90c1tmXTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSB7XG4gIHJldHVybiBwYXR0ZXJuUGFydC50eXBlID09PSAnbGl0ZXJhbCc7XG59XG4vKlxuICAxNyBFQ01BU2NyaXB0IFN0YW5kYXJkIEJ1aWx0LWluIE9iamVjdHM6XG4gICAgRXZlcnkgYnVpbHQtaW4gRnVuY3Rpb24gb2JqZWN0LCBpbmNsdWRpbmcgY29uc3RydWN0b3JzLCB0aGF0IGlzIG5vdFxuICAgIGlkZW50aWZpZWQgYXMgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIGhhcyBhIG5hbWUgcHJvcGVydHkgd2hvc2UgdmFsdWVcbiAgICBpcyBhIFN0cmluZy5cblxuICAgIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgbmFtZSBwcm9wZXJ0eSBvZiBhIGJ1aWx0LWluIEZ1bmN0aW9uXG4gICAgb2JqZWN0LCBpZiBpdCBleGlzdHMsIGhhcyB0aGUgYXR0cmlidXRlcyB7IFtbV3JpdGFibGVdXTogZmFsc2UsXG4gICAgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiB0cnVlIH0uXG4qL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBfYSkge1xuICB2YXIgdmFsdWUgPSBfYS52YWx1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5leHBvcnQgdmFyIFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYID0gLy11KD86LVswLTlhLXpdezIsOH0pKy9naTtcbmV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlLCBFcnIpIHtcbiAgaWYgKEVyciA9PT0gdm9pZCAwKSB7XG4gICAgRXJyID0gRXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnIobWVzc2FnZSk7XG4gIH1cbn0iLCIvL1xuLy8gTWFpblxuLy9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lbW9pemUoZm4sIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlID0gb3B0aW9ucyAmJiBvcHRpb25zLmNhY2hlID8gb3B0aW9ucy5jYWNoZSA6IGNhY2hlRGVmYXVsdDtcbiAgdmFyIHNlcmlhbGl6ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplciA/IG9wdGlvbnMuc2VyaWFsaXplciA6IHNlcmlhbGl6ZXJEZWZhdWx0O1xuICB2YXIgc3RyYXRlZ3kgPSBvcHRpb25zICYmIG9wdGlvbnMuc3RyYXRlZ3kgPyBvcHRpb25zLnN0cmF0ZWd5IDogc3RyYXRlZ3lEZWZhdWx0O1xuICByZXR1cm4gc3RyYXRlZ3koZm4sIHtcbiAgICBjYWNoZTogY2FjaGUsXG4gICAgc2VyaWFsaXplcjogc2VyaWFsaXplclxuICB9KTtcbn0gLy9cbi8vIFN0cmF0ZWd5XG4vL1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nOyAvLyB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJ3Vuc2FmZScgcHJpbWl0aXZlIGZvciBvdXIgbmVlZHNcbn1cblxuZnVuY3Rpb24gbW9uYWRpYyhmbiwgY2FjaGUsIHNlcmlhbGl6ZXIsIGFyZykge1xuICB2YXIgY2FjaGVLZXkgPSBpc1ByaW1pdGl2ZShhcmcpID8gYXJnIDogc2VyaWFsaXplcihhcmcpO1xuICB2YXIgY29tcHV0ZWRWYWx1ZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgaWYgKHR5cGVvZiBjb21wdXRlZFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbXB1dGVkVmFsdWUgPSBmbi5jYWxsKHRoaXMsIGFyZyk7XG4gICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBjb21wdXRlZFZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb21wdXRlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YXJpYWRpYyhmbiwgY2FjaGUsIHNlcmlhbGl6ZXIpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemVyKGFyZ3MpO1xuICB2YXIgY29tcHV0ZWRWYWx1ZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgaWYgKHR5cGVvZiBjb21wdXRlZFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbXB1dGVkVmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjYWNoZS5zZXQoY2FjaGVLZXksIGNvbXB1dGVkVmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzc2VtYmxlKGZuLCBjb250ZXh0LCBzdHJhdGVneSwgY2FjaGUsIHNlcmlhbGl6ZSkge1xuICByZXR1cm4gc3RyYXRlZ3kuYmluZChjb250ZXh0LCBmbiwgY2FjaGUsIHNlcmlhbGl6ZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmF0ZWd5RGVmYXVsdChmbiwgb3B0aW9ucykge1xuICB2YXIgc3RyYXRlZ3kgPSBmbi5sZW5ndGggPT09IDEgPyBtb25hZGljIDogdmFyaWFkaWM7XG4gIHJldHVybiBhc3NlbWJsZShmbiwgdGhpcywgc3RyYXRlZ3ksIG9wdGlvbnMuY2FjaGUuY3JlYXRlKCksIG9wdGlvbnMuc2VyaWFsaXplcik7XG59XG5cbmZ1bmN0aW9uIHN0cmF0ZWd5VmFyaWFkaWMoZm4sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFzc2VtYmxlKGZuLCB0aGlzLCB2YXJpYWRpYywgb3B0aW9ucy5jYWNoZS5jcmVhdGUoKSwgb3B0aW9ucy5zZXJpYWxpemVyKTtcbn1cblxuZnVuY3Rpb24gc3RyYXRlZ3lNb25hZGljKGZuLCBvcHRpb25zKSB7XG4gIHJldHVybiBhc3NlbWJsZShmbiwgdGhpcywgbW9uYWRpYywgb3B0aW9ucy5jYWNoZS5jcmVhdGUoKSwgb3B0aW9ucy5zZXJpYWxpemVyKTtcbn0gLy9cbi8vIFNlcmlhbGl6ZXJcbi8vXG5cblxudmFyIHNlcmlhbGl6ZXJEZWZhdWx0ID0gZnVuY3Rpb24gc2VyaWFsaXplckRlZmF1bHQoKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmd1bWVudHMpO1xufTsgLy9cbi8vIENhY2hlXG4vL1xuXG5cbmZ1bmN0aW9uIE9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZSgpIHtcbiAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbk9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5IGluIHRoaXMuY2FjaGU7XG59O1xuXG5PYmplY3RXaXRob3V0UHJvdG90eXBlQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbn07XG5cbk9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5jYWNoZVtrZXldID0gdmFsdWU7XG59O1xuXG52YXIgY2FjaGVEZWZhdWx0ID0ge1xuICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5ldyBPYmplY3RXaXRob3V0UHJvdG90eXBlQ2FjaGUoKTtcbiAgfVxufTtcbmV4cG9ydCB2YXIgc3RyYXRlZ2llcyA9IHtcbiAgdmFyaWFkaWM6IHN0cmF0ZWd5VmFyaWFkaWMsXG4gIG1vbmFkaWM6IHN0cmF0ZWd5TW9uYWRpY1xufTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW50bE1lc3NhZ2VGb3JtYXQgfSBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IG1lbW9pemUsIHsgc3RyYXRlZ2llcyB9IGZyb20gJ0Bmb3JtYXRqcy9mYXN0LW1lbW9pemUnO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRGb3JtYXR0ZXJFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclByb3BzKHByb3BzLCB3aGl0ZWxpc3QsIGRlZmF1bHRzKSB7XG4gIGlmIChkZWZhdWx0cyA9PT0gdm9pZCAwKSB7XG4gICAgZGVmYXVsdHMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiB3aGl0ZWxpc3QucmVkdWNlKGZ1bmN0aW9uIChmaWx0ZXJlZCwgbmFtZSkge1xuICAgIGlmIChuYW1lIGluIHByb3BzKSB7XG4gICAgICBmaWx0ZXJlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgIH0gZWxzZSBpZiAobmFtZSBpbiBkZWZhdWx0cykge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH0sIHt9KTtcbn1cblxudmFyIGRlZmF1bHRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycm9yKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IHtcbiAgZm9ybWF0czoge30sXG4gIG1lc3NhZ2VzOiB7fSxcbiAgdGltZVpvbmU6IHVuZGVmaW5lZCxcbiAgZGVmYXVsdExvY2FsZTogJ2VuJyxcbiAgZGVmYXVsdEZvcm1hdHM6IHt9LFxuICBvbkVycm9yOiBkZWZhdWx0RXJyb3JIYW5kbGVyXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGxDYWNoZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRlVGltZToge30sXG4gICAgbnVtYmVyOiB7fSxcbiAgICBtZXNzYWdlOiB7fSxcbiAgICByZWxhdGl2ZVRpbWU6IHt9LFxuICAgIHBsdXJhbFJ1bGVzOiB7fSxcbiAgICBsaXN0OiB7fSxcbiAgICBkaXNwbGF5TmFtZXM6IHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhc3RNZW1vaXplQ2FjaGUoc3RvcmUpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICAgIHJldHVybiBrZXkgaW4gc3RvcmU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICAgIHJldHVybiBzdG9yZVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgc3RvcmVba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGludGwgZm9ybWF0dGVycyBhbmQgcG9wdWxhdGUgY2FjaGVcbiAqIEBwYXJhbSBjYWNoZSBleHBsaWNpdCBjYWNoZSB0byBwcmV2ZW50IGxlYWtpbmcgbWVtb3J5XG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVycyhjYWNoZSkge1xuICBpZiAoY2FjaGUgPT09IHZvaWQgMCkge1xuICAgIGNhY2hlID0gY3JlYXRlSW50bENhY2hlKCk7XG4gIH1cblxuICB2YXIgUmVsYXRpdmVUaW1lRm9ybWF0ID0gSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIHZhciBMaXN0Rm9ybWF0ID0gSW50bC5MaXN0Rm9ybWF0O1xuICB2YXIgRGlzcGxheU5hbWVzID0gSW50bC5EaXNwbGF5TmFtZXM7XG4gIHZhciBnZXREYXRlVGltZUZvcm1hdCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKChfYSA9IEludGwuRGF0ZVRpbWVGb3JtYXQpLmJpbmQuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgfSwge1xuICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLmRhdGVUaW1lKSxcbiAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICB9KTtcbiAgdmFyIGdldE51bWJlckZvcm1hdCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKChfYSA9IEludGwuTnVtYmVyRm9ybWF0KS5iaW5kLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gIH0sIHtcbiAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5udW1iZXIpLFxuICAgIHN0cmF0ZWd5OiBzdHJhdGVnaWVzLnZhcmlhZGljXG4gIH0pO1xuICB2YXIgZ2V0UGx1cmFsUnVsZXMgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3ICgoX2EgPSBJbnRsLlBsdXJhbFJ1bGVzKS5iaW5kLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gIH0sIHtcbiAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5wbHVyYWxSdWxlcyksXG4gICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgZ2V0RGF0ZVRpbWVGb3JtYXQ6IGdldERhdGVUaW1lRm9ybWF0LFxuICAgIGdldE51bWJlckZvcm1hdDogZ2V0TnVtYmVyRm9ybWF0LFxuICAgIGdldE1lc3NhZ2VGb3JtYXQ6IG1lbW9pemUoZnVuY3Rpb24gKG1lc3NhZ2UsIGxvY2FsZXMsIG92ZXJyaWRlRm9ybWF0cywgb3B0cykge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsTWVzc2FnZUZvcm1hdChtZXNzYWdlLCBsb2NhbGVzLCBvdmVycmlkZUZvcm1hdHMsIF9fYXNzaWduKHtcbiAgICAgICAgZm9ybWF0dGVyczoge1xuICAgICAgICAgIGdldE51bWJlckZvcm1hdDogZ2V0TnVtYmVyRm9ybWF0LFxuICAgICAgICAgIGdldERhdGVUaW1lRm9ybWF0OiBnZXREYXRlVGltZUZvcm1hdCxcbiAgICAgICAgICBnZXRQbHVyYWxSdWxlczogZ2V0UGx1cmFsUnVsZXNcbiAgICAgICAgfVxuICAgICAgfSwgb3B0cyB8fCB7fSkpO1xuICAgIH0sIHtcbiAgICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLm1lc3NhZ2UpLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgICB9KSxcbiAgICBnZXRSZWxhdGl2ZVRpbWVGb3JtYXQ6IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IChSZWxhdGl2ZVRpbWVGb3JtYXQuYmluZC5hcHBseShSZWxhdGl2ZVRpbWVGb3JtYXQsIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgICB9LCB7XG4gICAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5yZWxhdGl2ZVRpbWUpLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgICB9KSxcbiAgICBnZXRQbHVyYWxSdWxlczogZ2V0UGx1cmFsUnVsZXMsXG4gICAgZ2V0TGlzdEZvcm1hdDogbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgKExpc3RGb3JtYXQuYmluZC5hcHBseShMaXN0Rm9ybWF0LCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gICAgfSwge1xuICAgICAgY2FjaGU6IGNyZWF0ZUZhc3RNZW1vaXplQ2FjaGUoY2FjaGUubGlzdCksXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICAgIH0pLFxuICAgIGdldERpc3BsYXlOYW1lczogbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgKERpc3BsYXlOYW1lcy5iaW5kLmFwcGx5KERpc3BsYXlOYW1lcywgX19zcHJlYWRBcnJheShbdm9pZCAwXSwgYXJncykpKSgpO1xuICAgIH0sIHtcbiAgICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLmRpc3BsYXlOYW1lcyksXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICAgIH0pXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgdHlwZSwgbmFtZSwgb25FcnJvcikge1xuICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdHMgJiYgZm9ybWF0c1t0eXBlXTtcbiAgdmFyIGZvcm1hdDtcblxuICBpZiAoZm9ybWF0VHlwZSkge1xuICAgIGZvcm1hdCA9IGZvcm1hdFR5cGVbbmFtZV07XG4gIH1cblxuICBpZiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIG9uRXJyb3IobmV3IFVuc3VwcG9ydGVkRm9ybWF0dGVyRXJyb3IoXCJObyBcIiArIHR5cGUgKyBcIiBmb3JtYXQgbmFtZWQ6IFwiICsgbmFtZSkpO1xufSIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAZm9ybWF0anMvZWNtYTQwMi1hYnN0cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX0lOVExfQ09ORklHIGFzIENPUkVfREVGQVVMVF9JTlRMX0NPTkZJRyB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsJztcbmV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKSB7XG4gIGludmFyaWFudChpbnRsLCAnW1JlYWN0IEludGxdIENvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIGBpbnRsYCBvYmplY3QuICcgKyAnPEludGxQcm92aWRlcj4gbmVlZHMgdG8gZXhpc3QgaW4gdGhlIGNvbXBvbmVudCBhbmNlc3RyeS4nKTtcbn1cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBDT1JFX0RFRkFVTFRfSU5UTF9DT05GSUcpLCB7XG4gIHRleHRDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50XG59KTtcbi8qKlxuICogVGFrZXMgYSBgZm9ybWF0WE1MRWxlbWVudEZuYCwgYW5kIGNvbXBvc2VzIGl0IGluIGZ1bmN0aW9uLCB3aGljaCBwYXNzZXNcbiAqIGFyZ3VtZW50IGBwYXJ0c2AgdGhyb3VnaCwgYXNzaWduaW5nIHVuaXF1ZSBrZXkgdG8gZWFjaCBwYXJ0LCB0byBwcmV2ZW50XG4gKiBcIkVhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCJcIiBSZWFjdCBlcnJvci5cbiAqIEBwYXJhbSBmb3JtYXRYTUxFbGVtZW50Rm5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVW5pcXVlS2V5c1RvUGFydHMoZm9ybWF0WE1MRWxlbWVudEZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocGFydHMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgcmV0dXJuIGZvcm1hdFhNTEVsZW1lbnRGbihSZWFjdC5DaGlsZHJlbi50b0FycmF5KHBhcnRzKSk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghb2JqQSB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIgYktleXMgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgdmFyIGxlbiA9IGFLZXlzLmxlbmd0aDtcblxuICBpZiAoYktleXMubGVuZ3RoICE9PSBsZW4pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGFLZXlzW2ldO1xuXG4gICAgaWYgKG9iakFba2V5XSAhPT0gb2JqQltrZXldIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2luamVjdEludGwnO1xuaW1wb3J0IHsgaW52YXJpYW50SW50bENvbnRleHQgfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJbnRsKCkge1xuICB2YXIgaW50bCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gIGludmFyaWFudEludGxDb250ZXh0KGludGwpO1xuICByZXR1cm4gaW50bDtcbn0iLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VJbnRsIGZyb20gJy4vdXNlSW50bCc7XG52YXIgRGlzcGxheU5hbWU7XG5cbihmdW5jdGlvbiAoRGlzcGxheU5hbWUpIHtcbiAgRGlzcGxheU5hbWVbXCJmb3JtYXREYXRlXCJdID0gXCJGb3JtYXR0ZWREYXRlXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0VGltZVwiXSA9IFwiRm9ybWF0dGVkVGltZVwiO1xuICBEaXNwbGF5TmFtZVtcImZvcm1hdE51bWJlclwiXSA9IFwiRm9ybWF0dGVkTnVtYmVyXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0TGlzdFwiXSA9IFwiRm9ybWF0dGVkTGlzdFwiOyAvLyBOb3RlIHRoYXQgdGhpcyBEaXNwbGF5TmFtZSBpcyB0aGUgbG9jYWxlIGRpc3BsYXkgbmFtZSwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGhcbiAgLy8gdGhlIG5hbWUgb2YgdGhlIGVudW0sIHdoaWNoIGlzIGZvciBSZWFjdCBjb21wb25lbnQgZGlzcGxheSBuYW1lIGluIGRldiB0b29scy5cblxuICBEaXNwbGF5TmFtZVtcImZvcm1hdERpc3BsYXlOYW1lXCJdID0gXCJGb3JtYXR0ZWREaXNwbGF5TmFtZVwiO1xufSkoRGlzcGxheU5hbWUgfHwgKERpc3BsYXlOYW1lID0ge30pKTtcblxudmFyIERpc3BsYXlOYW1lUGFydHM7XG5cbihmdW5jdGlvbiAoRGlzcGxheU5hbWVQYXJ0cykge1xuICBEaXNwbGF5TmFtZVBhcnRzW1wiZm9ybWF0RGF0ZVwiXSA9IFwiRm9ybWF0dGVkRGF0ZVBhcnRzXCI7XG4gIERpc3BsYXlOYW1lUGFydHNbXCJmb3JtYXRUaW1lXCJdID0gXCJGb3JtYXR0ZWRUaW1lUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdE51bWJlclwiXSA9IFwiRm9ybWF0dGVkTnVtYmVyUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdExpc3RcIl0gPSBcIkZvcm1hdHRlZExpc3RQYXJ0c1wiO1xufSkoRGlzcGxheU5hbWVQYXJ0cyB8fCAoRGlzcGxheU5hbWVQYXJ0cyA9IHt9KSk7XG5cbmV4cG9ydCB2YXIgRm9ybWF0dGVkTnVtYmVyUGFydHMgPSBmdW5jdGlvbiBGb3JtYXR0ZWROdW1iZXJQYXJ0cyhwcm9wcykge1xuICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TnVtYmVyVG9QYXJ0cyh2YWx1ZSwgZm9ybWF0UHJvcHMpKTtcbn07XG5Gb3JtYXR0ZWROdW1iZXJQYXJ0cy5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWROdW1iZXJQYXJ0cyc7XG5leHBvcnQgdmFyIEZvcm1hdHRlZExpc3RQYXJ0cyA9IGZ1bmN0aW9uIEZvcm1hdHRlZExpc3RQYXJ0cyhwcm9wcykge1xuICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TGlzdFRvUGFydHModmFsdWUsIGZvcm1hdFByb3BzKSk7XG59O1xuRm9ybWF0dGVkTnVtYmVyUGFydHMuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTnVtYmVyUGFydHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQobmFtZSkge1xuICB2YXIgQ29tcG9uZW50UGFydHMgPSBmdW5jdGlvbiBDb21wb25lbnRQYXJ0cyhwcm9wcykge1xuICAgIHZhciBpbnRsID0gdXNlSW50bCgpO1xuXG4gICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGZvcm1hdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTtcblxuICAgIHZhciBkYXRlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHZhbHVlIHx8IDApIDogdmFsdWU7XG4gICAgdmFyIGZvcm1hdHRlZFBhcnRzID0gbmFtZSA9PT0gJ2Zvcm1hdERhdGUnID8gaW50bC5mb3JtYXREYXRlVG9QYXJ0cyhkYXRlLCBmb3JtYXRQcm9wcykgOiBpbnRsLmZvcm1hdFRpbWVUb1BhcnRzKGRhdGUsIGZvcm1hdFByb3BzKTtcbiAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkUGFydHMpO1xuICB9O1xuXG4gIENvbXBvbmVudFBhcnRzLmRpc3BsYXlOYW1lID0gRGlzcGxheU5hbWVQYXJ0c1tuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudFBhcnRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudChuYW1lKSB7XG4gIHZhciBDb21wb25lbnQgPSBmdW5jdGlvbiBDb21wb25lbnQocHJvcHMpIHtcbiAgICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcyAvLyBUT0RPOiBmaXggVFMgdHlwZSBkZWZpbml0aW9uIGZvciBsb2NhbGVNYXRjaGVyIHVwc3RyZWFtXG4gICAgLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTsgLy8gVE9ETzogZml4IFRTIHR5cGUgZGVmaW5pdGlvbiBmb3IgbG9jYWxlTWF0Y2hlciB1cHN0cmVhbVxuXG5cbiAgICB2YXIgZm9ybWF0dGVkVmFsdWUgPSBpbnRsW25hbWVdKHZhbHVlLCBmb3JtYXRQcm9wcyk7XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkVmFsdWUpO1xuICAgIH1cblxuICAgIHZhciBUZXh0ID0gaW50bC50ZXh0Q29tcG9uZW50IHx8IFJlYWN0LkZyYWdtZW50O1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRleHQsIG51bGwsIGZvcm1hdHRlZFZhbHVlKTtcbiAgfTtcblxuICBDb21wb25lbnQuZGlzcGxheU5hbWUgPSBEaXNwbGF5TmFtZVtuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudDtcbn0iLCJpbXBvcnQgeyBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQsIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL2NyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCc7XG5leHBvcnQgeyBjcmVhdGVJbnRsQ2FjaGUsIFVuc3VwcG9ydGVkRm9ybWF0dGVyRXJyb3IsIEludmFsaWRDb25maWdFcnJvciwgTWlzc2luZ0RhdGFFcnJvciwgTWVzc2FnZUZvcm1hdEVycm9yLCBNaXNzaW5nVHJhbnNsYXRpb25FcnJvciwgSW50bEVycm9yQ29kZSBhcyBSZWFjdEludGxFcnJvckNvZGUsIEludGxFcnJvciBhcyBSZWFjdEludGxFcnJvciB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsJztcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVNZXNzYWdlcyhtc2dzKSB7XG4gIHJldHVybiBtc2dzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZU1lc3NhZ2UobXNnKSB7XG4gIHJldHVybiBtc2c7XG59XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluamVjdEludGwsIFByb3ZpZGVyIGFzIFJhd0ludGxQcm92aWRlciwgQ29udGV4dCBhcyBJbnRsQ29udGV4dCB9IGZyb20gJy4vc3JjL2NvbXBvbmVudHMvaW5qZWN0SW50bCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZUludGwgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3VzZUludGwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnRsUHJvdmlkZXIsIGNyZWF0ZUludGwgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3Byb3ZpZGVyJzsgLy8gSU1QT1JUQU5UOiBFeHBsaWNpdCBoZXJlIHRvIHByZXZlbnQgYXBpLWV4dHJhY3RvciBmcm9tIG91dHB1dGluZyBgaW1wb3J0KCcuL3NyYy90eXBlcycpLkN1c3RvbUZvcm1hdENvbmZpZ2BcblxuZXhwb3J0IHZhciBGb3JtYXR0ZWREYXRlID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXREYXRlJyk7XG5leHBvcnQgdmFyIEZvcm1hdHRlZFRpbWUgPSBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQoJ2Zvcm1hdFRpbWUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkTnVtYmVyID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXROdW1iZXInKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkTGlzdCA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0TGlzdCcpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWREaXNwbGF5TmFtZSA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0RGlzcGxheU5hbWUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkRGF0ZVBhcnRzID0gY3JlYXRlRm9ybWF0dGVkRGF0ZVRpbWVQYXJ0c0NvbXBvbmVudCgnZm9ybWF0RGF0ZScpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWRUaW1lUGFydHMgPSBjcmVhdGVGb3JtYXR0ZWREYXRlVGltZVBhcnRzQ29tcG9uZW50KCdmb3JtYXRUaW1lJyk7XG5leHBvcnQgeyBGb3JtYXR0ZWROdW1iZXJQYXJ0cywgRm9ybWF0dGVkTGlzdFBhcnRzIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9jcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtYXR0ZWRSZWxhdGl2ZVRpbWUgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3JlbGF0aXZlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkUGx1cmFsIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9wbHVyYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9tZXNzYWdlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkRGF0ZVRpbWVSYW5nZSB9IGZyb20gJy4vc3JjL2NvbXBvbmVudHMvZGF0ZVRpbWVSYW5nZSc7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4424\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')},6445:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n// Trussworks GridContainer won't allow it to span 100% of the page, so\n// this works around it and tries to hide the complexity in component\nvar J40MainGridContainer=function J40MainGridContainer(_ref){var children=_ref.children,_ref$fullWidth=_ref.fullWidth,fullWidth=_ref$fullWidth===void 0?false:_ref$fullWidth,_ref$blueBackground=_ref.blueBackground,blueBackground=_ref$blueBackground===void 0?false:_ref$blueBackground,_ref$className=_ref.className,className=_ref$className===void 0?'':_ref$className;// is it a blue background strip?\nclassName+=blueBackground?'j40-main-grid-blue-bk ':'';return fullWidth?/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\",{className:'j40-grid-container '+className},children):/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.GridContainer,{containerSize:'desktop-lg',className:'j40-grid-container '+className},children);};/* harmony default export */ __webpack_exports__[\"Z\"] = (J40MainGridContainer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyLnRzeD84ODk4Il0sIm5hbWVzIjpbIko0ME1haW5HcmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJmdWxsV2lkdGgiLCJibHVlQmFja2dyb3VuZCIsImNsYXNzTmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQVdBLEdBQU1BLHFCQUFvQixDQUFHLFFBQXZCQSxxQkFBdUIsTUFJTyxJQUhsQ0MsU0FHa0MsTUFIbENBLFFBR2tDLHFCQUZsQ0MsU0FFa0MsQ0FGbENBLFNBRWtDLHlCQUZ0QixLQUVzQix5Q0FEbENDLGNBQ2tDLENBRGxDQSxjQUNrQyw4QkFEakIsS0FDaUIseUNBQWxDQyxTQUFrQyxDQUFsQ0EsU0FBa0MseUJBQXRCLEVBQXNCLGdCQUNsQztBQUNBQSxTQUFTLEVBQUtELGNBQWMsQ0FBRyx3QkFBSCxDQUE4QixFQUExRCxDQUVBLE1BQU9ELFVBQVMsY0FDZCx3REFDRSxTQUFTLENBQUUsc0JBQXdCRSxTQURyQyxFQUVHSCxRQUZILENBRGMsY0FNZCxpREFBQyxrRUFBRCxFQUNFLGFBQWEsQ0FBRSxZQURqQixDQUVFLFNBQVMsQ0FBRSxzQkFBd0JHLFNBRnJDLEVBR0dILFFBSEgsQ0FORixDQVlELENBcEJELENBc0JBLHlEQUFlRCxvQkFBZiIsImZpbGUiOiI2NDQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVHJ1c3N3b3JrcyBHcmlkQ29udGFpbmVyIHdvbid0IGFsbG93IGl0IHRvIHNwYW4gMTAwJSBvZiB0aGUgcGFnZSwgc29cbi8vIHRoaXMgd29ya3MgYXJvdW5kIGl0IGFuZCB0cmllcyB0byBoaWRlIHRoZSBjb21wbGV4aXR5IGluIGNvbXBvbmVudFxuaW1wb3J0IFJlYWN0LCB7UmVhY3ROb2RlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0dyaWRDb250YWluZXJ9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuaW50ZXJmYWNlIElMYXlvdXRQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGUsXG4gIGZ1bGxXaWR0aD86IGJvb2xlYW4sXG4gICBibHVlQmFja2dyb3VuZD86IGJvb2xlYW4sXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5jb25zdCBKNDBNYWluR3JpZENvbnRhaW5lciA9ICh7XG4gIGNoaWxkcmVuLFxuICBmdWxsV2lkdGggPSBmYWxzZSxcbiAgYmx1ZUJhY2tncm91bmQgPSBmYWxzZSxcbiAgY2xhc3NOYW1lID0gJyd9OiBJTGF5b3V0UHJvcHMpID0+IHtcbiAgLy8gaXMgaXQgYSBibHVlIGJhY2tncm91bmQgc3RyaXA/XG4gIGNsYXNzTmFtZSArPSAoYmx1ZUJhY2tncm91bmQgPyAnajQwLW1haW4tZ3JpZC1ibHVlLWJrICcgOiAnJyk7XG5cbiAgcmV0dXJuIGZ1bGxXaWR0aCA/IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9eydqNDAtZ3JpZC1jb250YWluZXIgJyArIGNsYXNzTmFtZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICkgOiAoXG4gICAgPEdyaWRDb250YWluZXJcbiAgICAgIGNvbnRhaW5lclNpemU9eydkZXNrdG9wLWxnJ31cbiAgICAgIGNsYXNzTmFtZT17J2o0MC1ncmlkLWNvbnRhaW5lciAnICsgY2xhc3NOYW1lfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0dyaWRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYWluR3JpZENvbnRhaW5lcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6445\n")},828: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/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/images/icon.png\n/* harmony default export */ var icon = (\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAABHCAYAAADbahNjAAAACXBIWXMAABYlAAAWJQFJUiTwAAAI2UlEQVR4nO1du3IiRxTt3VIuTEiy+AvMZpOYZYmhrC/AODORERHZShkRZiNCA1+AC2IMRJMZvsAiIaTEF6yrp07LrWEe/RaDOVXUandHmpk+07fvPfdM6923b9+ICeTLrRwhpIQP/bqID49nQsgGf6d/Ph3Ww42RC7hQ7P0aHcM2xpXiiRAyLXjzKX/HykSCuDtCSAWfDxpDuSKELOnnsB4uXVKy92t3EYP07PIa4rD3awNCyG8x/72l486uVZrIfLlFb7xJCPnJ0vUf6WASQgY2ZysIHMQ8gF8L3rxt69xp2Ps1OklGAmP8QqYwkflyi5L3oDnzZLGj5zyshyOTP3Tv1+i9/JFy2Ksn3hX2fq0EEn8QPOW44M2bqURiBsY9ua5wxAx90D0f1px/BA93Suber7UxWW4lvu1Y8Oa5WCKxBopMb5egM7R9WA+nqufc+zV6Tz9LfAsls1nw5jbDfBFj/UnxR3yOJBKzcCT5ZLgETY6ah/XwSface7+2kQhbDEFEKHhz7YgQupYiZqDMgxWFUyLz5Rad3r+bvGBLOGJ2Sq2fe7+mU2/tMPBamS0SrTsDBDJ8fEVkvtySDTvngDEIFRrYvV97MrDes8w6KJkK3jwxMmDmsTLtznCk2xW8efGFyIySyBAkJSJkKqyRoljFHKe67onivuDNBwGR+XKLhosvlk9oG0eQmZiU7P0anRV/ZfxeGYLSg3797rsff5VJx88domQmKSZZwQuJFDeI2aaxgtwVXjuYHlu0VJfeouatJB1EVRuoJ1ldSoJwyv8DnZFTA7XiDov/SFRWy5dbNhOAjyLXYXG9tAUace4K3vxEj6ZELjUWZCMSGifAtxVqvCjcH9bDgciBUFOyUG6tQGJkQneDdpIskUcQKDRYaUC2SR+GUb7cqiA86hCaEz2QhiiIBNMzFUCCsQ6H0jDeoxaSAUv1jZAYBm1jHdZDuo7e4yZUIFWsI1TRUP+njXvSAK2Ri2kkEtbGypdbouFVuF4zAYTcqULE+F5FviP/lSe6EUEXY8xC4XtgROYwM5Mu3imJPCTr3NVhPUzMWkWAVlfTQUHPcMTyMpAhkIFXdnJ4EsNZnLEWkg7QD03rIdJrLZp82NAfbFvIrAkn9Z1YN2QRJZrnOOsDcW29SEK+3CrhxqNq0CCrsxkxQCqzt5QUiD0iuWQarbGxNWa+cgm02UrcKadvYeKCGF7khI4obJjpzGaDOpNEXnGK99cxuQxcibwQ3Ji8DagyvDG5FFJZ2OL+zBmUleq9/wvqPb+IMoiVVIEKNet6rxIlXYMyE7xLGgU0y+SmMCg7TVrqPb8SGqTlrOudhUG53vOT2m1Bls6uVcWgXMETYqtrIN1JUQEIHEWUMkHdPOt6b1Y313t+XE0fRiDSUDLP3aC8hRhh1KBc7/ki4sJ41vWaKccYB0LpVCLCfZ11vbaIQTnuyXUJY45zDNRGsJinInrTVait93wVG+px1vUyaVBu6qhNKetOFLZYi6wlZXi4BhpjHWtQrpxxf46wmaIix9V7vqpB+WHW9Yy27rAWtg0Y3yINyiLrxzngCDKlxOZ6z9c2KM+6nlaIr/d8JsRfDcocxof1UDgpqfd8kwblqUi5gpnH+5NM5hu7WdcrvggCGTYo/4yuiGivdGNgIG8xVsF41Xv+jnMMbrg3tolil0QGQXS4JIPyDm2sxNoT9ePFGJRZiXSJBuVSmuxX7/lZfj2C4VWda8ugvEWoCc8OpsPaCje3CDWJVg86APWeTzJM5mNYeTJlUGZ+k6lojccZlO8s1KpCBuUMzswjBIqTTP3cDMqmJEBhg3K952clP1iBxMhlgxKp8kKLNUOWIU33UebaFKUxVxASI3QMyla6A3R2H9bDokuDMkLV2RqURRQlVn6IylauDcqqmyQIrZFRSGhvucQYs1DaoCzSEXhLg7JM+DdiUEary2XbjqlFUgQyCBuUsSa+WedcwqCcWkfKADO0acmgTBDOp7BvKI9v1gzKSWFPecsWUSApYuZk1Ux/xVlKtNzlPK4GZQ2gi5GLMJnxYG9uP9nsaV4NyheCq6/1QmDa18pv9hDedJeBeVqfr5vupqMzqTLVi40nHb9pv7F4Faa1QivrA3Iflaxuy95Ogq/VaWbcmVT5h+6531iczcPVmVSTdosMdvzqNxbKvtYi976gjRpry/YTsElqZ1ItoawKZ5+BftxvLIxaMGXRmVRFBP1tv7EIkj4ZX2sFBLp01Y1BqNESCCQuUyLIuN9YOPe1IpTKuBcf+43Fg4ivVXcvURNYocuiTSgG6klwGXBKZmdSVZEHj/3GIt7XSuTf3XeBFXaCVF7HOpOq7D0F1ku2FtkAHq4HjW3VPkaWHzSJgZB+bn06GhX+ptorMmQVyOqwNMRtOpOqDScFJbGJCKGzN97pjMzA7skMSq7zzqSqo4CskAhphXhkyk3kHCbG+XPY15oVczIPqSZyZ1J9NjB4O2S8S9FyBQkWE+BN7uETrJG8rzWLJFJ8QT0r+grB0kDm/YHtX9eZVEnCbphMg7WZKAZN54DIDJPIQIlZ0hJJgEwTZrMwPr1RVr9lRFLPjkw6fu4Qan53JlUbZLpGcK8sm75BzLZBYtwe37Y23SVYe0YCXt2mwJZt54yT+taUr5Vwne5lWnOXE9dZo9b0gKZuKojaLYtk3vcbixMzlq6v1YgNhNNvTUWHX0S9toKa5jkgeLclLkt+H5FpieIrNvB70BW36ew5rIdthN1HDRskQ1wL7QQIUfea57MNOtalpFKHzkjZjPWIt56seXkQenUkK2GnOQPqPJnfEucCK7SqUmtVZocUfflzCxKdbHKUshtkEpR9rSk9QFeQVpAYkSJtnTfxtSbYNOOg7WtFItQ2KKGJgiaMAxUJkPe1xjVaiezvn7IBwU6M0C9wkQFEbZs7KbNG+ol9QwZRojnTBJlQkFpOuAIUqEHMLBF6Y1kVELorXMmkOlN33Oa7WuTxyJwdEqG2GfGwObVmcF4fpqdGbb4b3kRxY6WvSQj5F0IllNLQ20cZAAAAAElFTkSuQmCC\");\n;// CONCATENATED MODULE: ./src/components/J40Header.tsx\n// @ts-ignore\nvar J40Header=function J40Header(){var intl=(0,gatsby_plugin_intl.useIntl)();var _useState=(0,react.useState)(false),mobileNavOpen=_useState[0],setMobileNavOpen=_useState[1];var messages=(0,react_intl_lib/* defineMessages */.vU)({titleLine1:{id:'header.title.line1',defaultMessage:\"Climate and Economic Justice\",description:'Title in nav header line 1 of 2'},titleLine2:{id:'header.title.line2',defaultMessage:\"Screening Tool\",description:'Title in nav header line 2 of 2'},about:{id:'header.about',defaultMessage:'About',description:'Header navigate item to the about page'},explore:{id:'header.explore',defaultMessage:'Explore the tool',description:'Header navigate item to the Explore the tool page'},methodology:{id:'header.methodology',defaultMessage:'Data & methodology',description:'Header navigate item to the Methodology page'},contact:{id:'header.contact',defaultMessage:'Contact',description:'Header navigate item to the Contact page'}});var titleL1=intl.formatMessage(messages.titleLine1);var titleL2=intl.formatMessage(messages.titleLine2);var toggleMobileNav=function toggleMobileNav(){return setMobileNavOpen(function(prevOpen){return!prevOpen;});};var headerLinks=function headerLinks(){// 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,{to:'/',key:'about',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.about))],['cejst',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/cejst',key:'cejst',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.explore))],['methodology',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology',key:'methodology',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.methodology))],['contact',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/contact',key:'contact',activeClassName:\"usa-current\",className:'j40-header'},intl.formatMessage(messages.contact))]]);var menu=['about','cejst','methodology','contact'];return menu.map(function(key){return menuData.get(key);});};return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.GovBanner,null),/*#__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(\"h1\",{className:\"usa-logo\"},/*#__PURE__*/react.createElement(\"img\",{className:\"j40-sitelogo\",src:icon,alt:titleL1+\" \"+titleL2}),/*#__PURE__*/react.createElement(\"span\",{className:'usa-logo__text j40-title'},/*#__PURE__*/react.createElement(\"span\",{className:'j40-title-line1'},titleL1),/*#__PURE__*/react.createElement(\"br\",null),/*#__PURE__*/react.createElement(\"span\",{className:'j40-title-line2'},titleL2))),/*#__PURE__*/react.createElement(lib.NavMenuButton,{key:'mobileMenuButton',onClick:toggleMobileNav,label:\"Menu\"})),/*#__PURE__*/react.createElement(lib.PrimaryNav,{items:headerLinks(),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// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n;// CONCATENATED MODULE: ./src/components/J40Footer.tsx\n// @ts-ignore\nvar J40Footer=function J40Footer(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({arialabelfooter:{id:'footer.arialabel',defaultMessage:'Footer navigation',description:'aria-label text for whole footer'},logotitle:{id:'footer.logo.title',defaultMessage:'Council on Environmental Quality',description:'Footer under logo'},moreinfoheader:{id:'footer.moreinfoheader',defaultMessage:'More information',description:'Footer column header'},foia:{id:'footer.foialink',defaultMessage:'Freedom of Information Act (FOIA)',description:'Footer FOIA link text'},privacy:{id:'footer.privacylink',defaultMessage:'Privacy Policy',description:'Footer privacy policy link text'},whitehouselogoalt:{id:'footer.whitehouselogoalt',defaultMessage:'Whitehouse logo',description:'Footer Whitehouse logo alt text'},questionsheader:{id:'footer.questionsheader',defaultMessage:'Have a question about government services?',description:'Footer column header'},contactlink:{id:'footer.findcontactlink',defaultMessage:'Find a contact at USA.gov',description:'Footer find contact link text'}});var NAVLINKS=[['Contact',/*#__PURE__*/react.createElement(lib.Address,{key:'footeraddress',className:'j40-footer-address',size:'big',items:['730 Jackson Pl NW','Washington, D.C. 20506','(202) 395-5750']})],[intl.formatMessage(messages.moreinfoheader),/*#__PURE__*/react.createElement(\"a\",{key:'whitehouselink2',href:'https://www.whitehouse.gov/',target:'_blank',rel:'noreferrer'},\"Whitehouse.gov\"),/*#__PURE__*/react.createElement(\"a\",{key:\"foialink\",target:'_blank',rel:'noreferrer',href:'https://www.whitehouse.gov/ceq/foia'},intl.formatMessage(messages.foia)),/*#__PURE__*/react.createElement(\"a\",{key:'privacylink',target:'_blank',rel:'noreferrer',href:'https://www.whitehouse.gov/privacy/'},intl.formatMessage(messages.privacy))],[intl.formatMessage(messages.questionsheader),/*#__PURE__*/react.createElement(\"a\",{key:'contactlink',href:'https://www.usa.gov/'},intl.formatMessage(messages.contactlink))]];// see https://designsystem.digital.gov/components/footer/\nreturn/*#__PURE__*/ (// we cannot use trussworks Footer because it doesn't layout correct\n// and there's no easy way to override. It comes down to the\n// `className=\"mobile-lg:grid-col-6 desktop:grid-col-3\">` needs to be\n// `className=\"mobile-lg:grid-col-12 desktop:grid-col-4\">` ugh.\nreact.createElement(\"footer\",{className:'j40-footer'},/*#__PURE__*/react.createElement(\"div\",{className:\"usa-footer__primary-section\"},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(\"div\",{className:'grid-row grid-gap-4 padding-bottom-6 tablet-lg:grid-col4'},NAVLINKS.map(function(links,i){return/*#__PURE__*/react.createElement(\"div\",{key:\"linkSection-\"+i,className:\"mobile-lg:grid-col-12 desktop:grid-col-4\"},/*#__PURE__*/react.createElement(NavSection,{links:links}));})))),/*#__PURE__*/react.createElement(\"div\",{className:\"usa-footer__secondary-section\"},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Logo,{size:\"medium\",key:'logoimg',className:'j40-footer-logo',image:/*#__PURE__*/react.createElement(\"img\",{className:'usa-footer__logo-img',src:eop_seal,alt:intl.formatMessage(messages.whitehouselogoalt)}),heading:/*#__PURE__*/react.createElement(\"p\",{className:'j40-footer-logo-heading'},intl.formatMessage(messages.logotitle))})))));};var NavSection=function NavSection(_ref){var links=_ref.links;var primaryLinkOrHeading=links[0],secondaryLinks=links.slice(1);return/*#__PURE__*/react.createElement(\"section\",{className:'usa-footer__primary-content'},/*#__PURE__*/react.createElement(\"h4\",{className:\"padding-top-1 padding-bottom-0\"},primaryLinkOrHeading),/*#__PURE__*/react.createElement(lib.NavList,{className:'padding-bottom-4',type:\"footerSecondary\",items:secondaryLinks}));};/* harmony default export */ var components_J40Footer = (J40Footer);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n;// CONCATENATED MODULE: ./src/components/layout.tsx\nvar Layout=function Layout(_ref){var children=_ref.children,location=_ref.location;// @ts-ignore\nreturn/*#__PURE__*/react.createElement(FlagContext/* URLFlagProvider */.RE,{location:location},/*#__PURE__*/react.createElement(components_J40Header,null),/*#__PURE__*/react.createElement(\"main\",{id:'main-content'},children),/*#__PURE__*/react.createElement(components_J40Footer,null));};/* harmony default export */ var layout = (Layout);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9pbWFnZXMvaWNvbi5wbmc/NWJiYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0MEhlYWRlci50c3g/ZmI1ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9pbWFnZXMvZW9wLXNlYWwuc3ZnP2UyNDQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBGb290ZXIudHN4P2RkNzkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9sYXlvdXQudHN4P2Y0MzgiXSwibmFtZXMiOlsiSjQwSGVhZGVyIiwiaW50bCIsInVzZUludGwiLCJ1c2VTdGF0ZSIsIm1vYmlsZU5hdk9wZW4iLCJzZXRNb2JpbGVOYXZPcGVuIiwibWVzc2FnZXMiLCJkZWZpbmVNZXNzYWdlcyIsInRpdGxlTGluZTEiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJ0aXRsZUxpbmUyIiwiYWJvdXQiLCJleHBsb3JlIiwibWV0aG9kb2xvZ3kiLCJjb250YWN0IiwidGl0bGVMMSIsImZvcm1hdE1lc3NhZ2UiLCJ0aXRsZUwyIiwidG9nZ2xlTW9iaWxlTmF2IiwicHJldk9wZW4iLCJoZWFkZXJMaW5rcyIsIm1lbnVEYXRhIiwiTWFwIiwibWVudSIsIm1hcCIsImtleSIsImdldCIsInNpdGVMb2dvIiwiSjQwRm9vdGVyIiwiYXJpYWxhYmVsZm9vdGVyIiwibG9nb3RpdGxlIiwibW9yZWluZm9oZWFkZXIiLCJmb2lhIiwicHJpdmFjeSIsIndoaXRlaG91c2Vsb2dvYWx0IiwicXVlc3Rpb25zaGVhZGVyIiwiY29udGFjdGxpbmsiLCJOQVZMSU5LUyIsImxpbmtzIiwiaSIsIndoaXRlaG91c2VJY29uIiwiTmF2U2VjdGlvbiIsInByaW1hcnlMaW5rT3JIZWFkaW5nIiwic2Vjb25kYXJ5TGlua3MiLCJMYXlvdXQi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QUNySkEsR0FBTWdCLE9BQU0sQ0FBRyxRQUFUQSxPQUFTLE1BQXdDLElBQXRDQyxTQUFzQyxNQUF0Q0EsUUFBc0MsQ0FBNUJDLFFBQTRCLE1BQTVCQSxRQUE0QixDQUNyRDtBQUNBLG1CQUNFLG9CQUFDLG1DQUFELEVBQWlCLFFBQVEsQ0FBRUEsUUFBM0IsZUFDRSxvQkFBQyxvQkFBRCxNQURGLGNBRUUsNEJBQU0sRUFBRSxDQUFFLGNBQVYsRUFDR0QsUUFESCxDQUZGLGNBS0Usb0JBQUMsb0JBQUQsTUFMRixDQURGLENBU0QsQ0FYRCxDQWFBLDJDQUFlRCxNQUFmIiwiZmlsZSI6IjgyOC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFISUFBQUJIQ0FZQUFBRGJhaE5qQUFBQUNYQklXWE1BQUJZbEFBQVdKUUZKVWlUd0FBQUkyVWxFUVZSNG5PMWR1M0lpUnhUdDNWSXVURWl5K0F2TVpwT1laWW1ockMvQU9ET1JFUkhaU2hrUlppTkNBMStBQzJJTVJKTVp2c0FpSWFURUY2eXJwMDdMcldFZS9SYURPVlhVYW5kSG1wayswN2Z2UGZkTTY5MjNiOStJQ2VUTHJSd2hwSVFQL2JxSUQ0OW5Rc2dHZjZkL1BoM1d3NDJSQzdoUTdQMGFIY00yeHBYaWlSQXlMWGp6S1gvSHlrU0N1RHRDU0FXZkR4cER1U0tFTE9ubnNCNHVYVkt5OTJ0M0VZUDA3UElhNHJEM2F3TkN5Rzh4LzcybDQ4NnVWWnJJZkxsRmI3eEpDUG5KMHZVZjZXQVNRZ1kyWnlzSUhNUThnRjhMM3J4dDY5eHAyUHMxT2tsR0FtUDhRcVl3a2ZseWk1TDNvRG56WkxHajV6eXNoeU9UUDNUdjEraTkvSkZ5MktzbjNoWDJmcTBFRW44UVBPVzQ0TTJicVVSaUJzWTl1YTV3eEF4OTBEMGYxcHgvQkE5M1N1YmVyN1V4V1c0bHZ1MVk4T2E1V0NLeEJvcE1iNWVnTTdSOVdBK25xdWZjK3pWNlR6OUxmQXNsczFudzVqYkRmQkZqL1VueFIzeU9KQkt6Y0NUNVpMZ0VUWTZhaC9Yd1NmYWNlNysya1FoYkRFRkVLSGh6N1lnUXVwWWlacURNZ3hXRlV5THo1UmFkM3IrYnZHQkxPR0oyU3EyZmU3K21VMi90TVBCYW1TMFNyVHNEQkRKOGZFVmt2dHlTRFR2bmdERUlGUnJZdlY5N01yRGVzOHc2S0prSzNqd3hNbURtc1RMdHpuQ2syeFc4ZWZHRnlJeVN5QkFrSlNKa0txeVJvbGpGSEtlNjdvbml2dUROQndHUitYS0xob3N2bGs5b0cwZVFtWmlVN1AwYW5SVi9aZnhlR1lMU2czNzk3cnNmZjVWSng4OGRvbVFtS1NaWndRdUpGRGVJMmFheGd0d1ZYanVZSGx1MFZKZmVvdWF0SkIxRVZSdW9KMWxkU29Kd3l2OERuWkZUQTdYaURvdi9TRlJXeTVkYk5oT0FqeUxYWVhHOXRBVWFjZTRLM3Z4RWo2WkVMalVXWkNNU0dpZkF0eFZxdkNqY0g5YkRnY2lCVUZPeVVHNnRRR0prUW5lRGRwSXNrVWNRS0RSWWFVQzJTUitHVWI3Y3FpQTg2aENhRXoyUWhpaUlCTk16RlVDQ3NRNkgwakRlb3hhU0FVdjFqWkFZQm0xakhkWkR1bzdlNHlaVUlGV3NJMVRSVVArbmpYdlNBSzJSaTJra0V0Ykd5cGRib3VGVnVGNHpBWVRjcVVMRStGNUZ2aVAvbFNlNkVVRVhZOHhDNFh0Z1JPWXdNNU11M2ltSlBDVHIzTlZoUFV6TVdrV0FWbGZUUVVIUGNNVHlNcEFoa0lGWGRuSjRFc05abkxFV2tnN1FEMDNySWRKckxacDgyTkFmYkZ2SXJBa245WjFZTjJRUkpacm5PT3NEY1cyOVNFSyszQ3JoeHFOcTBDQ3JzeGt4UUNxenQ1UVVpRDBpdVdRYXJiR3hOV2ErY2dtMDJVcmNLYWR2WWVLQ0dGN2toSTRvYkpqcHpHYURPcE5FWG5HSzk5Y3h1UXhjaWJ3UTNKaThEYWd5dkRHNUZGSloyT0wrekJtVWxlcTkvd3ZxUGIrSU1vaVZWSUVLTmV0NnJ4SWxYWU15RTd4TEdnVTB5K1NtTUNnN1RWcnFQYjhTR3FUbHJPdWRoVUc1M3ZPVDJtMUJsczZ1VmNXZ1hNRVRZcXRySU4xSlVRRUlIRVdVTWtIZFBPdDZiMVkzMTN0K1hFMGZSaURTVURMUDNhQzhoUmhoMUtCYzcva2k0c0o0MXZXYUtjY1lCMExwVkNMQ2ZaMTF2YmFJUVRudXlYVUpZNDV6RE5SR3NKaW5JbnJUVmFpdDkzd1ZHK3B4MXZVeWFWQnU2cWhOS2V0T0ZMWllpNndsWlhpNEJocGpIV3RRcnB4eGY0NndtYUlpeDlWN3ZxcEIrV0hXOVl5MjdyQVd0ZzBZM3lJTnlpTHJ4em5nQ0RLbHhPWjZ6OWMyS00rNm5sYUlyL2Q4SnNSZkRjb2N4b2YxVURncHFmZDhrd2JscVVpNWdwbkgrNU5NNWh1N1dkY3J2Z2dDR1RZby80eXVpR2l2ZEdOZ0lHOHhWc0Y0MVh2K2puTU1icmczdG9saWwwUUdRWFM0SklQeURtMnN4Tm9UOWVQRkdKUlppWFNKQnVWU211eFg3L2xaZmoyQzRWV2RhOHVndkVXb0NjOE9wc1BhQ2plM0NEV0pWZzg2QVBXZVR6Sk01bU5ZZVRKbFVHWitrNmxvamNjWmxPOHMxS3BDQnVVTXpzd2pCSXFUVFAzY0RNcW1KRUJoZzNLOTUyY2xQMWlCeE1obGd4S3A4a0tMTlVPV0lVMzNVZWJhRktVeFZ4QVNJM1FNeWxhNkEzUjJIOWJEb2t1RE1rTFYyUnFVUlJRbFZuNkl5bGF1RGNxcW15UUlyWkZSU0dodnVjUVlzMURhb0N6U0VYaExnN0pNK0RkaVVFYXJ5MlhianFsRlVnUXlDQnVVc1NhK1dlZGN3cUNjV2tmS0FETzBhY21nVEJET3A3QnZLSTl2MWd6S1NXRlBlY3NXVVNBcFl1WmsxVXgveFZsS3ROemxQSzRHWlEyZ2k1R0xNSm54WUc5dVA5bnNhVjROeWhlQ3E2LzFRbURhMThwdjloRGVkSmVCZVZxZnI1dnVwcU16cVRMVmk0MG5IYjlwdjdGNEZhYTFRaXZyQTNJZmxheHV5OTVPZ3EvVmFXYmNtVlQ1aCs2NTMxaWN6Y1BWbVZTVGRvc01kdnpxTnhiS3Z0WWk5NzZnalJwcnkvWVRzRWxxWjFJdG9hd0taNStCZnR4dkxJeGFNR1hSbVZSRkJQMXR2N0VJa2o0Wlgyc0ZCTHAwMVkxQnFORVNDQ1F1VXlMSXVOOVlPUGUxSXBUS3VCY2YrNDNGZzRpdlZYY3ZVUk5Zb2N1aVRTZ0c2a2x3R1hCS1ptZFNWWkVIai8zR0l0N1hTdVRmM1hlQkZYYUNWRjdIT3BPcTdEMEYxa3UyRnRrQUhxNEhqVzNWUGthV0h6U0pnWkIrYm4wNkdoWCtwdG9yTW1RVnlPcXdOTVJ0T3BPcURTY0ZKYkdKQ0tHek45N3BqTXpBN3NrTVNxN3p6cVNxbzRDc2tBaHBoWGhreWsza0hDYkcrWFBZMTVvVmN6SVBxU1p5WjFKOU5qQjRPMlM4UzlGeUJRa1dFK0JON3VFVHJKRzhyeldMSkZKOFFUMHIrZ3JCMGtEbS9ZSHRYOWVaVkVuQ2JwaE1nN1daS0FaTjU0RElESlBJUUlsWjBoSkpnRXdUWnJNd1ByMVJWcjlsUkZMUGprdzZmdTRRYW41M0psVWJaTHBHY0s4c203NUJ6TFpCWXR3ZTM3WTIzU1ZZZTBZQ1h0Mm13Slp0NTR5VCt0YVVyNVZ3bmU1bFduT1hFOWRabzliMGdLWnVLb2phTFl0azN2Y2JpeE16bHE2djFZZ05oTk52VFVXSFgwUzl0b0thNWprZ2VMY2xMa3QrSDVGcGllSXJOdkI3MEJXMzZldzVySWR0aE4xSERSc2tRMXdMN1FRSVVmZWE1N01OT3RhbHBGS0h6a2paalBXSXQ1NnNlWGtRZW5Va0syR25PUVBxUEpuZkV1Y0NLN1NxVW10VlpvY1VmZmx6Q3hLZGJIS1VzaHRrRXBSOXJTazlRRmVRVnBBWWtTSnRuVGZ4dFNiWU5PT2c3V3RGSXRRMktLR0pnaWFNQXhVSmtQZTF4alZhaWV6dm43SUJ3VTZNMEM5d2tRRkViWnM3S2JORytvbDlRd1pSb2puVEJKbFFrRnBPdUFJVXFFSE1MQkY2WTFrVkVMb3JYTW1rT2xOMzNPYTdXdVR4eUp3ZEVxRzJHZkd3T2JWbWNGNGZwcWRHYmI0YjNrUnhZNld2U1FqNUYwSWxsTkxRMjBjWkFBQUFBRWxGVGtTdVFtQ0NcIiIsImltcG9ydCBSZWFjdCwge3VzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0xpbmssIHVzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5pbXBvcnQge1xuICBIZWFkZXIsXG4gIE5hdk1lbnVCdXR0b24sXG4gIFByaW1hcnlOYXYsXG4gIEdvdkJhbm5lcixcbn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgc2l0ZUxvZ28gZnJvbSAnLi4vLi4vc3JjL2ltYWdlcy9pY29uLnBuZyc7XG5cbmNvbnN0IEo0MEhlYWRlciA9ICgpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgW21vYmlsZU5hdk9wZW4sIHNldE1vYmlsZU5hdk9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICB0aXRsZUxpbmUxOiB7XG4gICAgICBpZDogJ2hlYWRlci50aXRsZS5saW5lMScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogYENsaW1hdGUgYW5kIEVjb25vbWljIEp1c3RpY2VgLFxuICAgICAgZGVzY3JpcHRpb246ICdUaXRsZSBpbiBuYXYgaGVhZGVyIGxpbmUgMSBvZiAyJyxcbiAgICB9LFxuICAgIHRpdGxlTGluZTI6IHtcbiAgICAgIGlkOiAnaGVhZGVyLnRpdGxlLmxpbmUyJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiBgU2NyZWVuaW5nIFRvb2xgLFxuICAgICAgZGVzY3JpcHRpb246ICdUaXRsZSBpbiBuYXYgaGVhZGVyIGxpbmUgMiBvZiAyJyxcbiAgICB9LFxuICAgIGFib3V0OiB7XG4gICAgICBpZDogJ2hlYWRlci5hYm91dCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0Fib3V0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVhZGVyIG5hdmlnYXRlIGl0ZW0gdG8gdGhlIGFib3V0IHBhZ2UnLFxuICAgIH0sXG4gICAgZXhwbG9yZToge1xuICAgICAgaWQ6ICdoZWFkZXIuZXhwbG9yZScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0V4cGxvcmUgdGhlIHRvb2wnLFxuICAgICAgZGVzY3JpcHRpb246ICdIZWFkZXIgbmF2aWdhdGUgaXRlbSB0byB0aGUgRXhwbG9yZSB0aGUgdG9vbCBwYWdlJyxcbiAgICB9LFxuICAgIG1ldGhvZG9sb2d5OiB7XG4gICAgICBpZDogJ2hlYWRlci5tZXRob2RvbG9neScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0RhdGEgJiBtZXRob2RvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0hlYWRlciBuYXZpZ2F0ZSBpdGVtIHRvIHRoZSBNZXRob2RvbG9neSBwYWdlJyxcbiAgICB9LFxuICAgIGNvbnRhY3Q6IHtcbiAgICAgIGlkOiAnaGVhZGVyLmNvbnRhY3QnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDb250YWN0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVhZGVyIG5hdmlnYXRlIGl0ZW0gdG8gdGhlIENvbnRhY3QgcGFnZScsXG4gICAgfSxcbiAgfSk7XG4gIGNvbnN0IHRpdGxlTDEgPSBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMudGl0bGVMaW5lMSk7XG4gIGNvbnN0IHRpdGxlTDIgPSBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMudGl0bGVMaW5lMik7XG5cbiAgY29uc3QgdG9nZ2xlTW9iaWxlTmF2ID0gKCk6IHZvaWQgPT5cbiAgICBzZXRNb2JpbGVOYXZPcGVuKChwcmV2T3BlbikgPT4gIXByZXZPcGVuKTtcblxuICBjb25zdCBoZWFkZXJMaW5rcyA9ICgpID0+IHtcbiAgICAvLyBzdGF0aWMgbWFwIG9mIGFsbCBwb3NzaWJsZSBtZW51IGl0ZW1zLiBPcmlnaW5hbGx5LCBpdCB3YXMgYWxsIHN0cmluZ3MsXG4gICAgLy8gYnV0IHdlIG5lZWQgdG8gaGFuZGxlIGJvdGggb25zaXRlIGFuZCBvZmZzaXRlIGxpbmtzLlxuICAgIGNvbnN0IG1lbnVEYXRhID0gbmV3IE1hcDxzdHJpbmcsIEpTWC5FbGVtZW50PihbXG4gICAgICBbJ2Fib3V0JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy8nfVxuICAgICAgICAgIGtleT17J2Fib3V0J31cbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJ1c2EtY3VycmVudFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWJvdXQpfTwvTGluaz5dLFxuICAgICAgWydjZWpzdCcsXG4gICAgICAgIDxMaW5rXG4gICAgICAgICAgdG89eycvY2Vqc3QnfVxuICAgICAgICAgIGtleT17J2NlanN0J31cbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJ1c2EtY3VycmVudFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZXhwbG9yZSl9PC9MaW5rPl0sXG4gICAgICBbJ21ldGhvZG9sb2d5JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy9tZXRob2RvbG9neSd9XG4gICAgICAgICAga2V5PXsnbWV0aG9kb2xvZ3knfVxuICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cInVzYS1jdXJyZW50XCJcbiAgICAgICAgICBjbGFzc05hbWU9eydqNDAtaGVhZGVyJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5tZXRob2RvbG9neSl9PC9MaW5rPl0sXG4gICAgICBbJ2NvbnRhY3QnLFxuICAgICAgICA8TGlua1xuICAgICAgICAgIHRvPXsnL2NvbnRhY3QnfVxuICAgICAgICAgIGtleT17J2NvbnRhY3QnfVxuICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cInVzYS1jdXJyZW50XCJcbiAgICAgICAgICBjbGFzc05hbWU9eydqNDAtaGVhZGVyJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5jb250YWN0KX08L0xpbms+XSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1lbnUgPVsnYWJvdXQnLCAnY2Vqc3QnLCAnbWV0aG9kb2xvZ3knLCAnY29udGFjdCddO1xuICAgIHJldHVybiBtZW51Lm1hcCgoa2V5KSA9PiBtZW51RGF0YS5nZXQoa2V5KSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEdvdkJhbm5lci8+XG4gICAgICA8SGVhZGVyXG4gICAgICAgIGJhc2ljPXt0cnVlfSByb2xlPXsnYmFubmVyJ31cbiAgICAgICAgY2xhc3NOYW1lPXsndXNhLWhlYWRlciBqNDAtaGVhZGVyJ30+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhLW5hdi1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYS1uYXZiYXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ1c2EtbG9nb1wiPlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImo0MC1zaXRlbG9nb1wiIHNyYz17c2l0ZUxvZ299IGFsdD17YCR7dGl0bGVMMX0gJHt0aXRsZUwyfWB9IC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J3VzYS1sb2dvX190ZXh0IGo0MC10aXRsZSd9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC10aXRsZS1saW5lMSd9Pnt0aXRsZUwxfTwvc3Bhbj48YnIvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC10aXRsZS1saW5lMid9Pnt0aXRsZUwyfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxOYXZNZW51QnV0dG9uXG4gICAgICAgICAgICAgIGtleT17J21vYmlsZU1lbnVCdXR0b24nfVxuICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGVNb2JpbGVOYXZ9XG4gICAgICAgICAgICAgIGxhYmVsPVwiTWVudVwiLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8UHJpbWFyeU5hdlxuICAgICAgICAgICAgaXRlbXM9e2hlYWRlckxpbmtzKCl9XG4gICAgICAgICAgICBtb2JpbGVFeHBhbmRlZD17bW9iaWxlTmF2T3Blbn1cbiAgICAgICAgICAgIG9uVG9nZ2xlTW9iaWxlTmF2PXt0b2dnbGVNb2JpbGVOYXZ9XG4gICAgICAgICAgICBjbGFzc05hbWU9eydqNDAtaGVhZGVyJ31cbiAgICAgICAgICA+XG4gICAgICAgICAgPC9QcmltYXJ5TmF2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvSGVhZGVyPlxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSjQwSGVhZGVyO1xuIiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9lb3Atc2VhbC0xMmU1ZGNjNDQ1M2NiMzMyMTUxNWY1MDg3NGQxZjFmNi5zdmdcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgQWRkcmVzcyxcbiAgTG9nbyxcbn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHtOYXZMaXN0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHdoaXRlaG91c2VJY29uIGZyb20gJy4uL2ltYWdlcy9lb3Atc2VhbC5zdmcnO1xuaW1wb3J0IEo0ME1haW5HcmlkQ29udGFpbmVyIGZyb20gJy4vSjQwTWFpbkdyaWRDb250YWluZXInO1xuXG5jb25zdCBKNDBGb290ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICAgIGFyaWFsYWJlbGZvb3Rlcjoge1xuICAgICAgaWQ6ICdmb290ZXIuYXJpYWxhYmVsJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRm9vdGVyIG5hdmlnYXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdhcmlhLWxhYmVsIHRleHQgZm9yIHdob2xlIGZvb3RlcicsXG4gICAgfSxcbiAgICBsb2dvdGl0bGU6IHtcbiAgICAgIGlkOiAnZm9vdGVyLmxvZ28udGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDb3VuY2lsIG9uIEVudmlyb25tZW50YWwgUXVhbGl0eScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Zvb3RlciB1bmRlciBsb2dvJyxcbiAgICB9LFxuICAgIG1vcmVpbmZvaGVhZGVyOiB7XG4gICAgICBpZDogJ2Zvb3Rlci5tb3JlaW5mb2hlYWRlcicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ01vcmUgaW5mb3JtYXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdGb290ZXIgY29sdW1uIGhlYWRlcicsXG4gICAgfSxcbiAgICBmb2lhOiB7XG4gICAgICBpZDogJ2Zvb3Rlci5mb2lhbGluaycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0ZyZWVkb20gb2YgSW5mb3JtYXRpb24gQWN0IChGT0lBKScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Zvb3RlciBGT0lBIGxpbmsgdGV4dCcsXG4gICAgfSxcbiAgICBwcml2YWN5OiB7XG4gICAgICBpZDogJ2Zvb3Rlci5wcml2YWN5bGluaycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1ByaXZhY3kgUG9saWN5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9vdGVyIHByaXZhY3kgcG9saWN5IGxpbmsgdGV4dCcsXG4gICAgfSxcbiAgICB3aGl0ZWhvdXNlbG9nb2FsdDoge1xuICAgICAgaWQ6ICdmb290ZXIud2hpdGVob3VzZWxvZ29hbHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdXaGl0ZWhvdXNlIGxvZ28nLFxuICAgICAgZGVzY3JpcHRpb246ICdGb290ZXIgV2hpdGVob3VzZSBsb2dvIGFsdCB0ZXh0JyxcbiAgICB9LFxuICAgIHF1ZXN0aW9uc2hlYWRlcjoge1xuICAgICAgaWQ6ICdmb290ZXIucXVlc3Rpb25zaGVhZGVyJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSGF2ZSBhIHF1ZXN0aW9uIGFib3V0IGdvdmVybm1lbnQgc2VydmljZXM/JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9vdGVyIGNvbHVtbiBoZWFkZXInLFxuICAgIH0sXG4gICAgY29udGFjdGxpbms6IHtcbiAgICAgIGlkOiAnZm9vdGVyLmZpbmRjb250YWN0bGluaycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0ZpbmQgYSBjb250YWN0IGF0IFVTQS5nb3YnLFxuICAgICAgZGVzY3JpcHRpb246ICdGb290ZXIgZmluZCBjb250YWN0IGxpbmsgdGV4dCcsXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgTkFWTElOS1MgPSBbXG4gICAgWydDb250YWN0JyxcbiAgICAgIDxBZGRyZXNzXG4gICAgICAgIGtleT17J2Zvb3RlcmFkZHJlc3MnfVxuICAgICAgICBjbGFzc05hbWU9eydqNDAtZm9vdGVyLWFkZHJlc3MnfVxuICAgICAgICBzaXplPXsnYmlnJ31cbiAgICAgICAgaXRlbXM9e1tcbiAgICAgICAgICAnNzMwIEphY2tzb24gUGwgTlcnLFxuICAgICAgICAgICdXYXNoaW5ndG9uLCBELkMuIDIwNTA2JyxcbiAgICAgICAgICAnKDIwMikgMzk1LTU3NTAnLFxuICAgICAgICBdfVxuICAgICAgLz4sXG4gICAgXSxcbiAgICBbXG4gICAgICBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubW9yZWluZm9oZWFkZXIpLFxuICAgICAgPGFcbiAgICAgICAga2V5PXsnd2hpdGVob3VzZWxpbmsyJ31cbiAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LndoaXRlaG91c2UuZ292Lyd9XG4gICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgIHJlbD17J25vcmVmZXJyZXInfT5XaGl0ZWhvdXNlLmdvdjwvYT4sXG4gICAgICA8YVxuICAgICAgICBrZXk9XCJmb2lhbGlua1wiXG4gICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3YvY2VxL2ZvaWEnfT5cbiAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5mb2lhKX1cbiAgICAgIDwvYT4sXG4gICAgICA8YVxuICAgICAgICBrZXk9eydwcml2YWN5bGluayd9XG4gICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3YvcHJpdmFjeS8nfT5cbiAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5wcml2YWN5KX1cbiAgICAgIDwvYT4sXG4gICAgXSxcbiAgICBbXG4gICAgICBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucXVlc3Rpb25zaGVhZGVyKSxcbiAgICAgIDxhXG4gICAgICAgIGtleT17J2NvbnRhY3RsaW5rJ31cbiAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LnVzYS5nb3YvJ30+XG4gICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuY29udGFjdGxpbmspfVxuICAgICAgPC9hPixcbiAgICBdLFxuICBdO1xuXG4gIC8vIHNlZSBodHRwczovL2Rlc2lnbnN5c3RlbS5kaWdpdGFsLmdvdi9jb21wb25lbnRzL2Zvb3Rlci9cbiAgcmV0dXJuIChcbiAgICAvLyB3ZSBjYW5ub3QgdXNlIHRydXNzd29ya3MgRm9vdGVyIGJlY2F1c2UgaXQgZG9lc24ndCBsYXlvdXQgY29ycmVjdFxuICAgIC8vIGFuZCB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIG92ZXJyaWRlLiBJdCBjb21lcyBkb3duIHRvIHRoZVxuICAgIC8vIGBjbGFzc05hbWU9XCJtb2JpbGUtbGc6Z3JpZC1jb2wtNiBkZXNrdG9wOmdyaWQtY29sLTNcIj5gIG5lZWRzIHRvIGJlXG4gICAgLy8gYGNsYXNzTmFtZT1cIm1vYmlsZS1sZzpncmlkLWNvbC0xMiBkZXNrdG9wOmdyaWQtY29sLTRcIj5gIHVnaC5cbiAgICA8Zm9vdGVyIGNsYXNzTmFtZT17J2o0MC1mb290ZXInfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhLWZvb3Rlcl9fcHJpbWFyeS1zZWN0aW9uXCI+XG4gICAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2dyaWQtcm93IGdyaWQtZ2FwLTQgcGFkZGluZy1ib3R0b20tNiB0YWJsZXQtbGc6Z3JpZC1jb2w0J30+XG4gICAgICAgICAgICB7TkFWTElOS1MubWFwKChsaW5rcywgaSkgPT4gKFxuICAgICAgICAgICAgICA8ZGl2IGtleT17YGxpbmtTZWN0aW9uLSR7aX1gfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1vYmlsZS1sZzpncmlkLWNvbC0xMiBkZXNrdG9wOmdyaWQtY29sLTRcIj5cbiAgICAgICAgICAgICAgICA8TmF2U2VjdGlvbiBsaW5rcz17bGlua3N9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2EtZm9vdGVyX19zZWNvbmRhcnktc2VjdGlvblwiPlxuICAgICAgICA8SjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICAgICAgPExvZ29cbiAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIlxuICAgICAgICAgICAga2V5PXsnbG9nb2ltZyd9XG4gICAgICAgICAgICBjbGFzc05hbWU9eydqNDAtZm9vdGVyLWxvZ28nfVxuICAgICAgICAgICAgaW1hZ2U9e1xuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsndXNhLWZvb3Rlcl9fbG9nby1pbWcnfVxuICAgICAgICAgICAgICAgIHNyYz17d2hpdGVob3VzZUljb259XG4gICAgICAgICAgICAgICAgYWx0PXtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMud2hpdGVob3VzZWxvZ29hbHQpfS8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoZWFkaW5nPXs8cFxuICAgICAgICAgICAgICBjbGFzc05hbWU9eydqNDAtZm9vdGVyLWxvZ28taGVhZGluZyd9PlxuICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmxvZ290aXRsZSl9PC9wPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9mb290ZXI+XG4gICk7XG59O1xuXG5jb25zdCBOYXZTZWN0aW9uID0gKHtcbiAgbGlua3MsXG59OiB7XG4gIGxpbmtzOiBSZWFjdC5SZWFjdE5vZGVbXVxufSk6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGNvbnN0IFtwcmltYXJ5TGlua09ySGVhZGluZywgLi4uc2Vjb25kYXJ5TGlua3NdID0gbGlua3M7XG4gIHJldHVybiAoXG4gICAgPHNlY3Rpb24gY2xhc3NOYW1lPXsndXNhLWZvb3Rlcl9fcHJpbWFyeS1jb250ZW50J30+XG4gICAgICA8aDQgY2xhc3NOYW1lPVwicGFkZGluZy10b3AtMSBwYWRkaW5nLWJvdHRvbS0wXCI+e3ByaW1hcnlMaW5rT3JIZWFkaW5nfTwvaDQ+XG4gICAgICA8TmF2TGlzdCBjbGFzc05hbWU9eydwYWRkaW5nLWJvdHRvbS00J30gdHlwZT1cImZvb3RlclNlY29uZGFyeVwiIGl0ZW1zPXtzZWNvbmRhcnlMaW5rc30gLz5cbiAgICA8L3NlY3Rpb24+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBGb290ZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKNDBIZWFkZXIgZnJvbSAnLi9KNDBIZWFkZXInO1xuaW1wb3J0IEo0MEZvb3RlciBmcm9tICcuL0o0MEZvb3Rlcic7XG5pbXBvcnQge1VSTEZsYWdQcm92aWRlcn0gZnJvbSAnLi4vY29udGV4dHMvRmxhZ0NvbnRleHQnO1xuXG5pbnRlcmZhY2UgSUxheW91dFByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgbG9jYXRpb246IExvY2F0aW9uXG59XG5cbmNvbnN0IExheW91dCA9ICh7Y2hpbGRyZW4sIGxvY2F0aW9ufTogSUxheW91dFByb3BzKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIChcbiAgICA8VVJMRmxhZ1Byb3ZpZGVyIGxvY2F0aW9uPXtsb2NhdGlvbn0+XG4gICAgICA8SjQwSGVhZGVyIC8+XG4gICAgICA8bWFpbiBpZD17J21haW4tY29udGVudCd9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L21haW4+XG4gICAgICA8SjQwRm9vdGVyLz5cbiAgICA8L1VSTEZsYWdQcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheW91dDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///828\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);\nfunction _createForOfIteratorHelperLoose(o,allowArrayLike){var it=typeof Symbol!=="undefined"&&o[Symbol.iterator]||o["@@iterator"];if(it)return(it=it.call(o)).next.bind(it);if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&typeof o.length==="number"){if(it)o=it;var i=0;return function(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]};};}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}function _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);}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jaHJvbWEtanMvY2hyb21hLmpzP2JmNDQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBNEQsZ0NBQWdDLENBQXdGO0FBQ3RMLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQSxxSEFBcUgsaUJBQWlCO0FBQ3RJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87OztBQUdQLDhDQUE4QyxpQkFBaUI7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLE9BQU87QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxZQUFZO0FBQ25CO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQSxxQkFBcUIsT0FBTztBQUM1QjtBQUNBOztBQUVBLGlCQUFpQjs7QUFFakI7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUEsbUJBQW1COztBQUVuQjtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUEsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxFQUFFLGFBQWEsRUFBRTtBQUNqRCxpQ0FBaUMsRUFBRSxhQUFhLEVBQUU7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxpQkFBaUI7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FB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OztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkMsc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsT0FBTztBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsV0FBVztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDs7QUFFQSx5QkFBeUIsV0FBVztBQUNwQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0EsU0FBUzs7O0FBR1Q7O0FBRUEseUJBQXlCLFdBQVc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsdUJBQXVCLDhCQUE4QjtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLHNEQUFzRCxxQkFBcUI7QUFDM0U7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekIsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiMzg3My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2hyb21hLmpzIC0gSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBjb2xvciBjb252ZXJzaW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE5LCBHcmVnb3IgQWlzY2hcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIFRoZSBuYW1lIEdyZWdvciBBaXNjaCBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4gKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHUkVHT1IgQUlTQ0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCxcbiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBjaHJvbWEuanMgaW5jbHVkZXMgY29sb3JzIGZyb20gY29sb3JicmV3ZXIyLm9yZywgd2hpY2ggYXJlIHJlbGVhc2VkIHVuZGVyXG4gKiB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDAyIEN5bnRoaWEgQnJld2VyLCBNYXJrIEhhcnJvd2VyLFxuICogYW5kIFRoZSBQZW5uc3lsdmFuaWEgU3RhdGUgVW5pdmVyc2l0eS5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCxcbiAqIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljXG4gKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIE5hbWVkIGNvbG9ycyBhcmUgdGFrZW4gZnJvbSBYMTEgQ29sb3IgTmFtZXMuXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3JcbiAqXG4gKiBAcHJlc2VydmVcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiBnbG9iYWwuY2hyb21hID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGxpbWl0ID0gZnVuY3Rpb24gbGltaXQoeCwgbWluLCBtYXgpIHtcbiAgICBpZiAobWluID09PSB2b2lkIDApIG1pbiA9IDA7XG4gICAgaWYgKG1heCA9PT0gdm9pZCAwKSBtYXggPSAxO1xuICAgIHJldHVybiB4IDwgbWluID8gbWluIDogeCA+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")},5087:function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function (window, document, exportName, undefined) {\n 'use strict';\n\n var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n var TEST_ELEMENT = document.createElement('div');\n var TYPE_FUNCTION = 'function';\n var round = Math.round;\n var abs = Math.abs;\n var now = Date.now;\n /**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\n\n function setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n }\n /**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\n\n\n function invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n\n return false;\n }\n /**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\n\n\n function each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n }\n /**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\n\n\n function deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function () {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '').replace(/^\\s+at\\s+/gm, '').replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n var log = window.console && (window.console.warn || window.console.log);\n\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n\n return method.apply(this, arguments);\n };\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\n\n\n var assign;\n\n if (typeof Object.assign !== 'function') {\n assign = function assign(target) {\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 index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n\n return output;\n };\n } else {\n assign = Object.assign;\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\n\n\n var extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n\n while (i < keys.length) {\n if (!merge || merge && dest[keys[i]] === undefined) {\n dest[keys[i]] = src[keys[i]];\n }\n\n i++;\n }\n\n return dest;\n }, 'extend', 'Use `assign`.');\n /**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\n\n var merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n }, 'merge', 'Use `assign`.');\n /**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\n\n function inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n }\n /**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\n\n\n function bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n }\n /**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\n\n\n function boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n\n return val;\n }\n /**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\n\n\n function ifUndefined(val1, val2) {\n return val1 === undefined ? val2 : val1;\n }\n /**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function addEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.addEventListener(type, handler, false);\n });\n }\n /**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function removeEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.removeEventListener(type, handler, false);\n });\n }\n /**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\n\n\n function hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n\n node = node.parentNode;\n }\n\n return false;\n }\n /**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\n\n\n function inStr(str, find) {\n return str.indexOf(find) > -1;\n }\n /**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\n\n\n function splitStr(str) {\n return str.trim().split(/\\s+/g);\n }\n /**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\n\n\n function inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n\n while (i < src.length) {\n if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {\n return i;\n }\n\n i++;\n }\n\n return -1;\n }\n }\n /**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\n\n\n function toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n }\n /**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\n\n\n function uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n }\n /**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\n\n\n function prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n var i = 0;\n\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = prefix ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n\n i++;\n }\n\n return undefined;\n }\n /**\n * get a unique id\n * @returns {number} uniqueId\n */\n\n\n var _uniqueId = 1;\n\n function uniqueId() {\n return _uniqueId++;\n }\n /**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\n\n\n function getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return doc.defaultView || doc.parentWindow || window;\n }\n\n var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n var SUPPORT_TOUCH = ('ontouchstart' in window);\n var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\n var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n var INPUT_TYPE_TOUCH = 'touch';\n var INPUT_TYPE_PEN = 'pen';\n var INPUT_TYPE_MOUSE = 'mouse';\n var INPUT_TYPE_KINECT = 'kinect';\n var COMPUTE_INTERVAL = 25;\n var INPUT_START = 1;\n var INPUT_MOVE = 2;\n var INPUT_END = 4;\n var INPUT_CANCEL = 8;\n var DIRECTION_NONE = 1;\n var DIRECTION_LEFT = 2;\n var DIRECTION_RIGHT = 4;\n var DIRECTION_UP = 8;\n var DIRECTION_DOWN = 16;\n var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n var PROPS_XY = ['x', 'y'];\n var PROPS_CLIENT_XY = ['clientX', 'clientY'];\n /**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\n\n function Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n\n this.domHandler = function (ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n }\n\n Input.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function handler() {},\n\n /**\n * bind the events\n */\n init: function init() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function destroy() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n };\n /**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\n\n function createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n\n return new Type(manager, inputHandler);\n }\n /**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\n\n\n function inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n } // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n\n\n input.eventType = eventType; // compute scale, rotation etc\n\n computeInputData(manager, input); // emit secret event\n\n manager.emit('hammer.input', input);\n manager.recognize(input);\n manager.session.prevInput = input;\n }\n /**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\n\n\n function computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length; // store the first input to calculate the distance and direction\n\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n } // to compute scale and rotation we need to store the multiple touches\n\n\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n computeIntervalInputData(session, input); // find the correct target\n\n var target = manager.element;\n\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n\n input.target = target;\n }\n\n function computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n }\n /**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\n\n\n function computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity,\n velocityX,\n velocityY,\n direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n }\n /**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\n\n\n function simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n }\n /**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\n\n\n function getCenter(pointers) {\n var pointersLength = pointers.length; // no need to loop when only one touch\n\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0,\n y = 0,\n i = 0;\n\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n }\n /**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\n\n\n function getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n }\n /**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\n\n\n function getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n }\n /**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\n\n\n function getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.sqrt(x * x + y * y);\n }\n /**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\n\n\n function getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n }\n /**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\n\n\n function getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n }\n /**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\n\n\n function getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n }\n\n var MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n };\n var MOUSE_ELEMENT_EVENTS = 'mousedown';\n var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n /**\n * Mouse events input\n * @constructor\n * @extends Input\n */\n\n function MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n }\n\n inherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down\n\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n } // mouse must be down\n\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n });\n var POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n }; // in IE10 the pointer types is defined as an enum\n\n var IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n\n };\n var POINTER_ELEMENT_EVENTS = 'pointerdown';\n var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive\n\n if (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n }\n /**\n * Pointer events input\n * @constructor\n * @extends Input\n */\n\n\n function PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n Input.apply(this, arguments);\n this.store = this.manager.session.pointerEvents = [];\n }\n\n inherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store\n\n var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down\n\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n } // it not found, so the pointer hasn't been down (so it's probably a hover)\n\n\n if (storeIndex < 0) {\n return;\n } // update the event in the store\n\n\n store[storeIndex] = ev;\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n });\n var SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Touch events input\n * @constructor\n * @extends Input\n */\n\n function SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n Input.apply(this, arguments);\n }\n\n inherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events?\n\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state\n\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n }\n\n var TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\n\n function TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n Input.apply(this, arguments);\n }\n\n inherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds; // when there is only one touch, the process can be simplified\n\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target; // get target touches from touches\n\n targetTouches = allTouches.filter(function (touch) {\n return hasParent(touch.target, target);\n }); // collect touches\n\n if (type === INPUT_START) {\n i = 0;\n\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n } // filter changed touches to only contain touches that exist in the collected target ids\n\n\n i = 0;\n\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n } // cleanup removed touches\n\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];\n }\n /**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\n\n var DEDUP_TIMEOUT = 2500;\n var DEDUP_DISTANCE = 25;\n\n function TouchMouseInput() {\n Input.apply(this, arguments);\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n this.primaryTouch = null;\n this.lastTouches = [];\n }\n\n inherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,\n isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n } // when we're in a touch event, record touches to de-dupe synthetic mouse event\n\n\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n });\n\n function recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n }\n\n function setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {\n x: touch.clientX,\n y: touch.clientY\n };\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n\n var removeLastTouch = function removeLastTouch() {\n var i = lts.indexOf(lastTouch);\n\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n }\n\n function isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX,\n y = eventData.srcEvent.clientY;\n\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x),\n dy = Math.abs(y - t.y);\n\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n\n return false;\n }\n\n var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value\n\n var TOUCH_ACTION_COMPUTE = 'compute';\n var TOUCH_ACTION_AUTO = 'auto';\n var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n\n var TOUCH_ACTION_NONE = 'none';\n var TOUCH_ACTION_PAN_X = 'pan-x';\n var TOUCH_ACTION_PAN_Y = 'pan-y';\n var TOUCH_ACTION_MAP = getTouchActionProps();\n /**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\n\n function TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n }\n\n TouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function set(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function update() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function compute() {\n var actions = [];\n each(this.manager.recognizers, function (recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function preventDefaults(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection; // if the touch action did prevented once this session\n\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function preventSrc(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n };\n /**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\n\n function cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n } // pan-x OR pan-y\n\n\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n } // manipulation\n\n\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n }\n\n function getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n }\n /**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\n\n\n var STATE_POSSIBLE = 1;\n var STATE_BEGAN = 2;\n var STATE_CHANGED = 4;\n var STATE_ENDED = 8;\n var STATE_RECOGNIZED = STATE_ENDED;\n var STATE_CANCELLED = 16;\n var STATE_FAILED = 32;\n /**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\n\n function Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n this.id = uniqueId();\n this.manager = null; // default is enable true\n\n this.options.enable = ifUndefined(this.options.enable, true);\n this.state = STATE_POSSIBLE;\n this.simultaneous = {};\n this.requireFail = [];\n }\n\n Recognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function set(options) {\n assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state\n\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function recognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function dropRecognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function requireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function dropRequireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function hasRequireFailures() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function canRecognizeWith(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function emit(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n } // 'panstart' and 'panmove'\n\n\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) {\n // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n } // panend and pancancel\n\n\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function tryEmit(input) {\n if (this.canEmit()) {\n return this.emit(input);\n } // it's failing anyway\n\n\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function canEmit() {\n var i = 0;\n\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n\n i++;\n }\n\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing?\n\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n } // reset when we've reached the end\n\n\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone); // the recognizer has recognized a gesture\n // so trigger an event\n\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function process(inputData) {},\n // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function getTouchAction() {},\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function reset() {}\n };\n /**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\n\n function stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n\n return '';\n }\n /**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\n\n\n function directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n\n return '';\n }\n /**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\n\n\n function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n\n if (manager) {\n return manager.get(otherRecognizer);\n }\n\n return otherRecognizer;\n }\n /**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\n\n\n function AttrRecognizer() {\n Recognizer.apply(this, arguments);\n }\n\n inherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function attrTest(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function process(input) {\n var state = this.state;\n var eventType = input.eventType;\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED\n\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n\n return state | STATE_CHANGED;\n }\n\n return STATE_FAILED;\n }\n });\n /**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n this.pX = null;\n this.pY = null;\n }\n\n inherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n getTouchAction: function getTouchAction() {\n var direction = this.options.direction;\n var actions = [];\n\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n\n return actions;\n },\n directionTest: function directionTest(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY; // lock to axis?\n\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n attrTest: function attrTest(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n },\n emit: function emit(input) {\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n emit: function emit(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\n\n function PressRecognizer() {\n Recognizer.apply(this, arguments);\n this._timer = null;\n this._input = null;\n }\n\n inherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251,\n // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_AUTO];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n this._input = input; // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && input.eventType & INPUT_END) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n });\n /**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n getTouchAction: function getTouchAction() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n attrTest: function attrTest(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n emit: function emit(input) {\n var direction = directionStr(input.offsetDirection);\n\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n });\n /**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\n\n function TapRecognizer() {\n Recognizer.apply(this, arguments); // previous time and center,\n // used for tap counting\n\n this.pTime = false;\n this.pCenter = false;\n this._timer = null;\n this._input = null;\n this.count = 0;\n }\n\n inherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300,\n // max time between the multi-tap taps\n time: 250,\n // max time of the pointer to be down (like finger on the screen)\n threshold: 9,\n // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n this.reset();\n\n if (input.eventType & INPUT_START && this.count === 0) {\n return this.failTimeout();\n } // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input; // if tap count matches we have recognized it,\n // else it has began recognizing...\n\n var tapCount = this.count % options.taps;\n\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n\n return STATE_FAILED;\n },\n failTimeout: function failTimeout() {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n }\n /**\n * @const {string}\n */\n\n\n Hammer.VERSION = '2.0.7';\n /**\n * default settings\n * @namespace\n */\n\n Hammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {\n enable: false\n }], [PinchRecognizer, {\n enable: false\n }, ['rotate']], [SwipeRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }], [PanRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }, ['swipe']], [TapRecognizer], [TapRecognizer, {\n event: 'doubletap',\n taps: 2\n }, ['tap']], [PressRecognizer]],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n };\n var STOP = 1;\n var FORCED_STOP = 2;\n /**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n this.options.inputTarget = this.options.inputTarget || element;\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n toggleCssProps(this, true);\n each(this.options.recognizers, function (item) {\n var recognizer = this.add(new item[0](item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n }\n\n Manager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function set(options) {\n assign(this.options, options); // Options that need a little more setup\n\n if (options.touchAction) {\n this.touchAction.update();\n }\n\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function stop(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n var session = this.session;\n\n if (session.stopped) {\n return;\n } // run the touch-action polyfill\n\n\n this.touchAction.preventDefaults(inputData);\n var recognizer;\n var recognizers = this.recognizers; // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n\n var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized\n // or when we're in a new session\n\n if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n\n while (i < recognizers.length) {\n recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) {\n // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n\n\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function get(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function add(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n } // remove existing\n\n\n var existing = this.get(recognizer.options.event);\n\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function remove(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer); // let's make sure this recognizer exists\n\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function on(events, handler) {\n if (events === undefined) {\n return;\n }\n\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function off(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function emit(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n } // no handlers, so skip it all\n\n\n var handlers = this.handlers[event] && this.handlers[event].slice();\n\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n\n data.preventDefault = function () {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function destroy() {\n this.element && toggleCssProps(this, false);\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n };\n /**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\n\n function toggleCssProps(manager, add) {\n var element = manager.element;\n\n if (!element.style) {\n return;\n }\n\n var prop;\n each(manager.options.cssProps, function (value, name) {\n prop = prefixed(element.style, name);\n\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n\n if (!add) {\n manager.oldCssProps = {};\n }\n }\n /**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\n\n\n function triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n }\n\n assign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n }); // this prevents errors when Hammer is loaded in the presence of an AMD\n // style loader but by script tag, not by the loader.\n\n var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line\n\n freeGlobal.Hammer = Hammer;\n\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return Hammer;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n})(window, document, 'Hammer');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9oYW1tZXJqcy9oYW1tZXIuanM/ZWJmYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMklBQTJJLFVBQVU7QUFDcko7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFVBQVU7QUFDdkIsZUFBZSxPQUFPO0FBQ3RCOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QiwwQkFBMEI7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEs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QUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQSxvR0FBb0c7O0FBRXBHOztBQUVBLE1BQU0sSUFBMEM7QUFDaEQsSUFBSSxtQ0FBTztBQUNYO0FBQ0EsS0FBSztBQUFBLGtHQUFDO0FBQ04sR0FBRyxNQUFNLEVBSU47QUFDSCxDQUFDIiwiZmlsZSI6IjUwODcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgSGFtbWVyLkpTIC0gdjIuMC43IC0gMjAxNi0wNC0yMlxuICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyO1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xuICB2YXIgVEVTVF9FTEVNRU5UID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBUWVBFX0ZVTkNUSU9OID0gJ2Z1bmN0aW9uJztcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbiAgdmFyIGFicyA9IE1hdGguYWJzO1xuICB2YXIgbm93ID0gRGF0ZS5ub3c7XG4gIC8qKlxuICAgKiBzZXQgYSB0aW1lb3V0IHdpdGggYSBnaXZlbiBzY29wZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBmdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xuICB9XG4gIC8qKlxuICAgKiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgZm4gb24gZWFjaCBlbnRyeVxuICAgKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAgICogdGhpcyBpcyB1c2VkIGJ5IGFsbCB0aGUgbWV0aG9kcyB0aGF0IGFjY2VwdCBhIHNpbmdsZSBhbmQgYXJyYXkgYXJndW1lbnQuXG4gICAqIEBwYXJhbSB7KnxBcnJheX0gYXJnXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBlYWNoKGFyZywgY29udGV4dFtmbl0sIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiB3YWxrIG9iamVjdHMgYW5kIGFycmF5c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvYmouZm9yRWFjaCkge1xuICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCBvYmoubGVuZ3RoKSB7XG4gICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogd3JhcCBhIG1ldGhvZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgc3RhY2sgdHJhY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgdGhlIHN1cHBsaWVkIG1ldGhvZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJykucmVwbGFjZSgvXlxccythdFxccysvZ20sICcnKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSwgJ3thbm9ueW1vdXN9KClAJykgOiAnVW5rbm93biBTdGFjayBUcmFjZSc7XG4gICAgICB2YXIgbG9nID0gd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLndhcm4gfHwgd2luZG93LmNvbnNvbGUubG9nKTtcblxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBleHRlbmQgb2JqZWN0LlxuICAgKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0c190b19hc3NpZ25cbiAgICogQHJldHVybnMge09iamVjdH0gdGFyZ2V0XG4gICAqL1xuXG5cbiAgdmFyIGFzc2lnbjtcblxuICBpZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0KSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShuZXh0S2V5KSkge1xuICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuICB9XG4gIC8qKlxuICAgKiBleHRlbmQgb2JqZWN0LlxuICAgKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgKi9cblxuXG4gIHZhciBleHRlbmQgPSBkZXByZWNhdGUoZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNyYyk7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKCFtZXJnZSB8fCBtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVzdFtrZXlzW2ldXSA9IHNyY1trZXlzW2ldXTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcbiAgLyoqXG4gICAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gICAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyB0aGF0IGV4aXN0IGluIGRlc3Qgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgc3JjXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgKi9cblxuICB2YXIgbWVyZ2UgPSBkZXByZWNhdGUoZnVuY3Rpb24gbWVyZ2UoZGVzdCwgc3JjKSB7XG4gICAgcmV0dXJuIGV4dGVuZChkZXN0LCBzcmMsIHRydWUpO1xuICB9LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuICAvKipcbiAgICogc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNoaWxkXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXVxuICAgKi9cblxuICBmdW5jdGlvbiBpbmhlcml0KGNoaWxkLCBiYXNlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGJhc2VQID0gYmFzZS5wcm90b3R5cGUsXG4gICAgICAgIGNoaWxkUDtcbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgYXNzaWduKGNoaWxkUCwgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBzaW1wbGUgZnVuY3Rpb24gYmluZFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gYmluZEZuKGZuLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5kRm4oKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICAgKiB0aGlzIGZpcnN0IGl0ZW0gaW4gYXJncyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufEZ1bmN0aW9ufSB2YWxcbiAgICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGJvb2xPckZuKHZhbCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgdmFsID09IFRZUEVfRlVOQ1RJT04pIHtcbiAgICAgIHJldHVybiB2YWwuYXBwbHkoYXJncyA/IGFyZ3NbMF0gfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIC8qKlxuICAgKiB1c2UgdGhlIHZhbDIgd2hlbiB2YWwxIGlzIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0geyp9IHZhbDFcbiAgICogQHBhcmFtIHsqfSB2YWwyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlmVW5kZWZpbmVkKHZhbDEsIHZhbDIpIHtcbiAgICByZXR1cm4gdmFsMSA9PT0gdW5kZWZpbmVkID8gdmFsMiA6IHZhbDE7XG4gIH1cbiAgLyoqXG4gICAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBub2RlIGlzIGluIHRoZSBnaXZlbiBwYXJlbnRcbiAgICogQG1ldGhvZCBoYXNQYXJlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG5cblxuICBmdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGluU3RyKHN0ciwgZmluZCkge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xuICB9XG4gIC8qKlxuICAgKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gd29yZHNcbiAgICovXG5cblxuICBmdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbiAgfVxuICAvKipcbiAgICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5RmlsbFxuICAgKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtmaW5kQnlLZXldXG4gICAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICAgIGlmIChzcmMuaW5kZXhPZiAmJiAhZmluZEJ5S2V5KSB7XG4gICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCBzcmMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCB8fCAhZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBjb252ZXJ0IGFycmF5LWxpa2Ugb2JqZWN0cyB0byByZWFsIGFycmF5c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG5cblxuICBmdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xuICB9XG4gIC8qKlxuICAgKiB1bmlxdWUgYXJyYXkgd2l0aCBvYmplY3RzIGJhc2VkIG9uIGEga2V5IChsaWtlICdpZCcpIG9yIGp1c3QgYnkgdGhlIGFycmF5J3MgdmFsdWVcbiAgICogQHBhcmFtIHtBcnJheX0gc3JjIFt7aWQ6MX0se2lkOjJ9LHtpZDoxfV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NvcnQ9RmFsc2VdXG4gICAqIEByZXR1cm5zIHtBcnJheX0gW3tpZDoxfSx7aWQ6Mn1dXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgIHZhciB2YWwgPSBrZXkgPyBzcmNbaV1ba2V5XSA6IHNyY1tpXTtcblxuICAgICAgaWYgKGluQXJyYXkodmFsdWVzLCB2YWwpIDwgMCkge1xuICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWVzW2ldID0gdmFsO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KGZ1bmN0aW9uIHNvcnRVbmlxdWVBcnJheShhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGFba2V5XSA+IGJba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcHJlZml4ZWQob2JqLCBwcm9wZXJ0eSkge1xuICAgIHZhciBwcmVmaXgsIHByb3A7XG4gICAgdmFyIGNhbWVsUHJvcCA9IHByb3BlcnR5WzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgIHByb3AgPSBwcmVmaXggPyBwcmVmaXggKyBjYW1lbFByb3AgOiBwcm9wZXJ0eTtcblxuICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogZ2V0IGEgdW5pcXVlIGlkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHVuaXF1ZUlkXG4gICAqL1xuXG5cbiAgdmFyIF91bmlxdWVJZCA9IDE7XG5cbiAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIF91bmlxdWVJZCsrO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtEb2N1bWVudFZpZXd8V2luZG93fVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3cgfHwgd2luZG93O1xuICB9XG5cbiAgdmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcbiAgdmFyIFNVUFBPUlRfVE9VQ0ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcbiAgdmFyIFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMgPSBwcmVmaXhlZCh3aW5kb3csICdQb2ludGVyRXZlbnQnKSAhPT0gdW5kZWZpbmVkO1xuICB2YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgdmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xuICB2YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbiAgdmFyIElOUFVUX1RZUEVfTU9VU0UgPSAnbW91c2UnO1xuICB2YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcbiAgdmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcbiAgdmFyIElOUFVUX1NUQVJUID0gMTtcbiAgdmFyIElOUFVUX01PVkUgPSAyO1xuICB2YXIgSU5QVVRfRU5EID0gNDtcbiAgdmFyIElOUFVUX0NBTkNFTCA9IDg7XG4gIHZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG4gIHZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG4gIHZhciBESVJFQ1RJT05fUklHSFQgPSA0O1xuICB2YXIgRElSRUNUSU9OX1VQID0gODtcbiAgdmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG4gIHZhciBESVJFQ1RJT05fSE9SSVpPTlRBTCA9IERJUkVDVElPTl9MRUZUIHwgRElSRUNUSU9OX1JJR0hUO1xuICB2YXIgRElSRUNUSU9OX1ZFUlRJQ0FMID0gRElSRUNUSU9OX1VQIHwgRElSRUNUSU9OX0RPV047XG4gIHZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG4gIHZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG4gIHZhciBQUk9QU19DTElFTlRfWFkgPSBbJ2NsaWVudFgnLCAnY2xpZW50WSddO1xuICAvKipcbiAgICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtJbnB1dH1cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDsgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuXG4gICAgdGhpcy5kb21IYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIElucHV0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSBpbnB1dEV2ZW50IGRhdGEgYW5kIHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgdGhpcy5ldlRhcmdldCAmJiBhZGRFdmVudExpc3RlbmVycyh0aGlzLnRhcmdldCwgdGhpcy5ldlRhcmdldCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgIHRoaXMuZXZXaW4gJiYgYWRkRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgdGhpcy5ldldpbiAmJiByZW1vdmVFdmVudExpc3RlbmVycyhnZXRXaW5kb3dGb3JFbGVtZW50KHRoaXMuZWxlbWVudCksIHRoaXMuZXZXaW4sIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAgICogY2FsbGVkIGJ5IHRoZSBNYW5hZ2VyIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gICAqIEByZXR1cm5zIHtJbnB1dH1cbiAgICovXG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gICAgdmFyIFR5cGU7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRDbGFzcztcblxuICAgIGlmIChpbnB1dENsYXNzKSB7XG4gICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgIFR5cGUgPSBQb2ludGVyRXZlbnRJbnB1dDtcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfT05MWV9UT1VDSCkge1xuICAgICAgVHlwZSA9IFRvdWNoSW5wdXQ7XG4gICAgfSBlbHNlIGlmICghU1VQUE9SVF9UT1VDSCkge1xuICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFR5cGUgPSBUb3VjaE1vdXNlSW5wdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUeXBlKG1hbmFnZXIsIGlucHV0SGFuZGxlcik7XG4gIH1cbiAgLyoqXG4gICAqIGhhbmRsZSBpbnB1dCBldmVudHNcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5wdXRIYW5kbGVyKG1hbmFnZXIsIGV2ZW50VHlwZSwgaW5wdXQpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW4gPSBpbnB1dC5wb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGNoYW5nZWRQb2ludGVyc0xlbiA9IGlucHV0LmNoYW5nZWRQb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGlzRmlyc3QgPSBldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMDtcbiAgICB2YXIgaXNGaW5hbCA9IGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHBvaW50ZXJzTGVuIC0gY2hhbmdlZFBvaW50ZXJzTGVuID09PSAwO1xuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICBtYW5hZ2VyLnNlc3Npb24gPSB7fTtcbiAgICB9IC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG5cblxuICAgIGlucHV0LmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG5cbiAgICBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KTsgLy8gZW1pdCBzZWNyZXQgZXZlbnRcblxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuICAgIG1hbmFnZXIucmVjb2duaXplKGlucHV0KTtcbiAgICBtYW5hZ2VyLnNlc3Npb24ucHJldklucHV0ID0gaW5wdXQ7XG4gIH1cbiAgLyoqXG4gICAqIGV4dGVuZCB0aGUgZGF0YSB3aXRoIHNvbWUgdXNhYmxlIHByb3BlcnRpZXMgbGlrZSBzY2FsZSwgcm90YXRlLCB2ZWxvY2l0eSBldGNcbiAgICogQHBhcmFtIHtPYmplY3R9IG1hbmFnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCkge1xuICAgIHZhciBzZXNzaW9uID0gbWFuYWdlci5zZXNzaW9uO1xuICAgIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDsgLy8gc3RvcmUgdGhlIGZpcnN0IGlucHV0IHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYW5kIGRpcmVjdGlvblxuXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgIHNlc3Npb24uZmlyc3RJbnB1dCA9IHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KTtcbiAgICB9IC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcblxuXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID4gMSAmJiAhc2Vzc2lvbi5maXJzdE11bHRpcGxlKSB7XG4gICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXIgPSBnZXRDZW50ZXIocG9pbnRlcnMpO1xuICAgIGlucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgIGlucHV0LmRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGZpcnN0SW5wdXQudGltZVN0YW1wO1xuICAgIGlucHV0LmFuZ2xlID0gZ2V0QW5nbGUob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGlucHV0LmRpc3RhbmNlID0gZ2V0RGlzdGFuY2Uob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIHZhciBvdmVyYWxsVmVsb2NpdHkgPSBnZXRWZWxvY2l0eShpbnB1dC5kZWx0YVRpbWUsIGlucHV0LmRlbHRhWCwgaW5wdXQuZGVsdGFZKTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYID0gb3ZlcmFsbFZlbG9jaXR5Lng7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WSA9IG92ZXJhbGxWZWxvY2l0eS55O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eSA9IGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpID8gb3ZlcmFsbFZlbG9jaXR5LnggOiBvdmVyYWxsVmVsb2NpdHkueTtcbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG4gICAgaW5wdXQubWF4UG9pbnRlcnMgPSAhc2Vzc2lvbi5wcmV2SW5wdXQgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiBpbnB1dC5wb2ludGVycy5sZW5ndGggPiBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycyA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6IHNlc3Npb24ucHJldklucHV0Lm1heFBvaW50ZXJzO1xuICAgIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCk7IC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG5cbiAgICB2YXIgdGFyZ2V0ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gICAgaWYgKGhhc1BhcmVudChpbnB1dC5zcmNFdmVudC50YXJnZXQsIHRhcmdldCkpIHtcbiAgICAgIHRhcmdldCA9IGlucHV0LnNyY0V2ZW50LnRhcmdldDtcbiAgICB9XG5cbiAgICBpbnB1dC50YXJnZXQgPSB0YXJnZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG4gICAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2SW5wdXQgPSBzZXNzaW9uLnByZXZJbnB1dCB8fCB7fTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgIHg6IHByZXZJbnB1dC5kZWx0YVggfHwgMCxcbiAgICAgICAgeTogcHJldklucHV0LmRlbHRhWSB8fCAwXG4gICAgICB9O1xuICAgICAgb2Zmc2V0ID0gc2Vzc2lvbi5vZmZzZXREZWx0YSA9IHtcbiAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgIHk6IGNlbnRlci55XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xuICB9XG4gIC8qKlxuICAgKiB2ZWxvY2l0eSBpcyBjYWxjdWxhdGVkIGV2ZXJ5IHggbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KSB7XG4gICAgdmFyIGxhc3QgPSBzZXNzaW9uLmxhc3RJbnRlcnZhbCB8fCBpbnB1dCxcbiAgICAgICAgZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gbGFzdC50aW1lU3RhbXAsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICB2ZWxvY2l0eVgsXG4gICAgICAgIHZlbG9jaXR5WSxcbiAgICAgICAgZGlyZWN0aW9uO1xuXG4gICAgaWYgKGlucHV0LmV2ZW50VHlwZSAhPSBJTlBVVF9DQU5DRUwgJiYgKGRlbHRhVGltZSA+IENPTVBVVEVfSU5URVJWQUwgfHwgbGFzdC52ZWxvY2l0eSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgdmFyIGRlbHRhWCA9IGlucHV0LmRlbHRhWCAtIGxhc3QuZGVsdGFYO1xuICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuICAgICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgIHZlbG9jaXR5WSA9IHYueTtcbiAgICAgIHZlbG9jaXR5ID0gYWJzKHYueCkgPiBhYnModi55KSA/IHYueCA6IHYueTtcbiAgICAgIGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1c2UgbGF0ZXN0IHZlbG9jaXR5IGluZm8gaWYgaXQgZG9lc24ndCBvdmVydGFrZSBhIG1pbmltdW0gcGVyaW9kXG4gICAgICB2ZWxvY2l0eSA9IGxhc3QudmVsb2NpdHk7XG4gICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgIHZlbG9jaXR5WSA9IGxhc3QudmVsb2NpdHlZO1xuICAgICAgZGlyZWN0aW9uID0gbGFzdC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaW5wdXQudmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICBpbnB1dC52ZWxvY2l0eVggPSB2ZWxvY2l0eVg7XG4gICAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgfVxuICAvKipcbiAgICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICogQHJldHVybnMge09iamVjdH0gY2xvbmVkSW5wdXREYXRhXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgICBjbGllbnRZOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRZKVxuICAgICAgfTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVN0YW1wOiBub3coKSxcbiAgICAgIHBvaW50ZXJzOiBwb2ludGVycyxcbiAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgIGRlbHRhWDogaW5wdXQuZGVsdGFYLFxuICAgICAgZGVsdGFZOiBpbnB1dC5kZWx0YVlcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBvaW50ZXJzXG4gICAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGB4YCBhbmQgYHlgIHByb3BlcnRpZXNcbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7IC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG5cbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFgpLFxuICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgIHggKz0gcG9pbnRlcnNbaV0uY2xpZW50WDtcbiAgICAgIHkgKz0gcG9pbnRlcnNbaV0uY2xpZW50WTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogcm91bmQoeCAvIHBvaW50ZXJzTGVuZ3RoKSxcbiAgICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybiB7TnVtYmVyfSBkaXJlY3Rpb25cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICByZXR1cm4gRElSRUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgaWYgKGFicyh4KSA+PSBhYnMoeSkpIHtcbiAgICAgIHJldHVybiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cblxuICAgIHJldHVybiB5IDwgMCA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICB9XG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gcDEge3gsIHl9XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuXG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG4gICAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gcDFcbiAgICogQHBhcmFtIHtPYmplY3R9IHAyXG4gICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldEFuZ2xlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cblxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXRBbmdsZShlbmRbMV0sIGVuZFswXSwgUFJPUFNfQ0xJRU5UX1hZKSArIGdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAgICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0U2NhbGUoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShlbmRbMF0sIGVuZFsxXSwgUFJPUFNfQ0xJRU5UX1hZKSAvIGdldERpc3RhbmNlKHN0YXJ0WzBdLCBzdGFydFsxXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbiAgfVxuXG4gIHZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gICAgbW91c2Vkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gICAgbW91c2V1cDogSU5QVVRfRU5EXG4gIH07XG4gIHZhciBNT1VTRV9FTEVNRU5UX0VWRU5UUyA9ICdtb3VzZWRvd24nO1xuICB2YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG4gIC8qKlxuICAgKiBNb3VzZSBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG4gICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7IC8vIG1vdXNlZG93biBzdGF0ZVxuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGluaGVyaXQoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTUVoYW5kbGVyKGV2KSB7XG4gICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBvbiBzdGFydCB3ZSB3YW50IHRvIGhhdmUgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGRvd25cblxuICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIGV2LmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCAhPT0gMSkge1xuICAgICAgICBldmVudFR5cGUgPSBJTlBVVF9FTkQ7XG4gICAgICB9IC8vIG1vdXNlIG11c3QgYmUgZG93blxuXG5cbiAgICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIGV2ZW50VHlwZSwge1xuICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB2YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbiAgfTsgLy8gaW4gSUUxMCB0aGUgcG9pbnRlciB0eXBlcyBpcyBkZWZpbmVkIGFzIGFuIGVudW1cblxuICB2YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG5cbiAgfTtcbiAgdmFyIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAncG9pbnRlcmRvd24nO1xuICB2YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJzsgLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5cbiAgaWYgKHdpbmRvdy5NU1BvaW50ZXJFdmVudCAmJiAhd2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAnTVNQb2ludGVyRG93bic7XG4gICAgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ01TUG9pbnRlck1vdmUgTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsJztcbiAgfVxuICAvKipcbiAgICogUG9pbnRlciBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gUE9JTlRFUl9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5zdG9yZSA9IHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXTtcbiAgfVxuXG4gIGluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICAgIHZhciByZW1vdmVQb2ludGVyID0gZmFsc2U7XG4gICAgICB2YXIgZXZlbnRUeXBlTm9ybWFsaXplZCA9IGV2LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdtcycsICcnKTtcbiAgICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuICAgICAgdmFyIGlzVG91Y2ggPSBwb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIOyAvLyBnZXQgaW5kZXggb2YgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG4gICAgICB2YXIgc3RvcmVJbmRleCA9IGluQXJyYXkoc3RvcmUsIGV2LnBvaW50ZXJJZCwgJ3BvaW50ZXJJZCcpOyAvLyBzdGFydCBhbmQgbW91c2UgbXVzdCBiZSBkb3duXG5cbiAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAoZXYuYnV0dG9uID09PSAwIHx8IGlzVG91Y2gpKSB7XG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgIHN0b3JlLnB1c2goZXYpO1xuICAgICAgICAgIHN0b3JlSW5kZXggPSBzdG9yZS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgfSAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcblxuXG4gICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG5cbiAgICAgIHN0b3JlW3N0b3JlSW5kZXhdID0gZXY7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZW1vdmVQb2ludGVyKSB7XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICBzdG9yZS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIFNJTkdMRV9UT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxuICB9O1xuICB2YXIgU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCc7XG4gIHZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4gIC8qKlxuICAgKiBUb3VjaCBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChTaW5nbGVUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRFaGFuZGxlcihldikge1xuICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBzaG91bGQgd2UgaGFuZGxlIHRoZSB0b3VjaCBldmVudHM/XG5cbiAgICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTsgLy8gd2hlbiBkb25lLCByZXNldCB0aGUgc3RhcnRlZCBzdGF0ZVxuXG4gICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHRvdWNoZXNbMF0ubGVuZ3RoIC0gdG91Y2hlc1sxXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAgICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAgICovXG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBhbGwgPSB1bmlxdWVBcnJheShhbGwuY29uY2F0KGNoYW5nZWQpLCAnaWRlbnRpZmllcicsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBbYWxsLCBjaGFuZ2VkXTtcbiAgfVxuXG4gIHZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxuICB9O1xuICB2YXIgVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4gIC8qKlxuICAgKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgSW5wdXRcbiAgICovXG5cbiAgZnVuY3Rpb24gVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gVE9VQ0hfVEFSR0VUX0VWRU5UUztcbiAgICB0aGlzLnRhcmdldElkcyA9IHt9O1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBpbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgdmFyIHR5cGUgPSBUT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG4gICAgICB2YXIgdG91Y2hlcyA9IGdldFRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG5cbiAgICAgIGlmICghdG91Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAgICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAgICovXG5cbiAgZnVuY3Rpb24gZ2V0VG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGxUb3VjaGVzID0gdG9BcnJheShldi50b3VjaGVzKTtcbiAgICB2YXIgdGFyZ2V0SWRzID0gdGhpcy50YXJnZXRJZHM7IC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICByZXR1cm4gW2FsbFRvdWNoZXMsIGFsbFRvdWNoZXNdO1xuICAgIH1cblxuICAgIHZhciBpLFxuICAgICAgICB0YXJnZXRUb3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlcyA9IHRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpLFxuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyA9IFtdLFxuICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldDsgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuXG4gICAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uICh0b3VjaCkge1xuICAgICAgcmV0dXJuIGhhc1BhcmVudCh0b3VjaC50YXJnZXQsIHRhcmdldCk7XG4gICAgfSk7IC8vIGNvbGxlY3QgdG91Y2hlc1xuXG4gICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IC8vIGZpbHRlciBjaGFuZ2VkIHRvdWNoZXMgdG8gb25seSBjb250YWluIHRvdWNoZXMgdGhhdCBleGlzdCBpbiB0aGUgY29sbGVjdGVkIHRhcmdldCBpZHNcblxuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGNoYW5nZWRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5wdXNoKGNoYW5nZWRUb3VjaGVzW2ldKTtcbiAgICAgIH0gLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcblxuXG4gICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGRlbGV0ZSB0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWRUYXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbLy8gbWVyZ2UgdGFyZ2V0VG91Y2hlcyB3aXRoIGNoYW5nZWRUYXJnZXRUb3VjaGVzIHNvIGl0IGNvbnRhaW5zIEFMTCB0b3VjaGVzLCBpbmNsdWRpbmcgJ2VuZCcgYW5kICdjYW5jZWwnXG4gICAgdW5pcXVlQXJyYXkodGFyZ2V0VG91Y2hlcy5jb25jYXQoY2hhbmdlZFRhcmdldFRvdWNoZXMpLCAnaWRlbnRpZmllcicsIHRydWUpLCBjaGFuZ2VkVGFyZ2V0VG91Y2hlc107XG4gIH1cbiAgLyoqXG4gICAqIENvbWJpbmVkIHRvdWNoIGFuZCBtb3VzZSBpbnB1dFxuICAgKlxuICAgKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAgICogVGhpcyBiZWNhdXNlIHRvdWNoIGRldmljZXMgYWxzbyBlbWl0IG1vdXNlIGV2ZW50cyB3aGlsZSBkb2luZyBhIHRvdWNoLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgSW5wdXRcbiAgICovXG5cblxuICB2YXIgREVEVVBfVElNRU9VVCA9IDI1MDA7XG4gIHZhciBERURVUF9ESVNUQU5DRSA9IDI1O1xuXG4gIGZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBoYW5kbGVyID0gYmluZEZuKHRoaXMuaGFuZGxlciwgdGhpcyk7XG4gICAgdGhpcy50b3VjaCA9IG5ldyBUb3VjaElucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5tb3VzZSA9IG5ldyBNb3VzZUlucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgIHRoaXMubGFzdFRvdWNoZXMgPSBbXTtcbiAgfVxuXG4gIGluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgdmFyIGlzVG91Y2ggPSBpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICBpc01vdXNlID0gaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfTU9VU0U7XG5cbiAgICAgIGlmIChpc01vdXNlICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcblxuXG4gICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICByZWNvcmRUb3VjaGVzLmNhbGwodGhpcywgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgaW5wdXREYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy50b3VjaC5kZXN0cm95KCk7XG4gICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgIHRoaXMucHJpbWFyeVRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyO1xuICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldExhc3RUb3VjaChldmVudERhdGEpIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdO1xuXG4gICAgaWYgKHRvdWNoLmlkZW50aWZpZXIgPT09IHRoaXMucHJpbWFyeVRvdWNoKSB7XG4gICAgICB2YXIgbGFzdFRvdWNoID0ge1xuICAgICAgICB4OiB0b3VjaC5jbGllbnRYLFxuICAgICAgICB5OiB0b3VjaC5jbGllbnRZXG4gICAgICB9O1xuICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICB2YXIgbHRzID0gdGhpcy5sYXN0VG91Y2hlcztcblxuICAgICAgdmFyIHJlbW92ZUxhc3RUb3VjaCA9IGZ1bmN0aW9uIHJlbW92ZUxhc3RUb3VjaCgpIHtcbiAgICAgICAgdmFyIGkgPSBsdHMuaW5kZXhPZihsYXN0VG91Y2gpO1xuXG4gICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLFxuICAgICAgICB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgIHZhciBkeCA9IE1hdGguYWJzKHggLSB0LngpLFxuICAgICAgICAgIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG5cbiAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbiAgdmFyIE5BVElWRV9UT1VDSF9BQ1RJT04gPSBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gIT09IHVuZGVmaW5lZDsgLy8gbWFnaWNhbCB0b3VjaEFjdGlvbiB2YWx1ZVxuXG4gIHZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbiAgdmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xuICB2YXIgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTiA9ICdtYW5pcHVsYXRpb24nOyAvLyBub3QgaW1wbGVtZW50ZWRcblxuICB2YXIgVE9VQ0hfQUNUSU9OX05PTkUgPSAnbm9uZSc7XG4gIHZhciBUT1VDSF9BQ1RJT05fUEFOX1ggPSAncGFuLXgnO1xuICB2YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbiAgdmFyIFRPVUNIX0FDVElPTl9NQVAgPSBnZXRUb3VjaEFjdGlvblByb3BzKCk7XG4gIC8qKlxuICAgKiBUb3VjaCBBY3Rpb25cbiAgICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG5cbiAgZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIFRvdWNoQWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlIG9uIHRoZSBlbGVtZW50IG9yIGVuYWJsZSB0aGUgcG9seWZpbGxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGlmICh2YWx1ZSA9PSBUT1VDSF9BQ1RJT05fQ09NUFVURSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtQUkVGSVhFRF9UT1VDSF9BQ1RJT05dID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBqdXN0IHJlLXNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY29tcHV0ZSB0aGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcmVjb2duaXplcidzIHNldHRpbmdzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBjb21wdXRlOiBmdW5jdGlvbiBjb21wdXRlKCkge1xuICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgIGVhY2godGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLCBmdW5jdGlvbiAocmVjb2duaXplcikge1xuICAgICAgICBpZiAoYm9vbE9yRm4ocmVjb2duaXplci5vcHRpb25zLmVuYWJsZSwgW3JlY29nbml6ZXJdKSkge1xuICAgICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24gcHJldmVudERlZmF1bHRzKGlucHV0KSB7XG4gICAgICB2YXIgc3JjRXZlbnQgPSBpbnB1dC5zcmNFdmVudDtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247IC8vIGlmIHRoZSB0b3VjaCBhY3Rpb24gZGlkIHByZXZlbnRlZCBvbmNlIHRoaXMgc2Vzc2lvblxuXG4gICAgICBpZiAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKSB7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7XG4gICAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1hdO1xuXG4gICAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgICAvL2RvIG5vdCBwcmV2ZW50IGRlZmF1bHRzIGlmIHRoaXMgaXMgYSB0YXAgZ2VzdHVyZVxuICAgICAgICB2YXIgaXNUYXBQb2ludGVyID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSAxO1xuICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgdmFyIGlzVGFwVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgMjUwO1xuXG4gICAgICAgIGlmIChpc1RhcFBvaW50ZXIgJiYgaXNUYXBNb3ZlbWVudCAmJiBpc1RhcFRvdWNoVGltZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgIC8vIGBwYW4teCBwYW4teWAgbWVhbnMgYnJvd3NlciBoYW5kbGVzIGFsbCBzY3JvbGxpbmcvcGFubmluZywgZG8gbm90IHByZXZlbnRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzTm9uZSB8fCBoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMIHx8IGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZlbnRTcmMoc3JjRXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yIChzY3JvbGxpbmcgaW4gbW9zdCBjYXNlcylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICAgKi9cbiAgICBwcmV2ZW50U3JjOiBmdW5jdGlvbiBwcmV2ZW50U3JjKHNyY0V2ZW50KSB7XG4gICAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiB3aGVuIHRoZSB0b3VjaEFjdGlvbnMgYXJlIGNvbGxlY3RlZCB0aGV5IGFyZSBub3QgYSB2YWxpZCB2YWx1ZSwgc28gd2UgbmVlZCB0byBjbGVhbiB0aGluZ3MgdXAuICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICAvLyBub25lXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7IC8vIGlmIGJvdGggcGFuLXggYW5kIHBhbi15IGFyZSBzZXQgKGRpZmZlcmVudCByZWNvZ25pemVyc1xuICAgIC8vIGZvciBkaWZmZXJlbnQgZGlyZWN0aW9ucywgZS5nLiBob3Jpem9udGFsIHBhbiBidXQgdmVydGljYWwgc3dpcGU/KVxuICAgIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAgIC8vIHJlY29nbml6ZXJzIHdpbGwgd29yaywgc2luY2UgdGhlIGJyb3dzZXIgd291bGQgaGFuZGxlIGFsbCBwYW5uaW5nXG5cbiAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfSAvLyBwYW4teCBPUiBwYW4teVxuXG5cbiAgICBpZiAoaGFzUGFuWCB8fCBoYXNQYW5ZKSB7XG4gICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9IC8vIG1hbmlwdWxhdGlvblxuXG5cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OO1xuICAgIH1cblxuICAgIHJldHVybiBUT1VDSF9BQ1RJT05fQVVUTztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uUHJvcHMoKSB7XG4gICAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHRvdWNoTWFwID0ge307XG4gICAgdmFyIGNzc1N1cHBvcnRzID0gd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLnN1cHBvcnRzO1xuICAgIFsnYXV0bycsICdtYW5pcHVsYXRpb24nLCAncGFuLXknLCAncGFuLXgnLCAncGFuLXggcGFuLXknLCAnbm9uZSddLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICB0b3VjaE1hcFt2YWxdID0gY3NzU3VwcG9ydHMgPyB3aW5kb3cuQ1NTLnN1cHBvcnRzKCd0b3VjaC1hY3Rpb24nLCB2YWwpIDogdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hNYXA7XG4gIH1cbiAgLyoqXG4gICAqIFJlY29nbml6ZXIgZmxvdyBleHBsYWluZWQ7ICpcbiAgICogQWxsIHJlY29nbml6ZXJzIGhhdmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgUE9TU0lCTEUgd2hlbiBhIGlucHV0IHNlc3Npb24gc3RhcnRzLlxuICAgKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAgICogRXhhbXBsZSBzZXNzaW9uIGZvciBtb3VzZS1pbnB1dDogbW91c2Vkb3duIC0+IG1vdXNlbW92ZSAtPiBtb3VzZXVwXG4gICAqXG4gICAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAgICogd2hpY2ggZGV0ZXJtaW5lcyB3aXRoIHN0YXRlIGl0IHNob3VsZCBiZS5cbiAgICpcbiAgICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICAgKiBQT1NTSUJMRSB0byBnaXZlIGl0IGFub3RoZXIgY2hhbmdlIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICAgKlxuICAgKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gICAqICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogICAgICArLS0tLS0rLS0tLS0rICAgICAgICAgICAgICAgfFxuICAgKiAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICB8XG4gICAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLStcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHxcbiAgICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRlZC9SZWNvZ25pemVkXG4gICAqL1xuXG5cbiAgdmFyIFNUQVRFX1BPU1NJQkxFID0gMTtcbiAgdmFyIFNUQVRFX0JFR0FOID0gMjtcbiAgdmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xuICB2YXIgU1RBVEVfRU5ERUQgPSA4O1xuICB2YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xuICB2YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG4gIHZhciBTVEFURV9GQUlMRUQgPSAzMjtcbiAgLyoqXG4gICAqIFJlY29nbml6ZXJcbiAgICogRXZlcnkgcmVjb2duaXplciBuZWVkcyB0byBleHRlbmQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cbiAgZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsOyAvLyBkZWZhdWx0IGlzIGVuYWJsZSB0cnVlXG5cbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgIHRoaXMuc2ltdWx0YW5lb3VzID0ge307XG4gICAgdGhpcy5yZXF1aXJlRmFpbCA9IFtdO1xuICB9XG5cbiAgUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KG9wdGlvbnMpIHtcbiAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOyAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuXG4gICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlY29nbml6ZSBzaW11bHRhbmVvdXMgd2l0aCBhbiBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICByZWNvZ25pemVXaXRoOiBmdW5jdGlvbiByZWNvZ25pemVXaXRoKG90aGVyUmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIHNpbXVsdGFuZW91cyA9IHRoaXMuc2ltdWx0YW5lb3VzO1xuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgIHNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdID0gb3RoZXJSZWNvZ25pemVyO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIucmVjb2duaXplV2l0aCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHNpbXVsdGFuZW91cyBsaW5rLiBpdCBkb2VzbnQgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVjb2duaXplV2l0aDogZnVuY3Rpb24gZHJvcFJlY29nbml6ZVdpdGgob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbiByZXF1aXJlRmFpbHVyZShvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSByZXF1aXJlRmFpbHVyZSBsaW5rLiBpdCBkb2VzIG5vdCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24gZHJvcFJlcXVpcmVGYWlsdXJlKG90aGVyUmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uIGhhc1JlcXVpcmVGYWlsdXJlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlmIHRoZSByZWNvZ25pemVyIGNhbiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVjb2duaXplV2l0aDogZnVuY3Rpb24gY2FuUmVjb2duaXplV2l0aChvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFlvdSBzaG91bGQgdXNlIGB0cnlFbWl0YCBpbnN0ZWFkIG9mIGBlbWl0YCBkaXJlY3RseSB0byBjaGVja1xuICAgICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgfSAvLyAncGFuc3RhcnQnIGFuZCAncGFubW92ZSdcblxuXG4gICAgICBpZiAoc3RhdGUgPCBTVEFURV9FTkRFRCkge1xuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7XG4gICAgICAgIC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgICB9IC8vIHBhbmVuZCBhbmQgcGFuY2FuY2VsXG5cblxuICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24gdHJ5RW1pdChpbnB1dCkge1xuICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgICAgfSAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG5cblxuICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FuIHdlIGVtaXQ/XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuRW1pdDogZnVuY3Rpb24gY2FuRW1pdCgpIHtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCkge1xuICAgICAgICBpZiAoISh0aGlzLnJlcXVpcmVGYWlsW2ldLnN0YXRlICYgKFNUQVRFX0ZBSUxFRCB8IFNUQVRFX1BPU1NJQkxFKSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbiByZWNvZ25pemUoaW5wdXREYXRhKSB7XG4gICAgICAvLyBtYWtlIGEgbmV3IGNvcHkgb2YgdGhlIGlucHV0RGF0YVxuICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgaW5wdXREYXRhIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgb3RoZXIgcmVjb2duaXplcnNcbiAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTsgLy8gaXMgaXMgZW5hYmxlZCBhbmQgYWxsb3cgcmVjb2duaXppbmc/XG5cbiAgICAgIGlmICghYm9vbE9yRm4odGhpcy5vcHRpb25zLmVuYWJsZSwgW3RoaXMsIGlucHV0RGF0YUNsb25lXSkpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG5cblxuICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfUkVDT0dOSVpFRCB8IFNUQVRFX0NBTkNFTExFRCB8IFNUQVRFX0ZBSUxFRCkpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTsgLy8gdGhlIHJlY29nbml6ZXIgaGFzIHJlY29nbml6ZWQgYSBnZXN0dXJlXG4gICAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEIHwgU1RBVEVfQ0FOQ0VMTEVEKSkge1xuICAgICAgICB0aGlzLnRyeUVtaXQoaW5wdXREYXRhQ2xvbmUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWNvZ25pemVyXG4gICAgICogdGhlIGFjdHVhbCByZWNvZ25pemluZyBoYXBwZW5zIGluIHRoaXMgbWV0aG9kXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICogQHJldHVybnMge0NvbnN0fSBTVEFURVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXREYXRhKSB7fSxcbiAgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcHJlZmVycmVkIHRvdWNoLWFjdGlvblxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHt9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIGdlc3R1cmUgaXNuJ3QgYWxsb3dlZCB0byByZWNvZ25pemVcbiAgICAgKiBsaWtlIHdoZW4gYW5vdGhlciBpcyBiZWluZyByZWNvZ25pemVkIG9yIGl0IGlzIGRpc2FibGVkXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7fVxuICB9O1xuICAvKipcbiAgICogZ2V0IGEgdXNhYmxlIHN0cmluZywgdXNlZCBhcyBldmVudCBwb3N0Zml4XG4gICAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IHN0YXRlXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlICYgU1RBVEVfQ0FOQ0VMTEVEKSB7XG4gICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICByZXR1cm4gJ2VuZCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0NIQU5HRUQpIHtcbiAgICAgIHJldHVybiAnbW92ZSc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0JFR0FOKSB7XG4gICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgLyoqXG4gICAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICAgKiBAcGFyYW0ge0NvbnN0fSBkaXJlY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG5cblxuICBmdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgcmV0dXJuICdkb3duJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fVVApIHtcbiAgICAgIHJldHVybiAndXAnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgYSByZWNvZ25pemVyIGJ5IG5hbWUgaWYgaXQgaXMgYm91bmQgdG8gYSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAgICogQHJldHVybnMge1JlY29nbml6ZXJ9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcblxuICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChBdHRyUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICAgIHZhciBvcHRpb25Qb2ludGVycyA9IHRoaXMub3B0aW9ucy5wb2ludGVycztcbiAgICAgIHJldHVybiBvcHRpb25Qb2ludGVycyA9PT0gMCB8fCBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvblBvaW50ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcbiAgICAgIHZhciBpc1JlY29nbml6ZWQgPSBzdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQpO1xuICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTsgLy8gb24gY2FuY2VsIGlucHV0IGFuZCB3ZSd2ZSByZWNvZ25pemVkIGJlZm9yZSwgcmV0dXJuIFNUQVRFX0NBTkNFTExFRFxuXG4gICAgICBpZiAoaXNSZWNvZ25pemVkICYmIChldmVudFR5cGUgJiBJTlBVVF9DQU5DRUwgfHwgIWlzVmFsaWQpKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWNvZ25pemVkIHx8IGlzVmFsaWQpIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBQYW5cbiAgICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFBhblJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnBYID0gbnVsbDtcbiAgICB0aGlzLnBZID0gbnVsbDtcbiAgfVxuXG4gIGluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICdwYW4nLFxuICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fQUxMXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgIHZhciBhY3Rpb25zID0gW107XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGlvbnM7XG4gICAgfSxcbiAgICBkaXJlY3Rpb25UZXN0OiBmdW5jdGlvbiBkaXJlY3Rpb25UZXN0KGlucHV0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBpbnB1dC5kaXN0YW5jZTtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5kaXJlY3Rpb247XG4gICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgIHZhciB5ID0gaW5wdXQuZGVsdGFZOyAvLyBsb2NrIHRvIGF4aXM/XG5cbiAgICAgIGlmICghKGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHggPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHggPCAwID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHkgPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG4gICAgICAgICAgaGFzTW92ZWQgPSB5ICE9IHRoaXMucFk7XG4gICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgIHJldHVybiBoYXNNb3ZlZCAmJiBkaXN0YW5jZSA+IG9wdGlvbnMudGhyZXNob2xkICYmIGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgICByZXR1cm4gQXR0clJlY29nbml6ZXIucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgISh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pICYmIHRoaXMuZGlyZWN0aW9uVGVzdChpbnB1dCkpO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgIHRoaXMucFkgPSBpbnB1dC5kZWx0YVk7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBQaW5jaFxuICAgKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlcnMgYXJlIG1vdmluZyB0b3dhcmQgKHpvb20taW4pIG9yIGF3YXkgZnJvbSBlYWNoIG90aGVyICh6b29tLW91dCkuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICAgKi9cblxuICBmdW5jdGlvbiBQaW5jaFJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIGV2ZW50OiAncGluY2gnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHtcbiAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiYgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGlucHV0KSB7XG4gICAgICBpZiAoaW5wdXQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogUHJlc3NcbiAgICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFByZXNzUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgfVxuXG4gIGluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICdwcmVzcycsXG4gICAgICBwb2ludGVyczogMSxcbiAgICAgIHRpbWU6IDI1MSxcbiAgICAgIC8vIG1pbmltYWwgdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBwcmVzc2VkXG4gICAgICB0aHJlc2hvbGQ6IDkgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcblxuICAgIH0sXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcbiAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgdmFyIHZhbGlkVGltZSA9IGlucHV0LmRlbHRhVGltZSA+IG9wdGlvbnMudGltZTtcbiAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7IC8vIHdlIG9ubHkgYWxsb3cgbGl0dGxlIG1vdmVtZW50XG4gICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG5cbiAgICAgIGlmICghdmFsaWRNb3ZlbWVudCB8fCAhdmFsaWRQb2ludGVycyB8fCBpbnB1dC5ldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAhdmFsaWRUaW1lKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgIHJldHVybiBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIFJvdGF0ZVxuICAgKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gUm90YXRlUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChSb3RhdGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUm90YXRlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICBwb2ludGVyczogMlxuICAgIH0sXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgfSxcbiAgICBhdHRyVGVzdDogZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiAoTWF0aC5hYnMoaW5wdXQucm90YXRpb24pID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBTd2lwZVxuICAgKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92aW5nIGZhc3QgKHZlbG9jaXR5KSwgd2l0aCBlbm91Z2ggZGlzdGFuY2UgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBpbmhlcml0KFN3aXBlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFN3aXBlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICB2ZWxvY2l0eTogMC4zLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCxcbiAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbiBhdHRyVGVzdChpbnB1dCkge1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gICAgICB2YXIgdmVsb2NpdHk7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5O1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiYgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmIGlucHV0Lm1heFBvaW50ZXJzID09IHRoaXMub3B0aW9ucy5wb2ludGVycyAmJiBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQub2Zmc2V0RGlyZWN0aW9uKTtcblxuICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAgICogYmV0d2VlbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIHBvc2l0aW9uLiBUaGUgZGVsYXkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSBtdWx0aS10YXBzIHdpdGhvdXQgZmlyaW5nXG4gICAqIGEgc2luZ2xlIHRhcC5cbiAgICpcbiAgICogVGhlIGV2ZW50RGF0YSBmcm9tIHRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBgdGFwQ291bnRgLCB3aGljaCBjb250YWlucyB0aGUgYW1vdW50IG9mXG4gICAqIG11bHRpLXRhcHMgYmVpbmcgcmVjb2duaXplZC5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gVGFwUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIHByZXZpb3VzIHRpbWUgYW5kIGNlbnRlcixcbiAgICAvLyB1c2VkIGZvciB0YXAgY291bnRpbmdcblxuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcbiAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG5cbiAgaW5oZXJpdChUYXBSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICB0YXBzOiAxLFxuICAgICAgaW50ZXJ2YWw6IDMwMCxcbiAgICAgIC8vIG1heCB0aW1lIGJldHdlZW4gdGhlIG11bHRpLXRhcCB0YXBzXG4gICAgICB0aW1lOiAyNTAsXG4gICAgICAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgdGhyZXNob2xkOiA5LFxuICAgICAgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9NQU5JUFVMQVRJT05dO1xuICAgIH0sXG4gICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcyhpbnB1dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcbiAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIHRoaXMuY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgIH0gLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgIC8vIGFuZCB3ZSd2ZSByZWFjaGVkIGFuIGVuZCBldmVudCwgc28gYSB0YXAgaXMgcG9zc2libGVcblxuXG4gICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfRU5EKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IGlucHV0LnRpbWVTdGFtcCAtIHRoaXMucFRpbWUgPCBvcHRpb25zLmludGVydmFsIDogdHJ1ZTtcbiAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICB0aGlzLnBDZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG5cbiAgICAgICAgaWYgKCF2YWxpZE11bHRpVGFwIHx8ICF2YWxpZEludGVydmFsKSB7XG4gICAgICAgICAgdGhpcy5jb3VudCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDsgLy8gaWYgdGFwIGNvdW50IG1hdGNoZXMgd2UgaGF2ZSByZWNvZ25pemVkIGl0LFxuICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuXG4gICAgICAgIHZhciB0YXBDb3VudCA9IHRoaXMuY291bnQgJSBvcHRpb25zLnRhcHM7XG5cbiAgICAgICAgaWYgKHRhcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gbm8gZmFpbGluZyByZXF1aXJlbWVudHMsIGltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIHRhcCBldmVudFxuICAgICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICAgIGlmICghdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbiBmYWlsVGltZW91dCgpIHtcbiAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdCgpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgdGhpcy5faW5wdXQudGFwQ291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsIHRoaXMuX2lucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKi9cblxuICBmdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIEBjb25zdCB7c3RyaW5nfVxuICAgKi9cblxuXG4gIEhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcbiAgLyoqXG4gICAqIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogQG5hbWVzcGFjZVxuICAgKi9cblxuICBIYW1tZXIuZGVmYXVsdHMgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IGlmIERPTSBldmVudHMgYXJlIGJlaW5nIHRyaWdnZXJlZC5cbiAgICAgKiBCdXQgdGhpcyBpcyBzbG93ZXIgYW5kIHVudXNlZCBieSBzaW1wbGUgaW1wbGVtZW50YXRpb25zLCBzbyBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgZG9tRXZlbnRzOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5L2ZhbGxiYWNrLlxuICAgICAqIFdoZW4gc2V0IHRvIGBjb21wdXRlYCBpdCB3aWxsIG1hZ2ljYWxseSBzZXQgdGhlIGNvcnJlY3QgdmFsdWUgYmFzZWQgb24gdGhlIGFkZGVkIHJlY29nbml6ZXJzLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgY29tcHV0ZVxuICAgICAqL1xuICAgIHRvdWNoQWN0aW9uOiBUT1VDSF9BQ1RJT05fQ09NUFVURSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBlbmFibGU6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAtLSBjYW4gYmUgcmVtb3ZlZC9jaGFuZ2VkXG4gICAgICogQ2hhbmdlIHRoZSBwYXJlbnQgaW5wdXQgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogSWYgTnVsbCwgdGhlbiBpdCBpcyBiZWluZyBzZXQgdGhlIHRvIG1haW4gZWxlbWVudC5cbiAgICAgKiBAdHlwZSB7TnVsbHxFdmVudFRhcmdldH1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRUYXJnZXQ6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBmb3JjZSBhbiBpbnB1dCBjbGFzc1xuICAgICAqIEB0eXBlIHtOdWxsfEZ1bmN0aW9ufVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dENsYXNzOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCByZWNvZ25pemVyIHNldHVwIHdoZW4gY2FsbGluZyBgSGFtbWVyKClgXG4gICAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyIHRoZXNlIHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICovXG4gICAgcHJlc2V0OiBbLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgW1JvdGF0ZVJlY29nbml6ZXIsIHtcbiAgICAgIGVuYWJsZTogZmFsc2VcbiAgICB9XSwgW1BpbmNoUmVjb2duaXplciwge1xuICAgICAgZW5hYmxlOiBmYWxzZVxuICAgIH0sIFsncm90YXRlJ11dLCBbU3dpcGVSZWNvZ25pemVyLCB7XG4gICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG4gICAgfV0sIFtQYW5SZWNvZ25pemVyLCB7XG4gICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG4gICAgfSwgWydzd2lwZSddXSwgW1RhcFJlY29nbml6ZXJdLCBbVGFwUmVjb2duaXplciwge1xuICAgICAgZXZlbnQ6ICdkb3VibGV0YXAnLFxuICAgICAgdGFwczogMlxuICAgIH0sIFsndGFwJ11dLCBbUHJlc3NSZWNvZ25pemVyXV0sXG5cbiAgICAvKipcbiAgICAgKiBTb21lIENTUyBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHdvcmtpbmcgb2YgSGFtbWVyLlxuICAgICAqIEFkZCB0aGVtIHRvIHRoaXMgbWV0aG9kIGFuZCB0aGV5IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlci5cbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICovXG4gICAgY3NzUHJvcHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICovXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgKi9cbiAgICAgIHRvdWNoU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAqIE9uIGlPUywgd2hlbiB5b3UgdG91Y2ggYW5kIGhvbGQgYSB0b3VjaCB0YXJnZXQgc3VjaCBhcyBhIGxpbmssIFNhZmFyaSBkaXNwbGF5c1xuICAgICAgICogYSBjYWxsb3V0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmsuIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHRoYXQgY2FsbG91dC5cbiAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAqL1xuICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLiBVc2VkIGJ5IElFMTA+XG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICovXG4gICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlcyB0aGUgaGlnaGxpZ2h0IGNvbG9yIHNob3duIHdoZW4gdGhlIHVzZXIgdGFwcyBhIGxpbmsgb3IgYSBKYXZhU2NyaXB0XG4gICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ3JnYmEoMCwwLDAsMCknXG4gICAgICAgKi9cbiAgICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgICB9XG4gIH07XG4gIHZhciBTVE9QID0gMTtcbiAgdmFyIEZPUkNFRF9TVE9QID0gMjtcbiAgLyoqXG4gICAqIE1hbmFnZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKi9cblxuICBmdW5jdGlvbiBNYW5hZ2VyKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIEhhbW1lci5kZWZhdWx0cywgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmlucHV0ID0gY3JlYXRlSW5wdXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnRvdWNoQWN0aW9uID0gbmV3IFRvdWNoQWN0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgcmVjb2duaXplciA9IHRoaXMuYWRkKG5ldyBpdGVtWzBdKGl0ZW1bMV0pKTtcbiAgICAgIGl0ZW1bMl0gJiYgcmVjb2duaXplci5yZWNvZ25pemVXaXRoKGl0ZW1bMl0pO1xuICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xuICB9XG5cbiAgTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KG9wdGlvbnMpIHtcbiAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOyAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG5cbiAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcChmb3JjZSkge1xuICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24gcmVjb2duaXplKGlucHV0RGF0YSkge1xuICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247XG5cbiAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuXG5cbiAgICAgIHRoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGlucHV0RGF0YSk7XG4gICAgICB2YXIgcmVjb2duaXplcjtcbiAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7IC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgLy8gc28gdGhlIHJlY29nbml6ZXIncyBzdGF0ZSBuZWVkcyB0byBiZSBCRUdBTiwgQ0hBTkdFRCwgRU5ERUQgb3IgUkVDT0dOSVpFRFxuICAgICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuXG4gICAgICB2YXIgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplcjsgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgIC8vIG9yIHdoZW4gd2UncmUgaW4gYSBuZXcgc2Vzc2lvblxuXG4gICAgICBpZiAoIWN1clJlY29nbml6ZXIgfHwgY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07IC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgICAgLy8gMS4gICBhbGxvdyBpZiB0aGUgc2Vzc2lvbiBpcyBOT1QgZm9yY2VkIHN0b3BwZWQgKHNlZSB0aGUgLnN0b3AoKSBtZXRob2QpXG4gICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgLy8gMy4gICBhbGxvdyBpZiB0aGUgcmVjb2duaXplciBpcyBhbGxvd2VkIHRvIHJ1biBzaW11bHRhbmVvdXMgd2l0aCB0aGUgY3VycmVudCByZWNvZ25pemVkIHJlY29nbml6ZXIuXG4gICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuXG4gICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQgIT09IEZPUkNFRF9TVE9QICYmICggLy8gMVxuICAgICAgICAhY3VyUmVjb2duaXplciB8fCByZWNvZ25pemVyID09IGN1clJlY29nbml6ZXIgfHwgLy8gMlxuICAgICAgICByZWNvZ25pemVyLmNhblJlY29nbml6ZVdpdGgoY3VyUmVjb2duaXplcikpKSB7XG4gICAgICAgICAgLy8gM1xuICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjb2duaXplci5yZXNldCgpO1xuICAgICAgICB9IC8vIGlmIHRoZSByZWNvZ25pemVyIGhhcyBiZWVuIHJlY29nbml6aW5nIHRoZSBpbnB1dCBhcyBhIHZhbGlkIGdlc3R1cmUsIHdlIHdhbnQgdG8gc3RvcmUgdGhpcyBvbmUgYXMgdGhlXG4gICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuXG5cbiAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdldCBhIHJlY29nbml6ZXIgYnkgaXRzIGV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfE51bGx9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQocmVjb2duaXplcikge1xuICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChyZWNvZ25pemVyKSB7XG4gICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ2FkZCcsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyByZW1vdmUgZXhpc3RpbmdcblxuXG4gICAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuXG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoZXhpc3RpbmcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICByZWNvZ25pemVyLm1hbmFnZXIgPSB0aGlzO1xuICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYSByZWNvZ25pemVyIGJ5IG5hbWUgb3IgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUocmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmVjb2duaXplciA9IHRoaXMuZ2V0KHJlY29nbml6ZXIpOyAvLyBsZXQncyBtYWtlIHN1cmUgdGhpcyByZWNvZ25pemVyIGV4aXN0c1xuXG4gICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgIGhhbmRsZXJzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIGV2ZW50LCBsZWF2ZSBlbWl0IGJsYW5rIHRvIHJlbW92ZSBhbGwgaGFuZGxlcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhbmRsZXJdXG4gICAgICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gdGhpc1xuICAgICAqL1xuICAgIG9mZjogZnVuY3Rpb24gb2ZmKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcbiAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFuZGxlcnNbZXZlbnRdICYmIGhhbmRsZXJzW2V2ZW50XS5zcGxpY2UoaW5BcnJheShoYW5kbGVyc1tldmVudF0sIGhhbmRsZXIpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50LCBkYXRhKSB7XG4gICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gdHJpZ2dlciBkb20gZXZlbnRzXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpO1xuICAgICAgfSAvLyBubyBoYW5kbGVycywgc28gc2tpcCBpdCBhbGxcblxuXG4gICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuXG4gICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnR5cGUgPSBldmVudDtcblxuICAgICAgZGF0YS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGF0YS5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICBoYW5kbGVyc1tpXShkYXRhKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXN0cm95IHRoZSBtYW5hZ2VyIGFuZCB1bmJpbmRzIGFsbCBldmVudHNcbiAgICAgKiBpdCBkb2Vzbid0IHVuYmluZCBkb20gZXZlbnRzLCB0aGF0IGlzIHRoZSB1c2VyIG93biByZXNwb25zaWJpbGl0eVxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgJiYgdG9nZ2xlQ3NzUHJvcHModGhpcywgZmFsc2UpO1xuICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogYWRkL3JlbW92ZSB0aGUgY3NzIHByb3BlcnRpZXMgYXMgZGVmaW5lZCBpbiBtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHNcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50LnN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3A7XG4gICAgZWFjaChtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHMsIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgcHJvcCA9IHByZWZpeGVkKGVsZW1lbnQuc3R5bGUsIG5hbWUpO1xuXG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSB8fCAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghYWRkKSB7XG4gICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiB0cmlnZ2VyIGRvbSBldmVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG5cblxuICBmdW5jdGlvbiB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpIHtcbiAgICB2YXIgZ2VzdHVyZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZ2VzdHVyZUV2ZW50LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZ2VzdHVyZUV2ZW50Lmdlc3R1cmUgPSBkYXRhO1xuICAgIGRhdGEudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZ2VzdHVyZUV2ZW50KTtcbiAgfVxuXG4gIGFzc2lnbihIYW1tZXIsIHtcbiAgICBJTlBVVF9TVEFSVDogSU5QVVRfU1RBUlQsXG4gICAgSU5QVVRfTU9WRTogSU5QVVRfTU9WRSxcbiAgICBJTlBVVF9FTkQ6IElOUFVUX0VORCxcbiAgICBJTlBVVF9DQU5DRUw6IElOUFVUX0NBTkNFTCxcbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG4gICAgRElSRUNUSU9OX05PTkU6IERJUkVDVElPTl9OT05FLFxuICAgIERJUkVDVElPTl9MRUZUOiBESVJFQ1RJT05fTEVGVCxcbiAgICBESVJFQ1RJT05fUklHSFQ6IERJUkVDVElPTl9SSUdIVCxcbiAgICBESVJFQ1RJT05fVVA6IERJUkVDVElPTl9VUCxcbiAgICBESVJFQ1RJT05fRE9XTjogRElSRUNUSU9OX0RPV04sXG4gICAgRElSRUNUSU9OX0hPUklaT05UQUw6IERJUkVDVElPTl9IT1JJWk9OVEFMLFxuICAgIERJUkVDVElPTl9WRVJUSUNBTDogRElSRUNUSU9OX1ZFUlRJQ0FMLFxuICAgIERJUkVDVElPTl9BTEw6IERJUkVDVElPTl9BTEwsXG4gICAgTWFuYWdlcjogTWFuYWdlcixcbiAgICBJbnB1dDogSW5wdXQsXG4gICAgVG91Y2hBY3Rpb246IFRvdWNoQWN0aW9uLFxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcbiAgICBSZWNvZ25pemVyOiBSZWNvZ25pemVyLFxuICAgIEF0dHJSZWNvZ25pemVyOiBBdHRyUmVjb2duaXplcixcbiAgICBUYXA6IFRhcFJlY29nbml6ZXIsXG4gICAgUGFuOiBQYW5SZWNvZ25pemVyLFxuICAgIFN3aXBlOiBTd2lwZVJlY29nbml6ZXIsXG4gICAgUGluY2g6IFBpbmNoUmVjb2duaXplcixcbiAgICBSb3RhdGU6IFJvdGF0ZVJlY29nbml6ZXIsXG4gICAgUHJlc3M6IFByZXNzUmVjb2duaXplcixcbiAgICBvbjogYWRkRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2ZmOiByZW1vdmVFdmVudExpc3RlbmVycyxcbiAgICBlYWNoOiBlYWNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBpbmhlcml0OiBpbmhlcml0LFxuICAgIGJpbmRGbjogYmluZEZuLFxuICAgIHByZWZpeGVkOiBwcmVmaXhlZFxuICB9KTsgLy8gdGhpcyBwcmV2ZW50cyBlcnJvcnMgd2hlbiBIYW1tZXIgaXMgbG9hZGVkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTURcbiAgLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG5cbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgZnJlZUdsb2JhbC5IYW1tZXIgPSBIYW1tZXI7XG5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gSGFtbWVyO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEhhbW1lcjtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG4gIH1cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5087\n")},1677:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({\n value: true\n});\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\nvar UAParser = __webpack_require__(4889);\n\nvar UA = new UAParser();\nvar browser = UA.getBrowser();\nvar cpu = UA.getCPU();\nvar device = UA.getDevice();\nvar engine = UA.getEngine();\nvar os = UA.getOS();\nvar ua = UA.getUA();\n\nvar setDefaults = function setDefaults(p) {\n var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \'none\';\n return p ? p : d;\n};\n\nvar getNavigatorInstance = function getNavigatorInstance() {\n if (typeof window !== \'undefined\') {\n if (window.navigator || navigator) {\n return window.navigator || navigator;\n }\n }\n\n return false;\n};\n\nvar isIOS13Check = function isIOS13Check(type) {\n var nav = getNavigatorInstance();\n return nav && nav.platform && (nav.platform.indexOf(type) !== -1 || nav.platform === \'MacIntel\' && nav.maxTouchPoints > 1 && !window.MSStream);\n};\n\nfunction _typeof(obj) {\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n };\n }\n\n return _typeof(obj);\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 _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}\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 _extends() {\n _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 return _extends.apply(this, arguments);\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(source, true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(source).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\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");\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) _setPrototypeOf(subClass, superClass);\n}\n\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}\n\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}\n\nfunction _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\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\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\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === "object" || typeof call === "function")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nvar DeviceTypes = {\n Mobile: \'mobile\',\n Tablet: \'tablet\',\n SmartTv: \'smarttv\',\n Console: \'console\',\n Wearable: \'wearable\',\n Browser: undefined\n};\nvar BrowserTypes = {\n Chrome: \'Chrome\',\n Firefox: "Firefox",\n Opera: "Opera",\n Yandex: "Yandex",\n Safari: "Safari",\n InternetExplorer: "Internet Explorer",\n Edge: "Edge",\n Chromium: "Chromium",\n Ie: \'IE\',\n MobileSafari: "Mobile Safari",\n EdgeChromium: "Edge Chromium",\n MIUI: "MIUI Browser",\n SamsungBrowser: \'Samsung Browser\'\n};\nvar OsTypes = {\n IOS: \'iOS\',\n Android: "Android",\n WindowsPhone: "Windows Phone",\n Windows: \'Windows\',\n MAC_OS: \'Mac OS\'\n};\nvar initialData = {\n isMobile: false,\n isTablet: false,\n isBrowser: false,\n isSmartTV: false,\n isConsole: false,\n isWearable: false\n};\n\nvar checkType = function checkType(type) {\n switch (type) {\n case DeviceTypes.Mobile:\n return {\n isMobile: true\n };\n\n case DeviceTypes.Tablet:\n return {\n isTablet: true\n };\n\n case DeviceTypes.SmartTv:\n return {\n isSmartTV: true\n };\n\n case DeviceTypes.Console:\n return {\n isConsole: true\n };\n\n case DeviceTypes.Wearable:\n return {\n isWearable: true\n };\n\n case DeviceTypes.Browser:\n return {\n isBrowser: true\n };\n\n default:\n return initialData;\n }\n};\n\nvar broPayload = function broPayload(isBrowser, browser, engine, os, ua) {\n return {\n isBrowser: isBrowser,\n browserMajorVersion: setDefaults(browser.major),\n browserFullVersion: setDefaults(browser.version),\n browserName: setDefaults(browser.name),\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar mobilePayload = function mobilePayload(type, device, os, ua) {\n return _objectSpread2({}, type, {\n vendor: setDefaults(device.vendor),\n model: setDefaults(device.model),\n os: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n ua: setDefaults(ua)\n });\n};\n\nvar stvPayload = function stvPayload(isSmartTV, engine, os, ua) {\n return {\n isSmartTV: isSmartTV,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar consolePayload = function consolePayload(isConsole, engine, os, ua) {\n return {\n isConsole: isConsole,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar wearPayload = function wearPayload(isWearable, engine, os, ua) {\n return {\n isWearable: isWearable,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar type = checkType(device.type);\n\nfunction deviceDetect() {\n var isBrowser = type.isBrowser,\n isMobile = type.isMobile,\n isTablet = type.isTablet,\n isSmartTV = type.isSmartTV,\n isConsole = type.isConsole,\n isWearable = type.isWearable;\n\n if (isBrowser) {\n return broPayload(isBrowser, browser, engine, os, ua);\n }\n\n if (isSmartTV) {\n return stvPayload(isSmartTV, engine, os, ua);\n }\n\n if (isConsole) {\n return consolePayload(isConsole, engine, os, ua);\n }\n\n if (isMobile) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isTablet) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isWearable) {\n return wearPayload(isWearable, engine, os, ua);\n }\n}\n\nvar isMobileType = function isMobileType() {\n return device.type === DeviceTypes.Mobile;\n};\n\nvar isTabletType = function isTabletType() {\n return device.type === DeviceTypes.Tablet;\n};\n\nvar isMobileAndTabletType = function isMobileAndTabletType() {\n switch (device.type) {\n case DeviceTypes.Mobile:\n case DeviceTypes.Tablet:\n return true;\n\n default:\n return false;\n }\n};\n\nvar isEdgeChromiumType = function isEdgeChromiumType() {\n return typeof ua === \'string\' && ua.indexOf(\'Edg/\') !== -1;\n};\n\nvar isSmartTVType = function isSmartTVType() {\n return device.type === DeviceTypes.SmartTv;\n};\n\nvar isBrowserType = function isBrowserType() {\n return device.type === DeviceTypes.Browser;\n};\n\nvar isWearableType = function isWearableType() {\n return device.type === DeviceTypes.Wearable;\n};\n\nvar isConsoleType = function isConsoleType() {\n return device.type === DeviceTypes.Console;\n};\n\nvar isAndroidType = function isAndroidType() {\n return os.name === OsTypes.Android;\n};\n\nvar isWindowsType = function isWindowsType() {\n return os.name === OsTypes.Windows;\n};\n\nvar isMacOsType = function isMacOsType() {\n return os.name === OsTypes.MAC_OS;\n};\n\nvar isWinPhoneType = function isWinPhoneType() {\n return os.name === OsTypes.WindowsPhone;\n};\n\nvar isIOSType = function isIOSType() {\n return os.name === OsTypes.IOS;\n};\n\nvar isChromeType = function isChromeType() {\n return browser.name === BrowserTypes.Chrome;\n};\n\nvar isFirefoxType = function isFirefoxType() {\n return browser.name === BrowserTypes.Firefox;\n};\n\nvar isChromiumType = function isChromiumType() {\n return browser.name === BrowserTypes.Chromium;\n};\n\nvar isEdgeType = function isEdgeType() {\n return browser.name === BrowserTypes.Edge;\n};\n\nvar isYandexType = function isYandexType() {\n return browser.name === BrowserTypes.Yandex;\n};\n\nvar isSafariType = function isSafariType() {\n return browser.name === BrowserTypes.Safari || browser.name === BrowserTypes.MobileSafari;\n};\n\nvar isMobileSafariType = function isMobileSafariType() {\n return browser.name === BrowserTypes.MobileSafari;\n};\n\nvar isOperaType = function isOperaType() {\n return browser.name === BrowserTypes.Opera;\n};\n\nvar isIEType = function isIEType() {\n return browser.name === BrowserTypes.InternetExplorer || browser.name === BrowserTypes.Ie;\n};\n\nvar isMIUIType = function isMIUIType() {\n return browser.name === BrowserTypes.MIUI;\n};\n\nvar isSamsungBrowserType = function isSamsungBrowserType() {\n return browser.name === BrowserTypes.SamsungBrowser;\n};\n\nvar isElectronType = function isElectronType() {\n var nav = getNavigatorInstance();\n var ua = nav && nav.userAgent && nav.userAgent.toLowerCase();\n return typeof ua === \'string\' ? /electron/.test(ua) : false;\n};\n\nvar getIOS13 = function getIOS13() {\n var nav = getNavigatorInstance();\n return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === \'MacIntel\' && nav.maxTouchPoints > 1) && !window.MSStream;\n};\n\nvar getIPad13 = function getIPad13() {\n return isIOS13Check(\'iPad\');\n};\n\nvar getIphone13 = function getIphone13() {\n return isIOS13Check(\'iPhone\');\n};\n\nvar getIPod13 = function getIPod13() {\n return isIOS13Check(\'iPod\');\n};\n\nvar getBrowserFullVersion = function getBrowserFullVersion() {\n return setDefaults(browser.version);\n};\n\nvar getBrowserVersion = function getBrowserVersion() {\n return setDefaults(browser.major);\n};\n\nvar getOsVersion = function getOsVersion() {\n return setDefaults(os.version);\n};\n\nvar getOsName = function getOsName() {\n return setDefaults(os.name);\n};\n\nvar getBrowserName = function getBrowserName() {\n return setDefaults(browser.name);\n};\n\nvar getMobileVendor = function getMobileVendor() {\n return setDefaults(device.vendor);\n};\n\nvar getMobileModel = function getMobileModel() {\n return setDefaults(device.model);\n};\n\nvar getEngineName = function getEngineName() {\n return setDefaults(engine.name);\n};\n\nvar getEngineVersion = function getEngineVersion() {\n return setDefaults(engine.version);\n};\n\nvar getUseragent = function getUseragent() {\n return setDefaults(ua);\n};\n\nvar getDeviceType = function getDeviceType() {\n return setDefaults(device.type, \'browser\');\n};\n\nvar isSmartTV = isSmartTVType();\nvar isConsole = isConsoleType();\nvar isWearable = isWearableType();\nvar isMobileSafari = isMobileSafariType() || getIPad13();\nvar isChromium = isChromiumType();\nvar isMobile = isMobileAndTabletType() || getIPad13();\nvar isMobileOnly = isMobileType();\nvar isTablet = isTabletType() || getIPad13();\nvar isBrowser = isBrowserType();\nvar isDesktop = isBrowserType();\nvar isAndroid = isAndroidType();\nvar isWinPhone = isWinPhoneType();\nvar isIOS = isIOSType() || getIPad13();\nvar isChrome = isChromeType();\nvar isFirefox = isFirefoxType();\nvar isSafari = isSafariType();\nvar isOpera = isOperaType();\nvar isIE = isIEType();\nvar osVersion = getOsVersion();\nvar osName = getOsName();\nvar fullBrowserVersion = getBrowserFullVersion();\nvar browserVersion = getBrowserVersion();\nvar browserName = getBrowserName();\nvar mobileVendor = getMobileVendor();\nvar mobileModel = getMobileModel();\nvar engineName = getEngineName();\nvar engineVersion = getEngineVersion();\nvar getUA = getUseragent();\nvar isEdge = isEdgeType() || isEdgeChromiumType();\nvar isYandex = isYandexType();\nvar deviceType = getDeviceType();\nvar isIOS13 = getIOS13();\nvar isIPad13 = getIPad13();\nvar isIPhone13 = getIphone13();\nvar isIPod13 = getIPod13();\nvar isElectron = isElectronType();\nvar isEdgeChromium = isEdgeChromiumType();\nvar isLegacyEdge = isEdgeType() && !isEdgeChromiumType();\nvar isWindows = isWindowsType();\nvar isMacOs = isMacOsType();\nvar isMIUI = isMIUIType();\nvar isSamsungBrowser = isSamsungBrowserType();\n\nvar AndroidView = function AndroidView(_ref) {\n var renderWithFragment = _ref.renderWithFragment,\n children = _ref.children,\n viewClassName = _ref.viewClassName,\n style = _ref.style,\n props = _objectWithoutProperties(_ref, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isAndroid ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar BrowserView = function BrowserView(_ref2) {\n var renderWithFragment = _ref2.renderWithFragment,\n children = _ref2.children,\n viewClassName = _ref2.viewClassName,\n style = _ref2.style,\n props = _objectWithoutProperties(_ref2, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isBrowser ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar IEView = function IEView(_ref3) {\n var renderWithFragment = _ref3.renderWithFragment,\n children = _ref3.children,\n viewClassName = _ref3.viewClassName,\n style = _ref3.style,\n props = _objectWithoutProperties(_ref3, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isIE ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar IOSView = function IOSView(_ref4) {\n var renderWithFragment = _ref4.renderWithFragment,\n children = _ref4.children,\n viewClassName = _ref4.viewClassName,\n style = _ref4.style,\n props = _objectWithoutProperties(_ref4, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isIOS ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar MobileView = function MobileView(_ref5) {\n var renderWithFragment = _ref5.renderWithFragment,\n children = _ref5.children,\n viewClassName = _ref5.viewClassName,\n style = _ref5.style,\n props = _objectWithoutProperties(_ref5, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isMobile ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar TabletView = function TabletView(_ref6) {\n var renderWithFragment = _ref6.renderWithFragment,\n children = _ref6.children,\n viewClassName = _ref6.viewClassName,\n style = _ref6.style,\n props = _objectWithoutProperties(_ref6, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isTablet ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar WinPhoneView = function WinPhoneView(_ref7) {\n var renderWithFragment = _ref7.renderWithFragment,\n children = _ref7.children,\n viewClassName = _ref7.viewClassName,\n style = _ref7.style,\n props = _objectWithoutProperties(_ref7, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isWinPhone ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar MobileOnlyView = function MobileOnlyView(_ref8) {\n var renderWithFragment = _ref8.renderWithFragment,\n children = _ref8.children,\n viewClassName = _ref8.viewClassName,\n style = _ref8.style,\n props = _objectWithoutProperties(_ref8, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isMobileOnly ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar SmartTVView = function SmartTVView(_ref9) {\n var renderWithFragment = _ref9.renderWithFragment,\n children = _ref9.children,\n viewClassName = _ref9.viewClassName,\n style = _ref9.style,\n props = _objectWithoutProperties(_ref9, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isSmartTV ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar ConsoleView = function ConsoleView(_ref10) {\n var renderWithFragment = _ref10.renderWithFragment,\n children = _ref10.children,\n viewClassName = _ref10.viewClassName,\n style = _ref10.style,\n props = _objectWithoutProperties(_ref10, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isConsole ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar WearableView = function WearableView(_ref11) {\n var renderWithFragment = _ref11.renderWithFragment,\n children = _ref11.children,\n viewClassName = _ref11.viewClassName,\n style = _ref11.style,\n props = _objectWithoutProperties(_ref11, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isWearable ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar CustomView = function CustomView(_ref12) {\n var renderWithFragment = _ref12.renderWithFragment,\n children = _ref12.children,\n viewClassName = _ref12.viewClassName,\n style = _ref12.style,\n condition = _ref12.condition,\n props = _objectWithoutProperties(_ref12, ["renderWithFragment", "children", "viewClassName", "style", "condition"]);\n\n return condition ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nfunction withOrientationChange(WrappedComponent) {\n return /*#__PURE__*/function (_React$Component) {\n _inherits(_class, _React$Component);\n\n function _class(props) {\n var _this;\n\n _classCallCheck(this, _class);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));\n _this.isEventListenerAdded = false;\n _this.handleOrientationChange = _this.handleOrientationChange.bind(_assertThisInitialized(_this));\n _this.onOrientationChange = _this.onOrientationChange.bind(_assertThisInitialized(_this));\n _this.onPageLoad = _this.onPageLoad.bind(_assertThisInitialized(_this));\n _this.state = {\n isLandscape: false,\n isPortrait: false\n };\n return _this;\n }\n\n _createClass(_class, [{\n key: "handleOrientationChange",\n value: function handleOrientationChange() {\n if (!this.isEventListenerAdded) {\n this.isEventListenerAdded = true;\n }\n\n var orientation = window.innerWidth > window.innerHeight ? 90 : 0;\n this.setState({\n isPortrait: orientation === 0,\n isLandscape: orientation === 90\n });\n }\n }, {\n key: "onOrientationChange",\n value: function onOrientationChange() {\n this.handleOrientationChange();\n }\n }, {\n key: "onPageLoad",\n value: function onPageLoad() {\n this.handleOrientationChange();\n }\n }, {\n key: "componentDidMount",\n value: function componentDidMount() {\n if ((typeof window === "undefined" ? "undefined" : _typeof(window)) !== undefined && isMobile) {\n if (!this.isEventListenerAdded) {\n this.handleOrientationChange();\n window.addEventListener("load", this.onPageLoad, false);\n } else {\n window.removeEventListener("load", this.onPageLoad, false);\n }\n\n window.addEventListener("resize", this.onOrientationChange, false);\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n window.removeEventListener("resize", this.onOrientationChange, false);\n }\n }, {\n key: "render",\n value: function render() {\n return React__default.createElement(WrappedComponent, _extends({}, this.props, {\n isLandscape: this.state.isLandscape,\n isPortrait: this.state.isPortrait\n }));\n }\n }]);\n\n return _class;\n }(React__default.Component);\n}\n\n__webpack_unused_export__ = AndroidView;\n__webpack_unused_export__ = BrowserTypes;\n__webpack_unused_export__ = BrowserView;\n__webpack_unused_export__ = ConsoleView;\n__webpack_unused_export__ = CustomView;\n__webpack_unused_export__ = IEView;\n__webpack_unused_export__ = IOSView;\n__webpack_unused_export__ = MobileOnlyView;\n__webpack_unused_export__ = MobileView;\n__webpack_unused_export__ = OsTypes;\n__webpack_unused_export__ = SmartTVView;\n__webpack_unused_export__ = TabletView;\n__webpack_unused_export__ = WearableView;\n__webpack_unused_export__ = WinPhoneView;\n__webpack_unused_export__ = browserName;\n__webpack_unused_export__ = browserVersion;\n__webpack_unused_export__ = deviceDetect;\n__webpack_unused_export__ = deviceType;\n__webpack_unused_export__ = engineName;\n__webpack_unused_export__ = engineVersion;\n__webpack_unused_export__ = fullBrowserVersion;\n__webpack_unused_export__ = getUA;\n__webpack_unused_export__ = isAndroid;\n__webpack_unused_export__ = isBrowser;\n__webpack_unused_export__ = isChrome;\n__webpack_unused_export__ = isChromium;\n__webpack_unused_export__ = isConsole;\n__webpack_unused_export__ = isDesktop;\n__webpack_unused_export__ = isEdge;\n__webpack_unused_export__ = isEdgeChromium;\n__webpack_unused_export__ = isElectron;\n__webpack_unused_export__ = isFirefox;\n__webpack_unused_export__ = isIE;\n__webpack_unused_export__ = isIOS;\n__webpack_unused_export__ = isIOS13;\n__webpack_unused_export__ = isIPad13;\n__webpack_unused_export__ = isIPhone13;\n__webpack_unused_export__ = isIPod13;\n__webpack_unused_export__ = isLegacyEdge;\n__webpack_unused_export__ = isMIUI;\n__webpack_unused_export__ = isMacOs;\nexports.tq = isMobile;\n__webpack_unused_export__ = isMobileOnly;\n__webpack_unused_export__ = isMobileSafari;\n__webpack_unused_export__ = isOpera;\n__webpack_unused_export__ = isSafari;\n__webpack_unused_export__ = isSamsungBrowser;\n__webpack_unused_export__ = isSmartTV;\n__webpack_unused_export__ = isTablet;\n__webpack_unused_export__ = isWearable;\n__webpack_unused_export__ = isWinPhone;\n__webpack_unused_export__ = isWindows;\n__webpack_unused_export__ = isYandex;\n__webpack_unused_export__ = mobileModel;\n__webpack_unused_export__ = mobileVendor;\n__webpack_unused_export__ = osName;\n__webpack_unused_export__ = osVersion;\n__webpack_unused_export__ = withOrientationChange;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1kZXZpY2UtZGV0ZWN0L21haW4uanM/N2I2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQWE7O0FBRWIsNkJBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxDQUFDOztBQUVGO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsSUFBTzs7QUFFM0I7O0FBRUEsZUFBZSxtQkFBTyxDQUFDLElBQWlDOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGVBQWUsNkJBQTZCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHlFQUF5RTtBQUN6RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDs7QUFFQSx5QkFBbUI7QUFDbkIseUJBQW9CO0FBQ3BCLHlCQUFtQjtBQUNuQix5QkFBbUI7QUFDbkIseUJBQWtCO0FBQ2xCLHlCQUFjO0FBQ2QseUJBQWU7QUFDZix5QkFBc0I7QUFDdEIseUJBQWtCO0FBQ2xCLHlCQUFlO0FBQ2YseUJBQW1CO0FBQ25CLHlCQUFrQjtBQUNsQix5QkFBb0I7QUFDcEIseUJBQW9CO0FBQ3BCLHlCQUFtQjtBQUNuQix5QkFBc0I7QUFDdEIseUJBQW9CO0FBQ3BCLHlCQUFrQjtBQUNsQix5QkFBa0I7QUFDbEIseUJBQXFCO0FBQ3JCLHlCQUEwQjtBQUMxQix5QkFBYTtBQUNiLHlCQUFpQjtBQUNqQix5QkFBaUI7QUFDakIseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBaUI7QUFDakIseUJBQWlCO0FBQ2pCLHlCQUFjO0FBQ2QseUJBQXNCO0FBQ3RCLHlCQUFrQjtBQUNsQix5QkFBaUI7QUFDakIseUJBQVk7QUFDWix5QkFBYTtBQUNiLHlCQUFlO0FBQ2YseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBZ0I7QUFDaEIseUJBQW9CO0FBQ3BCLHlCQUFjO0FBQ2QseUJBQWU7QUFDZixVQUFnQjtBQUNoQix5QkFBb0I7QUFDcEIseUJBQXNCO0FBQ3RCLHlCQUFlO0FBQ2YseUJBQWdCO0FBQ2hCLHlCQUF3QjtBQUN4Qix5QkFBaUI7QUFDakIseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBa0I7QUFDbEIseUJBQWlCO0FBQ2pCLHlCQUFnQjtBQUNoQix5QkFBbUI7QUFDbkIseUJBQW9CO0FBQ3BCLHlCQUFjO0FBQ2QseUJBQWlCO0FBQ2pCLHlCQUE2QiIsImZpbGUiOiIxNjc3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0KGV4KSB7XG4gIHJldHVybiBleCAmJiB0eXBlb2YgZXggPT09ICdvYmplY3QnICYmICdkZWZhdWx0JyBpbiBleCA/IGV4WydkZWZhdWx0J10gOiBleDtcbn1cblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIFJlYWN0X19kZWZhdWx0ID0gX2ludGVyb3BEZWZhdWx0KFJlYWN0KTtcblxudmFyIFVBUGFyc2VyID0gcmVxdWlyZSgndWEtcGFyc2VyLWpzL2Rpc3QvdWEtcGFyc2VyLm1pbicpO1xuXG52YXIgVUEgPSBuZXcgVUFQYXJzZXIoKTtcbnZhciBicm93c2VyID0gVUEuZ2V0QnJvd3NlcigpO1xudmFyIGNwdSA9IFVBLmdldENQVSgpO1xudmFyIGRldmljZSA9IFVBLmdldERldmljZSgpO1xudmFyIGVuZ2luZSA9IFVBLmdldEVuZ2luZSgpO1xudmFyIG9zID0gVUEuZ2V0T1MoKTtcbnZhciB1YSA9IFVBLmdldFVBKCk7XG5cbnZhciBzZXREZWZhdWx0cyA9IGZ1bmN0aW9uIHNldERlZmF1bHRzKHApIHtcbiAgdmFyIGQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdub25lJztcbiAgcmV0dXJuIHAgPyBwIDogZDtcbn07XG5cbnZhciBnZXROYXZpZ2F0b3JJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldE5hdmlnYXRvckluc3RhbmNlKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAod2luZG93Lm5hdmlnYXRvciB8fCBuYXZpZ2F0b3IpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yIHx8IG5hdmlnYXRvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgaXNJT1MxM0NoZWNrID0gZnVuY3Rpb24gaXNJT1MxM0NoZWNrKHR5cGUpIHtcbiAgdmFyIG5hdiA9IGdldE5hdmlnYXRvckluc3RhbmNlKCk7XG4gIHJldHVybiBuYXYgJiYgbmF2LnBsYXRmb3JtICYmIChuYXYucGxhdGZvcm0uaW5kZXhPZih0eXBlKSAhPT0gLTEgfHwgbmF2LnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmIG5hdi5tYXhUb3VjaFBvaW50cyA+IDEgJiYgIXdpbmRvdy5NU1N0cmVhbSk7XG59O1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG5cbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuXG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxudmFyIERldmljZVR5cGVzID0ge1xuICBNb2JpbGU6ICdtb2JpbGUnLFxuICBUYWJsZXQ6ICd0YWJsZXQnLFxuICBTbWFydFR2OiAnc21hcnR0dicsXG4gIENvbnNvbGU6ICdjb25zb2xlJyxcbiAgV2VhcmFibGU6ICd3ZWFyYWJsZScsXG4gIEJyb3dzZXI6IHVuZGVmaW5lZFxufTtcbnZhciBCcm93c2VyVHlwZXMgPSB7XG4gIENocm9tZTogJ0Nocm9tZScsXG4gIEZpcmVmb3g6IFwiRmlyZWZveFwiLFxuICBPcGVyYTogXCJPcGVyYVwiLFxuICBZYW5kZXg6IFwiWWFuZGV4XCIsXG4gIFNhZmFyaTogXCJTYWZhcmlcIixcbiAgSW50ZXJuZXRFeHBsb3JlcjogXCJJbnRlcm5ldCBFeHBsb3JlclwiLFxuICBFZGdlOiBcIkVkZ2VcIixcbiAgQ2hyb21pdW06IFwiQ2hyb21pdW1cIixcbiAgSWU6ICdJRScsXG4gIE1vYmlsZVNhZmFyaTogXCJNb2JpbGUgU2FmYXJpXCIsXG4gIEVkZ2VDaHJvbWl1bTogXCJFZGdlIENocm9taXVtXCIsXG4gIE1JVUk6IFwiTUlVSSBCcm93c2VyXCIsXG4gIFNhbXN1bmdCcm93c2VyOiAnU2Ftc3VuZyBCcm93c2VyJ1xufTtcbnZhciBPc1R5cGVzID0ge1xuICBJT1M6ICdpT1MnLFxuICBBbmRyb2lkOiBcIkFuZHJvaWRcIixcbiAgV2luZG93c1Bob25lOiBcIldpbmRvd3MgUGhvbmVcIixcbiAgV2luZG93czogJ1dpbmRvd3MnLFxuICBNQUNfT1M6ICdNYWMgT1MnXG59O1xudmFyIGluaXRpYWxEYXRhID0ge1xuICBpc01vYmlsZTogZmFsc2UsXG4gIGlzVGFibGV0OiBmYWxzZSxcbiAgaXNCcm93c2VyOiBmYWxzZSxcbiAgaXNTbWFydFRWOiBmYWxzZSxcbiAgaXNDb25zb2xlOiBmYWxzZSxcbiAgaXNXZWFyYWJsZTogZmFsc2Vcbn07XG5cbnZhciBjaGVja1R5cGUgPSBmdW5jdGlvbiBjaGVja1R5cGUodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERldmljZVR5cGVzLk1vYmlsZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTW9iaWxlOiB0cnVlXG4gICAgICB9O1xuXG4gICAgY2FzZSBEZXZpY2VUeXBlcy5UYWJsZXQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1RhYmxldDogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuU21hcnRUdjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzU21hcnRUVjogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuQ29uc29sZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQ29uc29sZTogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuV2VhcmFibGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1dlYXJhYmxlOiB0cnVlXG4gICAgICB9O1xuXG4gICAgY2FzZSBEZXZpY2VUeXBlcy5Ccm93c2VyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNCcm93c2VyOiB0cnVlXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpbml0aWFsRGF0YTtcbiAgfVxufTtcblxudmFyIGJyb1BheWxvYWQgPSBmdW5jdGlvbiBicm9QYXlsb2FkKGlzQnJvd3NlciwgYnJvd3NlciwgZW5naW5lLCBvcywgdWEpIHtcbiAgcmV0dXJuIHtcbiAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlcixcbiAgICBicm93c2VyTWFqb3JWZXJzaW9uOiBzZXREZWZhdWx0cyhicm93c2VyLm1ham9yKSxcbiAgICBicm93c2VyRnVsbFZlcnNpb246IHNldERlZmF1bHRzKGJyb3dzZXIudmVyc2lvbiksXG4gICAgYnJvd3Nlck5hbWU6IHNldERlZmF1bHRzKGJyb3dzZXIubmFtZSksXG4gICAgZW5naW5lTmFtZTogc2V0RGVmYXVsdHMoZW5naW5lLm5hbWUpLFxuICAgIGVuZ2luZVZlcnNpb246IHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKSxcbiAgICBvc05hbWU6IHNldERlZmF1bHRzKG9zLm5hbWUpLFxuICAgIG9zVmVyc2lvbjogc2V0RGVmYXVsdHMob3MudmVyc2lvbiksXG4gICAgdXNlckFnZW50OiBzZXREZWZhdWx0cyh1YSlcbiAgfTtcbn07XG5cbnZhciBtb2JpbGVQYXlsb2FkID0gZnVuY3Rpb24gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSkge1xuICByZXR1cm4gX29iamVjdFNwcmVhZDIoe30sIHR5cGUsIHtcbiAgICB2ZW5kb3I6IHNldERlZmF1bHRzKGRldmljZS52ZW5kb3IpLFxuICAgIG1vZGVsOiBzZXREZWZhdWx0cyhkZXZpY2UubW9kZWwpLFxuICAgIG9zOiBzZXREZWZhdWx0cyhvcy5uYW1lKSxcbiAgICBvc1ZlcnNpb246IHNldERlZmF1bHRzKG9zLnZlcnNpb24pLFxuICAgIHVhOiBzZXREZWZhdWx0cyh1YSlcbiAgfSk7XG59O1xuXG52YXIgc3R2UGF5bG9hZCA9IGZ1bmN0aW9uIHN0dlBheWxvYWQoaXNTbWFydFRWLCBlbmdpbmUsIG9zLCB1YSkge1xuICByZXR1cm4ge1xuICAgIGlzU21hcnRUVjogaXNTbWFydFRWLFxuICAgIGVuZ2luZU5hbWU6IHNldERlZmF1bHRzKGVuZ2luZS5uYW1lKSxcbiAgICBlbmdpbmVWZXJzaW9uOiBzZXREZWZhdWx0cyhlbmdpbmUudmVyc2lvbiksXG4gICAgb3NOYW1lOiBzZXREZWZhdWx0cyhvcy5uYW1lKSxcbiAgICBvc1ZlcnNpb246IHNldERlZmF1bHRzKG9zLnZlcnNpb24pLFxuICAgIHVzZXJBZ2VudDogc2V0RGVmYXVsdHModWEpXG4gIH07XG59O1xuXG52YXIgY29uc29sZVBheWxvYWQgPSBmdW5jdGlvbiBjb25zb2xlUGF5bG9hZChpc0NvbnNvbGUsIGVuZ2luZSwgb3MsIHVhKSB7XG4gIHJldHVybiB7XG4gICAgaXNDb25zb2xlOiBpc0NvbnNvbGUsXG4gICAgZW5naW5lTmFtZTogc2V0RGVmYXVsdHMoZW5naW5lLm5hbWUpLFxuICAgIGVuZ2luZVZlcnNpb246IHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKSxcbiAgICBvc05hbWU6IHNldERlZmF1bHRzKG9zLm5hbWUpLFxuICAgIG9zVmVyc2lvbjogc2V0RGVmYXVsdHMob3MudmVyc2lvbiksXG4gICAgdXNlckFnZW50OiBzZXREZWZhdWx0cyh1YSlcbiAgfTtcbn07XG5cbnZhciB3ZWFyUGF5bG9hZCA9IGZ1bmN0aW9uIHdlYXJQYXlsb2FkKGlzV2VhcmFibGUsIGVuZ2luZSwgb3MsIHVhKSB7XG4gIHJldHVybiB7XG4gICAgaXNXZWFyYWJsZTogaXNXZWFyYWJsZSxcbiAgICBlbmdpbmVOYW1lOiBzZXREZWZhdWx0cyhlbmdpbmUubmFtZSksXG4gICAgZW5naW5lVmVyc2lvbjogc2V0RGVmYXVsdHMoZW5naW5lLnZlcnNpb24pLFxuICAgIG9zTmFtZTogc2V0RGVmYXVsdHMob3MubmFtZSksXG4gICAgb3NWZXJzaW9uOiBzZXREZWZhdWx0cyhvcy52ZXJzaW9uKSxcbiAgICB1c2VyQWdlbnQ6IHNldERlZmF1bHRzKHVhKVxuICB9O1xufTtcblxudmFyIHR5cGUgPSBjaGVja1R5cGUoZGV2aWNlLnR5cGUpO1xuXG5mdW5jdGlvbiBkZXZpY2VEZXRlY3QoKSB7XG4gIHZhciBpc0Jyb3dzZXIgPSB0eXBlLmlzQnJvd3NlcixcbiAgICAgIGlzTW9iaWxlID0gdHlwZS5pc01vYmlsZSxcbiAgICAgIGlzVGFibGV0ID0gdHlwZS5pc1RhYmxldCxcbiAgICAgIGlzU21hcnRUViA9IHR5cGUuaXNTbWFydFRWLFxuICAgICAgaXNDb25zb2xlID0gdHlwZS5pc0NvbnNvbGUsXG4gICAgICBpc1dlYXJhYmxlID0gdHlwZS5pc1dlYXJhYmxlO1xuXG4gIGlmIChpc0Jyb3dzZXIpIHtcbiAgICByZXR1cm4gYnJvUGF5bG9hZChpc0Jyb3dzZXIsIGJyb3dzZXIsIGVuZ2luZSwgb3MsIHVhKTtcbiAgfVxuXG4gIGlmIChpc1NtYXJ0VFYpIHtcbiAgICByZXR1cm4gc3R2UGF5bG9hZChpc1NtYXJ0VFYsIGVuZ2luZSwgb3MsIHVhKTtcbiAgfVxuXG4gIGlmIChpc0NvbnNvbGUpIHtcbiAgICByZXR1cm4gY29uc29sZVBheWxvYWQoaXNDb25zb2xlLCBlbmdpbmUsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNNb2JpbGUpIHtcbiAgICByZXR1cm4gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNUYWJsZXQpIHtcbiAgICByZXR1cm4gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNXZWFyYWJsZSkge1xuICAgIHJldHVybiB3ZWFyUGF5bG9hZChpc1dlYXJhYmxlLCBlbmdpbmUsIG9zLCB1YSk7XG4gIH1cbn1cblxudmFyIGlzTW9iaWxlVHlwZSA9IGZ1bmN0aW9uIGlzTW9iaWxlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5Nb2JpbGU7XG59O1xuXG52YXIgaXNUYWJsZXRUeXBlID0gZnVuY3Rpb24gaXNUYWJsZXRUeXBlKCkge1xuICByZXR1cm4gZGV2aWNlLnR5cGUgPT09IERldmljZVR5cGVzLlRhYmxldDtcbn07XG5cbnZhciBpc01vYmlsZUFuZFRhYmxldFR5cGUgPSBmdW5jdGlvbiBpc01vYmlsZUFuZFRhYmxldFR5cGUoKSB7XG4gIHN3aXRjaCAoZGV2aWNlLnR5cGUpIHtcbiAgICBjYXNlIERldmljZVR5cGVzLk1vYmlsZTpcbiAgICBjYXNlIERldmljZVR5cGVzLlRhYmxldDpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGlzRWRnZUNocm9taXVtVHlwZSA9IGZ1bmN0aW9uIGlzRWRnZUNocm9taXVtVHlwZSgpIHtcbiAgcmV0dXJuIHR5cGVvZiB1YSA9PT0gJ3N0cmluZycgJiYgdWEuaW5kZXhPZignRWRnLycpICE9PSAtMTtcbn07XG5cbnZhciBpc1NtYXJ0VFZUeXBlID0gZnVuY3Rpb24gaXNTbWFydFRWVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5TbWFydFR2O1xufTtcblxudmFyIGlzQnJvd3NlclR5cGUgPSBmdW5jdGlvbiBpc0Jyb3dzZXJUeXBlKCkge1xuICByZXR1cm4gZGV2aWNlLnR5cGUgPT09IERldmljZVR5cGVzLkJyb3dzZXI7XG59O1xuXG52YXIgaXNXZWFyYWJsZVR5cGUgPSBmdW5jdGlvbiBpc1dlYXJhYmxlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5XZWFyYWJsZTtcbn07XG5cbnZhciBpc0NvbnNvbGVUeXBlID0gZnVuY3Rpb24gaXNDb25zb2xlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5Db25zb2xlO1xufTtcblxudmFyIGlzQW5kcm9pZFR5cGUgPSBmdW5jdGlvbiBpc0FuZHJvaWRUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5BbmRyb2lkO1xufTtcblxudmFyIGlzV2luZG93c1R5cGUgPSBmdW5jdGlvbiBpc1dpbmRvd3NUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5XaW5kb3dzO1xufTtcblxudmFyIGlzTWFjT3NUeXBlID0gZnVuY3Rpb24gaXNNYWNPc1R5cGUoKSB7XG4gIHJldHVybiBvcy5uYW1lID09PSBPc1R5cGVzLk1BQ19PUztcbn07XG5cbnZhciBpc1dpblBob25lVHlwZSA9IGZ1bmN0aW9uIGlzV2luUGhvbmVUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5XaW5kb3dzUGhvbmU7XG59O1xuXG52YXIgaXNJT1NUeXBlID0gZnVuY3Rpb24gaXNJT1NUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5JT1M7XG59O1xuXG52YXIgaXNDaHJvbWVUeXBlID0gZnVuY3Rpb24gaXNDaHJvbWVUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuQ2hyb21lO1xufTtcblxudmFyIGlzRmlyZWZveFR5cGUgPSBmdW5jdGlvbiBpc0ZpcmVmb3hUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuRmlyZWZveDtcbn07XG5cbnZhciBpc0Nocm9taXVtVHlwZSA9IGZ1bmN0aW9uIGlzQ2hyb21pdW1UeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuQ2hyb21pdW07XG59O1xuXG52YXIgaXNFZGdlVHlwZSA9IGZ1bmN0aW9uIGlzRWRnZVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5FZGdlO1xufTtcblxudmFyIGlzWWFuZGV4VHlwZSA9IGZ1bmN0aW9uIGlzWWFuZGV4VHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLllhbmRleDtcbn07XG5cbnZhciBpc1NhZmFyaVR5cGUgPSBmdW5jdGlvbiBpc1NhZmFyaVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5TYWZhcmkgfHwgYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuTW9iaWxlU2FmYXJpO1xufTtcblxudmFyIGlzTW9iaWxlU2FmYXJpVHlwZSA9IGZ1bmN0aW9uIGlzTW9iaWxlU2FmYXJpVHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLk1vYmlsZVNhZmFyaTtcbn07XG5cbnZhciBpc09wZXJhVHlwZSA9IGZ1bmN0aW9uIGlzT3BlcmFUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuT3BlcmE7XG59O1xuXG52YXIgaXNJRVR5cGUgPSBmdW5jdGlvbiBpc0lFVHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLkludGVybmV0RXhwbG9yZXIgfHwgYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuSWU7XG59O1xuXG52YXIgaXNNSVVJVHlwZSA9IGZ1bmN0aW9uIGlzTUlVSVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5NSVVJO1xufTtcblxudmFyIGlzU2Ftc3VuZ0Jyb3dzZXJUeXBlID0gZnVuY3Rpb24gaXNTYW1zdW5nQnJvd3NlclR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5TYW1zdW5nQnJvd3Nlcjtcbn07XG5cbnZhciBpc0VsZWN0cm9uVHlwZSA9IGZ1bmN0aW9uIGlzRWxlY3Ryb25UeXBlKCkge1xuICB2YXIgbmF2ID0gZ2V0TmF2aWdhdG9ySW5zdGFuY2UoKTtcbiAgdmFyIHVhID0gbmF2ICYmIG5hdi51c2VyQWdlbnQgJiYgbmF2LnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdHlwZW9mIHVhID09PSAnc3RyaW5nJyA/IC9lbGVjdHJvbi8udGVzdCh1YSkgOiBmYWxzZTtcbn07XG5cbnZhciBnZXRJT1MxMyA9IGZ1bmN0aW9uIGdldElPUzEzKCkge1xuICB2YXIgbmF2ID0gZ2V0TmF2aWdhdG9ySW5zdGFuY2UoKTtcbiAgcmV0dXJuIG5hdiAmJiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2LnBsYXRmb3JtKSB8fCBuYXYucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMSkgJiYgIXdpbmRvdy5NU1N0cmVhbTtcbn07XG5cbnZhciBnZXRJUGFkMTMgPSBmdW5jdGlvbiBnZXRJUGFkMTMoKSB7XG4gIHJldHVybiBpc0lPUzEzQ2hlY2soJ2lQYWQnKTtcbn07XG5cbnZhciBnZXRJcGhvbmUxMyA9IGZ1bmN0aW9uIGdldElwaG9uZTEzKCkge1xuICByZXR1cm4gaXNJT1MxM0NoZWNrKCdpUGhvbmUnKTtcbn07XG5cbnZhciBnZXRJUG9kMTMgPSBmdW5jdGlvbiBnZXRJUG9kMTMoKSB7XG4gIHJldHVybiBpc0lPUzEzQ2hlY2soJ2lQb2QnKTtcbn07XG5cbnZhciBnZXRCcm93c2VyRnVsbFZlcnNpb24gPSBmdW5jdGlvbiBnZXRCcm93c2VyRnVsbFZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhicm93c2VyLnZlcnNpb24pO1xufTtcblxudmFyIGdldEJyb3dzZXJWZXJzaW9uID0gZnVuY3Rpb24gZ2V0QnJvd3NlclZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhicm93c2VyLm1ham9yKTtcbn07XG5cbnZhciBnZXRPc1ZlcnNpb24gPSBmdW5jdGlvbiBnZXRPc1ZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhvcy52ZXJzaW9uKTtcbn07XG5cbnZhciBnZXRPc05hbWUgPSBmdW5jdGlvbiBnZXRPc05hbWUoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhvcy5uYW1lKTtcbn07XG5cbnZhciBnZXRCcm93c2VyTmFtZSA9IGZ1bmN0aW9uIGdldEJyb3dzZXJOYW1lKCkge1xuICByZXR1cm4gc2V0RGVmYXVsdHMoYnJvd3Nlci5uYW1lKTtcbn07XG5cbnZhciBnZXRNb2JpbGVWZW5kb3IgPSBmdW5jdGlvbiBnZXRNb2JpbGVWZW5kb3IoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhkZXZpY2UudmVuZG9yKTtcbn07XG5cbnZhciBnZXRNb2JpbGVNb2RlbCA9IGZ1bmN0aW9uIGdldE1vYmlsZU1vZGVsKCkge1xuICByZXR1cm4gc2V0RGVmYXVsdHMoZGV2aWNlLm1vZGVsKTtcbn07XG5cbnZhciBnZXRFbmdpbmVOYW1lID0gZnVuY3Rpb24gZ2V0RW5naW5lTmFtZSgpIHtcbiAgcmV0dXJuIHNldERlZmF1bHRzKGVuZ2luZS5uYW1lKTtcbn07XG5cbnZhciBnZXRFbmdpbmVWZXJzaW9uID0gZnVuY3Rpb24gZ2V0RW5naW5lVmVyc2lvbigpIHtcbiAgcmV0dXJuIHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKTtcbn07XG5cbnZhciBnZXRVc2VyYWdlbnQgPSBmdW5jdGlvbiBnZXRVc2VyYWdlbnQoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyh1YSk7XG59O1xuXG52YXIgZ2V0RGV2aWNlVHlwZSA9IGZ1bmN0aW9uIGdldERldmljZVR5cGUoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhkZXZpY2UudHlwZSwgJ2Jyb3dzZXInKTtcbn07XG5cbnZhciBpc1NtYXJ0VFYgPSBpc1NtYXJ0VFZUeXBlKCk7XG52YXIgaXNDb25zb2xlID0gaXNDb25zb2xlVHlwZSgpO1xudmFyIGlzV2VhcmFibGUgPSBpc1dlYXJhYmxlVHlwZSgpO1xudmFyIGlzTW9iaWxlU2FmYXJpID0gaXNNb2JpbGVTYWZhcmlUeXBlKCkgfHwgZ2V0SVBhZDEzKCk7XG52YXIgaXNDaHJvbWl1bSA9IGlzQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNNb2JpbGUgPSBpc01vYmlsZUFuZFRhYmxldFR5cGUoKSB8fCBnZXRJUGFkMTMoKTtcbnZhciBpc01vYmlsZU9ubHkgPSBpc01vYmlsZVR5cGUoKTtcbnZhciBpc1RhYmxldCA9IGlzVGFibGV0VHlwZSgpIHx8IGdldElQYWQxMygpO1xudmFyIGlzQnJvd3NlciA9IGlzQnJvd3NlclR5cGUoKTtcbnZhciBpc0Rlc2t0b3AgPSBpc0Jyb3dzZXJUeXBlKCk7XG52YXIgaXNBbmRyb2lkID0gaXNBbmRyb2lkVHlwZSgpO1xudmFyIGlzV2luUGhvbmUgPSBpc1dpblBob25lVHlwZSgpO1xudmFyIGlzSU9TID0gaXNJT1NUeXBlKCkgfHwgZ2V0SVBhZDEzKCk7XG52YXIgaXNDaHJvbWUgPSBpc0Nocm9tZVR5cGUoKTtcbnZhciBpc0ZpcmVmb3ggPSBpc0ZpcmVmb3hUeXBlKCk7XG52YXIgaXNTYWZhcmkgPSBpc1NhZmFyaVR5cGUoKTtcbnZhciBpc09wZXJhID0gaXNPcGVyYVR5cGUoKTtcbnZhciBpc0lFID0gaXNJRVR5cGUoKTtcbnZhciBvc1ZlcnNpb24gPSBnZXRPc1ZlcnNpb24oKTtcbnZhciBvc05hbWUgPSBnZXRPc05hbWUoKTtcbnZhciBmdWxsQnJvd3NlclZlcnNpb24gPSBnZXRCcm93c2VyRnVsbFZlcnNpb24oKTtcbnZhciBicm93c2VyVmVyc2lvbiA9IGdldEJyb3dzZXJWZXJzaW9uKCk7XG52YXIgYnJvd3Nlck5hbWUgPSBnZXRCcm93c2VyTmFtZSgpO1xudmFyIG1vYmlsZVZlbmRvciA9IGdldE1vYmlsZVZlbmRvcigpO1xudmFyIG1vYmlsZU1vZGVsID0gZ2V0TW9iaWxlTW9kZWwoKTtcbnZhciBlbmdpbmVOYW1lID0gZ2V0RW5naW5lTmFtZSgpO1xudmFyIGVuZ2luZVZlcnNpb24gPSBnZXRFbmdpbmVWZXJzaW9uKCk7XG52YXIgZ2V0VUEgPSBnZXRVc2VyYWdlbnQoKTtcbnZhciBpc0VkZ2UgPSBpc0VkZ2VUeXBlKCkgfHwgaXNFZGdlQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNZYW5kZXggPSBpc1lhbmRleFR5cGUoKTtcbnZhciBkZXZpY2VUeXBlID0gZ2V0RGV2aWNlVHlwZSgpO1xudmFyIGlzSU9TMTMgPSBnZXRJT1MxMygpO1xudmFyIGlzSVBhZDEzID0gZ2V0SVBhZDEzKCk7XG52YXIgaXNJUGhvbmUxMyA9IGdldElwaG9uZTEzKCk7XG52YXIgaXNJUG9kMTMgPSBnZXRJUG9kMTMoKTtcbnZhciBpc0VsZWN0cm9uID0gaXNFbGVjdHJvblR5cGUoKTtcbnZhciBpc0VkZ2VDaHJvbWl1bSA9IGlzRWRnZUNocm9taXVtVHlwZSgpO1xudmFyIGlzTGVnYWN5RWRnZSA9IGlzRWRnZVR5cGUoKSAmJiAhaXNFZGdlQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNXaW5kb3dzID0gaXNXaW5kb3dzVHlwZSgpO1xudmFyIGlzTWFjT3MgPSBpc01hY09zVHlwZSgpO1xudmFyIGlzTUlVSSA9IGlzTUlVSVR5cGUoKTtcbnZhciBpc1NhbXN1bmdCcm93c2VyID0gaXNTYW1zdW5nQnJvd3NlclR5cGUoKTtcblxudmFyIEFuZHJvaWRWaWV3ID0gZnVuY3Rpb24gQW5kcm9pZFZpZXcoX3JlZikge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZi5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZi52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc0FuZHJvaWQgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBCcm93c2VyVmlldyA9IGZ1bmN0aW9uIEJyb3dzZXJWaWV3KF9yZWYyKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMi5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYyLmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWYyLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNCcm93c2VyID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgSUVWaWV3ID0gZnVuY3Rpb24gSUVWaWV3KF9yZWYzKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMy5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYzLmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWYzLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYzLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNJRSA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIElPU1ZpZXcgPSBmdW5jdGlvbiBJT1NWaWV3KF9yZWY0KSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmNC5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY0LmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWY0LnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWY0LnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjQsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNJT1MgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBNb2JpbGVWaWV3ID0gZnVuY3Rpb24gTW9iaWxlVmlldyhfcmVmNSkge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjUucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmNS5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmNS52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmNS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY1LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzTW9iaWxlID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgVGFibGV0VmlldyA9IGZ1bmN0aW9uIFRhYmxldFZpZXcoX3JlZjYpIHtcbiAgdmFyIHJlbmRlcldpdGhGcmFnbWVudCA9IF9yZWY2LnJlbmRlcldpdGhGcmFnbWVudCxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjYuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjYudmlld0NsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZjYuc3R5bGUsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNiwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc1RhYmxldCA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIFdpblBob25lVmlldyA9IGZ1bmN0aW9uIFdpblBob25lVmlldyhfcmVmNykge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjcucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmNy5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmNy52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmNy5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY3LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzV2luUGhvbmUgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBNb2JpbGVPbmx5VmlldyA9IGZ1bmN0aW9uIE1vYmlsZU9ubHlWaWV3KF9yZWY4KSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmOC5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY4LmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWY4LnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWY4LnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjgsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNNb2JpbGVPbmx5ID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgU21hcnRUVlZpZXcgPSBmdW5jdGlvbiBTbWFydFRWVmlldyhfcmVmOSkge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjkucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmOS5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmOS52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmOS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY5LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzU21hcnRUViA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIENvbnNvbGVWaWV3ID0gZnVuY3Rpb24gQ29uc29sZVZpZXcoX3JlZjEwKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTAucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTAuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjEwLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMC5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYxMCwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc0NvbnNvbGUgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBXZWFyYWJsZVZpZXcgPSBmdW5jdGlvbiBXZWFyYWJsZVZpZXcoX3JlZjExKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTEucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTEuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjExLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYxMSwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc1dlYXJhYmxlID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgQ3VzdG9tVmlldyA9IGZ1bmN0aW9uIEN1c3RvbVZpZXcoX3JlZjEyKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTIucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTIuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjEyLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMi5zdHlsZSxcbiAgICAgIGNvbmRpdGlvbiA9IF9yZWYxMi5jb25kaXRpb24sXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMTIsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY29uZGl0aW9uXCJdKTtcblxuICByZXR1cm4gY29uZGl0aW9uID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB3aXRoT3JpZW50YXRpb25DaGFuZ2UoV3JhcHBlZENvbXBvbmVudCkge1xuICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKF9jbGFzcywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBfY2xhc3MocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzcyk7XG5cbiAgICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKF9jbGFzcykuY2FsbCh0aGlzLCBwcm9wcykpO1xuICAgICAgX3RoaXMuaXNFdmVudExpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzLmhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlID0gX3RoaXMuaGFuZGxlT3JpZW50YXRpb25DaGFuZ2UuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgICBfdGhpcy5vbk9yaWVudGF0aW9uQ2hhbmdlID0gX3RoaXMub25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICAgIF90aGlzLm9uUGFnZUxvYWQgPSBfdGhpcy5vblBhZ2VMb2FkLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgaXNQb3J0cmFpdDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKF9jbGFzcywgW3tcbiAgICAgIGtleTogXCJoYW5kbGVPcmllbnRhdGlvbkNoYW5nZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFdmVudExpc3RlbmVyQWRkZWQpIHtcbiAgICAgICAgICB0aGlzLmlzRXZlbnRMaXN0ZW5lckFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmllbnRhdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoID4gd2luZG93LmlubmVySGVpZ2h0ID8gOTAgOiAwO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc1BvcnRyYWl0OiBvcmllbnRhdGlvbiA9PT0gMCxcbiAgICAgICAgICBpc0xhbmRzY2FwZTogb3JpZW50YXRpb24gPT09IDkwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJvbk9yaWVudGF0aW9uQ2hhbmdlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb25PcmllbnRhdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJvblBhZ2VMb2FkXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb25QYWdlTG9hZCgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAoKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZih3aW5kb3cpKSAhPT0gdW5kZWZpbmVkICYmIGlzTW9iaWxlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzRXZlbnRMaXN0ZW5lckFkZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgdGhpcy5vblBhZ2VMb2FkLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLCB0aGlzLm9uUGFnZUxvYWQsIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICAgIGlzTGFuZHNjYXBlOiB0aGlzLnN0YXRlLmlzTGFuZHNjYXBlLFxuICAgICAgICAgIGlzUG9ydHJhaXQ6IHRoaXMuc3RhdGUuaXNQb3J0cmFpdFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIF9jbGFzcztcbiAgfShSZWFjdF9fZGVmYXVsdC5Db21wb25lbnQpO1xufVxuXG5leHBvcnRzLkFuZHJvaWRWaWV3ID0gQW5kcm9pZFZpZXc7XG5leHBvcnRzLkJyb3dzZXJUeXBlcyA9IEJyb3dzZXJUeXBlcztcbmV4cG9ydHMuQnJvd3NlclZpZXcgPSBCcm93c2VyVmlldztcbmV4cG9ydHMuQ29uc29sZVZpZXcgPSBDb25zb2xlVmlldztcbmV4cG9ydHMuQ3VzdG9tVmlldyA9IEN1c3RvbVZpZXc7XG5leHBvcnRzLklFVmlldyA9IElFVmlldztcbmV4cG9ydHMuSU9TVmlldyA9IElPU1ZpZXc7XG5leHBvcnRzLk1vYmlsZU9ubHlWaWV3ID0gTW9iaWxlT25seVZpZXc7XG5leHBvcnRzLk1vYmlsZVZpZXcgPSBNb2JpbGVWaWV3O1xuZXhwb3J0cy5Pc1R5cGVzID0gT3NUeXBlcztcbmV4cG9ydHMuU21hcnRUVlZpZXcgPSBTbWFydFRWVmlldztcbmV4cG9ydHMuVGFibGV0VmlldyA9IFRhYmxldFZpZXc7XG5leHBvcnRzLldlYXJhYmxlVmlldyA9IFdlYXJhYmxlVmlldztcbmV4cG9ydHMuV2luUGhvbmVWaWV3ID0gV2luUGhvbmVWaWV3O1xuZXhwb3J0cy5icm93c2VyTmFtZSA9IGJyb3dzZXJOYW1lO1xuZXhwb3J0cy5icm93c2VyVmVyc2lvbiA9IGJyb3dzZXJWZXJzaW9uO1xuZXhwb3J0cy5kZXZpY2VEZXRlY3QgPSBkZXZpY2VEZXRlY3Q7XG5leHBvcnRzLmRldmljZVR5cGUgPSBkZXZpY2VUeXBlO1xuZXhwb3J0cy5lbmdpbmVOYW1lID0gZW5naW5lTmFtZTtcbmV4cG9ydHMuZW5naW5lVmVyc2lvbiA9IGVuZ2luZVZlcnNpb247XG5leHBvcnRzLmZ1bGxCcm93c2VyVmVyc2lvbiA9IGZ1bGxCcm93c2VyVmVyc2lvbjtcbmV4cG9ydHMuZ2V0VUEgPSBnZXRVQTtcbmV4cG9ydHMuaXNBbmRyb2lkID0gaXNBbmRyb2lkO1xuZXhwb3J0cy5pc0Jyb3dzZXIgPSBpc0Jyb3dzZXI7XG5leHBvcnRzLmlzQ2hyb21lID0gaXNDaHJvbWU7XG5leHBvcnRzLmlzQ2hyb21pdW0gPSBpc0Nocm9taXVtO1xuZXhwb3J0cy5pc0NvbnNvbGUgPSBpc0NvbnNvbGU7XG5leHBvcnRzLmlzRGVza3RvcCA9IGlzRGVza3RvcDtcbmV4cG9ydHMuaXNFZGdlID0gaXNFZGdlO1xuZXhwb3J0cy5pc0VkZ2VDaHJvbWl1bSA9IGlzRWRnZUNocm9taXVtO1xuZXhwb3J0cy5pc0VsZWN0cm9uID0gaXNFbGVjdHJvbjtcbmV4cG9ydHMuaXNGaXJlZm94ID0gaXNGaXJlZm94O1xuZXhwb3J0cy5pc0lFID0gaXNJRTtcbmV4cG9ydHMuaXNJT1MgPSBpc0lPUztcbmV4cG9ydHMuaXNJT1MxMyA9IGlzSU9TMTM7XG5leHBvcnRzLmlzSVBhZDEzID0gaXNJUGFkMTM7XG5leHBvcnRzLmlzSVBob25lMTMgPSBpc0lQaG9uZTEzO1xuZXhwb3J0cy5pc0lQb2QxMyA9IGlzSVBvZDEzO1xuZXhwb3J0cy5pc0xlZ2FjeUVkZ2UgPSBpc0xlZ2FjeUVkZ2U7XG5leHBvcnRzLmlzTUlVSSA9IGlzTUlVSTtcbmV4cG9ydHMuaXNNYWNPcyA9IGlzTWFjT3M7XG5leHBvcnRzLmlzTW9iaWxlID0gaXNNb2JpbGU7XG5leHBvcnRzLmlzTW9iaWxlT25seSA9IGlzTW9iaWxlT25seTtcbmV4cG9ydHMuaXNNb2JpbGVTYWZhcmkgPSBpc01vYmlsZVNhZmFyaTtcbmV4cG9ydHMuaXNPcGVyYSA9IGlzT3BlcmE7XG5leHBvcnRzLmlzU2FmYXJpID0gaXNTYWZhcmk7XG5leHBvcnRzLmlzU2Ftc3VuZ0Jyb3dzZXIgPSBpc1NhbXN1bmdCcm93c2VyO1xuZXhwb3J0cy5pc1NtYXJ0VFYgPSBpc1NtYXJ0VFY7XG5leHBvcnRzLmlzVGFibGV0ID0gaXNUYWJsZXQ7XG5leHBvcnRzLmlzV2VhcmFibGUgPSBpc1dlYXJhYmxlO1xuZXhwb3J0cy5pc1dpblBob25lID0gaXNXaW5QaG9uZTtcbmV4cG9ydHMuaXNXaW5kb3dzID0gaXNXaW5kb3dzO1xuZXhwb3J0cy5pc1lhbmRleCA9IGlzWWFuZGV4O1xuZXhwb3J0cy5tb2JpbGVNb2RlbCA9IG1vYmlsZU1vZGVsO1xuZXhwb3J0cy5tb2JpbGVWZW5kb3IgPSBtb2JpbGVWZW5kb3I7XG5leHBvcnRzLm9zTmFtZSA9IG9zTmFtZTtcbmV4cG9ydHMub3NWZXJzaW9uID0gb3NWZXJzaW9uO1xuZXhwb3J0cy53aXRoT3JpZW50YXRpb25DaGFuZ2UgPSB3aXRoT3JpZW50YXRpb25DaGFuZ2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1677\n')},4889:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_RESULT__;/*!@license\n * UAParser.js v0.7.28\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2021 Faisal Salman \n * Licensed under MIT License\n */\n(function (window, undefined) {\n "use strict";\n\n var LIBVERSION = "0.7.28",\n EMPTY = "",\n UNKNOWN = "?",\n FUNC_TYPE = "function",\n UNDEF_TYPE = "undefined",\n OBJ_TYPE = "object",\n STR_TYPE = "string",\n MAJOR = "major",\n MODEL = "model",\n NAME = "name",\n TYPE = "type",\n VENDOR = "vendor",\n VERSION = "version",\n ARCHITECTURE = "architecture",\n CONSOLE = "console",\n MOBILE = "mobile",\n TABLET = "tablet",\n SMARTTV = "smarttv",\n WEARABLE = "wearable",\n EMBEDDED = "embedded",\n UA_MAX_LENGTH = 255;\n var util = {\n extend: function extend(regexes, extensions) {\n var mergedRegexes = {};\n\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n\n return mergedRegexes;\n },\n has: function has(str1, str2) {\n return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;\n },\n lowerize: function lowerize(str) {\n return str.toLowerCase();\n },\n major: function major(version) {\n return typeof version === STR_TYPE ? version.replace(/[^\\d\\.]/g, "").split(".")[0] : undefined;\n },\n trim: function trim(str, len) {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, "");\n return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n var mapper = {\n rgx: function rgx(ua, arrays) {\n var i = 0,\n j,\n k,\n p,\n q,\n matches,\n match;\n\n while (i < arrays.length && !matches) {\n var regex = arrays[i],\n props = arrays[i + 1];\n j = k = 0;\n\n while (j < regex.length && !matches) {\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length == 2) {\n if (typeof q[1] == FUNC_TYPE) {\n this[q[0]] = q[1].call(this, match);\n } else {\n this[q[0]] = q[1];\n }\n } else if (q.length == 3) {\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n\n i += 2;\n }\n },\n str: function str(_str, map) {\n for (var i in map) {\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (util.has(map[i][j], _str)) {\n return i === UNKNOWN ? undefined : i;\n }\n }\n } else if (util.has(map[i], _str)) {\n return i === UNKNOWN ? undefined : i;\n }\n }\n\n return _str;\n }\n };\n var maps = {\n browser: {\n oldSafari: {\n version: {\n "1.0": "/8",\n 1.2: "/1",\n 1.3: "/3",\n "2.0": "/412",\n "2.0.2": "/416",\n "2.0.3": "/417",\n "2.0.4": "/419",\n "?": "/"\n }\n },\n oldEdge: {\n version: {\n .1: "12.",\n 21: "13.",\n 31: "14.",\n 39: "15.",\n 41: "16.",\n 42: "17.",\n 44: "18."\n }\n }\n },\n os: {\n windows: {\n version: {\n ME: "4.90",\n "NT 3.11": "NT3.51",\n "NT 4.0": "NT4.0",\n 2e3: "NT 5.0",\n XP: ["NT 5.1", "NT 5.2"],\n Vista: "NT 6.0",\n 7: "NT 6.1",\n 8: "NT 6.2",\n 8.1: "NT 6.3",\n 10: ["NT 6.4", "NT 10.0"],\n RT: "ARM"\n }\n }\n }\n };\n var regexes = {\n browser: [[/\\b(?:crmo|crios)\\/([\\w\\.]+)/i], [VERSION, [NAME, "Chrome"]], [/(?:edge|edgios|edga|edg)\\/([\\w\\.]+)/i], [VERSION, [NAME, "Edge"]], [/(opera\\smini)\\/([\\w\\.-]+)/i, /(opera\\s[mobiletab]{3,6})\\b.+version\\/([\\w\\.-]+)/i, /(opera)(?:.+version\\/|[\\/\\s]+)([\\w\\.]+)/i], [NAME, VERSION], [/opios[\\/\\s]+([\\w\\.]+)/i], [VERSION, [NAME, "Opera Mini"]], [/\\sopr\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera"]], [/(kindle)\\/([\\w\\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i, /(avant\\s|iemobile|slim)(?:browser)?[\\/\\s]?([\\w\\.]*)/i, /(ba?idubrowser)[\\/\\s]?([\\w\\.]+)/i, /(?:ms|\\()(ie)\\s([\\w\\.]+)/i, /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\\/([\\w\\.-]+)/i, /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([\\w\\.]+)/i, /(weibo)__([\\d\\.]+)/i], [NAME, VERSION], [/(?:[\\s\\/]uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i], [VERSION, [NAME, "UCBrowser"]], [/(?:windowswechat)?\\sqbcore\\/([\\w\\.]+)\\b.*(?:windowswechat)?/i], [VERSION, [NAME, "WeChat(Win) Desktop"]], [/micromessenger\\/([\\w\\.]+)/i], [VERSION, [NAME, "WeChat"]], [/konqueror\\/([\\w\\.]+)/i], [VERSION, [NAME, "Konqueror"]], [/trident.+rv[:\\s]([\\w\\.]{1,9})\\b.+like\\sgecko/i], [VERSION, [NAME, "IE"]], [/yabrowser\\/([\\w\\.]+)/i], [VERSION, [NAME, "Yandex"]], [/(avast|avg)\\/([\\w\\.]+)/i], [[NAME, /(.+)/, "$1 Secure Browser"], VERSION], [/focus\\/([\\w\\.]+)/i], [VERSION, [NAME, "Firefox Focus"]], [/opt\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera Touch"]], [/coc_coc_browser\\/([\\w\\.]+)/i], [VERSION, [NAME, "Coc Coc"]], [/dolfin\\/([\\w\\.]+)/i], [VERSION, [NAME, "Dolphin"]], [/coast\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera Coast"]], [/xiaomi\\/miuibrowser\\/([\\w\\.]+)/i], [VERSION, [NAME, "MIUI Browser"]], [/fxios\\/([\\w\\.-]+)/i], [VERSION, [NAME, "Firefox"]], [/(qihu|qhbrowser|qihoobrowser|360browser)/i], [[NAME, "360 Browser"]], [/(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i], [[NAME, /(.+)/, "$1 Browser"], VERSION], [/(comodo_dragon)\\/([\\w\\.]+)/i], [[NAME, /_/g, " "], VERSION], [/\\s(electron)\\/([\\w\\.]+)\\ssafari/i, /(tesla)(?:\\sqtcarbrowser|\\/(20[12]\\d\\.[\\w\\.-]+))/i, /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/\\s]?([\\w\\.]+)/i], [NAME, VERSION], [/(MetaSr)[\\/\\s]?([\\w\\.]+)/i, /(LBBROWSER)/i], [NAME], [/;fbav\\/([\\w\\.]+);/i], [VERSION, [NAME, "Facebook"]], [/FBAN\\/FBIOS|FB_IAB\\/FB4A/i], [[NAME, "Facebook"]], [/safari\\s(line)\\/([\\w\\.]+)/i, /\\b(line)\\/([\\w\\.]+)\\/iab/i, /(chromium|instagram)[\\/\\s]([\\w\\.-]+)/i], [NAME, VERSION], [/\\bgsa\\/([\\w\\.]+)\\s.*safari\\//i], [VERSION, [NAME, "GSA"]], [/headlesschrome(?:\\/([\\w\\.]+)|\\s)/i], [VERSION, [NAME, "Chrome Headless"]], [/\\swv\\).+(chrome)\\/([\\w\\.]+)/i], [[NAME, "Chrome WebView"], VERSION], [/droid.+\\sversion\\/([\\w\\.]+)\\b.+(?:mobile\\ssafari|safari)/i], [VERSION, [NAME, "Android Browser"]], [/(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i], [NAME, VERSION], [/version\\/([\\w\\.]+)\\s.*mobile\\/\\w+\\s(safari)/i], [VERSION, [NAME, "Mobile Safari"]], [/version\\/([\\w\\.]+)\\s.*(mobile\\s?safari|safari)/i], [VERSION, NAME], [/webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [/(webkit|khtml)\\/([\\w\\.]+)/i], [NAME, VERSION], [/(navigator|netscape)\\/([\\w\\.-]+)/i], [[NAME, "Netscape"], VERSION], [/ile\\svr;\\srv:([\\w\\.]+)\\).+firefox/i], [VERSION, [NAME, "Firefox Reality"]], [/ekiohf.+(flow)\\/([\\w\\.]+)/i, /(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i, /(firefox)\\/([\\w\\.]+)\\s[\\w\\s\\-]+\\/[\\w\\.]+$/i, /(mozilla)\\/([\\w\\.]+)\\s.+rv\\:.+gecko\\/\\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i, /(links)\\s\\(([\\w\\.]+)/i, /(gobrowser)\\/?([\\w\\.]*)/i, /(ice\\s?browser)\\/v?([\\w\\._]+)/i, /(mosaic)[\\/\\s]([\\w\\.]+)/i], [NAME, VERSION]],\n cpu: [[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i], [[ARCHITECTURE, "amd64"]], [/(ia32(?=;))/i], [[ARCHITECTURE, util.lowerize]], [/((?:i[346]|x)86)[;\\)]/i], [[ARCHITECTURE, "ia32"]], [/\\b(aarch64|armv?8e?l?)\\b/i], [[ARCHITECTURE, "arm64"]], [/\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i], [[ARCHITECTURE, "armhf"]], [/windows\\s(ce|mobile);\\sppc;/i], [[ARCHITECTURE, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i], [[ARCHITECTURE, /ower/, "", util.lowerize]], [/(sun4\\w)[;\\)]/i], [[ARCHITECTURE, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i], [[ARCHITECTURE, util.lowerize]]],\n device: [[/\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus\\s10)/i], [MODEL, [VENDOR, "Samsung"], [TYPE, TABLET]], [/\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy\\snexus)/i, /\\ssamsung[\\s-]([\\w-]+)/i, /sec-(sgh\\w+)/i], [MODEL, [VENDOR, "Samsung"], [TYPE, MOBILE]], [/\\((ip(?:hone|od)[\\s\\w]*);/i], [MODEL, [VENDOR, "Apple"], [TYPE, MOBILE]], [/\\((ipad);[\\w\\s\\),;-]+apple/i, /applecoremedia\\/[\\w\\.]+\\s\\((ipad)/i, /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i], [MODEL, [VENDOR, "Apple"], [TYPE, TABLET]], [/\\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\\d{2})/i], [MODEL, [VENDOR, "Huawei"], [TYPE, TABLET]], [/d\\/huawei([\\w\\s-]+)[;\\)]/i, /\\b(nexus\\s6p|vog-[at]?l\\d\\d|ane-[at]?l[x\\d]\\d|eml-a?l\\d\\da?|lya-[at]?l\\d[\\dc]|clt-a?l\\d\\di?|ele-l\\d\\d)/i, /\\b(\\w{2,4}-[atu][ln][01259][019])[;\\)\\s]/i], [MODEL, [VENDOR, "Huawei"], [TYPE, MOBILE]], [/\\b(poco[\\s\\w]+)(?:\\sbuild|\\))/i, /\\b;\\s(\\w+)\\sbuild\\/hm\\1/i, /\\b(hm[\\s\\-_]?note?[\\s_]?(?:\\d\\w)?)\\sbuild/i, /\\b(redmi[\\s\\-_]?(?:note|k)?[\\w\\s_]+)(?:\\sbuild|\\))/i, /\\b(mi[\\s\\-_]?(?:a\\d|one|one[\\s_]plus|note lte)?[\\s_]?(?:\\d?\\w?)[\\s_]?(?:plus)?)\\sbuild/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, MOBILE]], [/\\b(mi[\\s\\-_]?(?:pad)(?:[\\w\\s_]+))(?:\\sbuild|\\))/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, TABLET]], [/;\\s(\\w+)\\sbuild.+\\soppo/i, /\\s(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i], [MODEL, [VENDOR, "OPPO"], [TYPE, MOBILE]], [/\\svivo\\s(\\w+)(?:\\sbuild|\\))/i, /\\s(v[12]\\d{3}\\w?[at])(?:\\sbuild|;)/i], [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]], [/\\s(rmx[12]\\d{3})(?:\\sbuild|;)/i], [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]], [/\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)\\b[\\w\\s]+build\\//i, /\\smot(?:orola)?[\\s-](\\w*)/i, /((?:moto[\\s\\w\\(\\)]+|xt\\d{3,4}|nexus\\s6)(?=\\sbuild|\\)))/i], [MODEL, [VENDOR, "Motorola"], [TYPE, MOBILE]], [/\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i], [MODEL, [VENDOR, "Motorola"], [TYPE, TABLET]], [/((?=lg)?[vl]k\\-?\\d{3})\\sbuild|\\s3\\.[\\s\\w;-]{10}lg?-([06cv9]{3,4})/i], [MODEL, [VENDOR, "LG"], [TYPE, TABLET]], [/(lm-?f100[nv]?|nexus\\s[45])/i, /lg[e;\\s\\/-]+((?!browser|netcast)\\w+)/i, /\\blg(\\-?[\\d\\w]+)\\sbuild/i], [MODEL, [VENDOR, "LG"], [TYPE, MOBILE]], [/(ideatab[\\w\\-\\s]+)/i, /lenovo\\s?(s(?:5000|6000)(?:[\\w-]+)|tab(?:[\\s\\w]+)|yt[\\d\\w-]{6}|tb[\\d\\w-]{6})/i], [MODEL, [VENDOR, "Lenovo"], [TYPE, TABLET]], [/(?:maemo|nokia).*(n900|lumia\\s\\d+)/i, /nokia[\\s_-]?([\\w\\.-]*)/i], [[MODEL, /_/g, " "], [VENDOR, "Nokia"], [TYPE, MOBILE]], [/droid.+;\\s(pixel\\sc)[\\s)]/i], [MODEL, [VENDOR, "Google"], [TYPE, TABLET]], [/droid.+;\\s(pixel[\\s\\daxl]{0,6})(?:\\sbuild|\\))/i], [MODEL, [VENDOR, "Google"], [TYPE, MOBILE]], [/droid.+\\s([c-g]\\d{4}|so[-l]\\w+|xq-a\\w[4-7][12])(?=\\sbuild\\/|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i], [MODEL, [VENDOR, "Sony"], [TYPE, MOBILE]], [/sony\\stablet\\s[ps]\\sbuild\\//i, /(?:sony)?sgp\\w+(?:\\sbuild\\/|\\))/i], [[MODEL, "Xperia Tablet"], [VENDOR, "Sony"], [TYPE, TABLET]], [/\\s(kb2005|in20[12]5|be20[12][59])\\b/i, /\\ba000(1)\\sbuild/i, /\\boneplus\\s(a\\d{4})[\\s)]/i], [MODEL, [VENDOR, "OnePlus"], [TYPE, MOBILE]], [/(alexa)webm/i, /(kf[a-z]{2}wi)(\\sbuild\\/|\\))/i, /(kf[a-z]+)(\\sbuild\\/|\\)).+silk\\//i], [MODEL, [VENDOR, "Amazon"], [TYPE, TABLET]], [/(sd|kf)[0349hijorstuw]+(\\sbuild\\/|\\)).+silk\\//i], [[MODEL, "Fire Phone"], [VENDOR, "Amazon"], [TYPE, MOBILE]], [/\\((playbook);[\\w\\s\\),;-]+(rim)/i], [MODEL, VENDOR, [TYPE, TABLET]], [/((?:bb[a-f]|st[hv])100-\\d)/i, /\\(bb10;\\s(\\w+)/i], [MODEL, [VENDOR, "BlackBerry"], [TYPE, MOBILE]], [/(?:\\b|asus_)(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus\\s7|padfone|p00[cj])/i], [MODEL, [VENDOR, "ASUS"], [TYPE, TABLET]], [/\\s(z[es]6[027][01][km][ls]|zenfone\\s\\d\\w?)\\b/i], [MODEL, [VENDOR, "ASUS"], [TYPE, MOBILE]], [/(nexus\\s9)/i], [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]], [/(htc)[;_\\s-]{1,2}([\\w\\s]+(?=\\)|\\sbuild)|\\w+)/i, /(zte)-(\\w*)/i, /(alcatel|geeksphone|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i], [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]], [/droid[x\\d\\.\\s;]+\\s([ab][1-7]\\-?[0178a]\\d\\d?)/i], [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]], [/droid.+;\\s(m[1-5]\\snote)\\sbuild/i, /\\bmz-([\\w-]{2,})/i], [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]], [/(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i, /(hp)\\s([\\w\\s]+\\w)/i, /(asus)-?(\\w+)/i, /(microsoft);\\s(lumia[\\s\\w]+)/i, /(lenovo)[_\\s-]?([\\w-]+)/i, /linux;.+(jolla);/i, /droid.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/(archos)\\s(gamepad2?)/i, /(hp).+(touchpad(?!.+tablet)|tablet)/i, /(kindle)\\/([\\w\\.]+)/i, /\\s(nook)[\\w\\s]+build\\/(\\w+)/i, /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i, /[;\\/]\\s?(le[\\s\\-]+pan)[\\s\\-]+(\\w{1,9})\\sbuild/i, /[;\\/]\\s?(trinity)[\\-\\s]*(t\\d{3})\\sbuild/i, /\\b(gigaset)[\\s\\-]+(q\\w{1,9})\\sbuild/i, /\\b(vodafone)\\s([\\w\\s]+)(?:\\)|\\sbuild)/i], [VENDOR, MODEL, [TYPE, TABLET]], [/\\s(surface\\sduo)\\s/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, TABLET]], [/droid\\s[\\d\\.]+;\\s(fp\\du?)\\sbuild/i], [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]], [/\\s(u304aa)\\sbuild/i], [MODEL, [VENDOR, "AT&T"], [TYPE, MOBILE]], [/sie-(\\w*)/i], [MODEL, [VENDOR, "Siemens"], [TYPE, MOBILE]], [/[;\\/]\\s?(rct\\w+)\\sbuild/i], [MODEL, [VENDOR, "RCA"], [TYPE, TABLET]], [/[;\\/\\s](venue[\\d\\s]{2,7})\\sbuild/i], [MODEL, [VENDOR, "Dell"], [TYPE, TABLET]], [/[;\\/]\\s?(q(?:mv|ta)\\w+)\\sbuild/i], [MODEL, [VENDOR, "Verizon"], [TYPE, TABLET]], [/[;\\/]\\s(?:barnes[&\\s]+noble\\s|bn[rt])([\\w\\s\\+]*)\\sbuild/i], [MODEL, [VENDOR, "Barnes & Noble"], [TYPE, TABLET]], [/[;\\/]\\s(tm\\d{3}\\w+)\\sbuild/i], [MODEL, [VENDOR, "NuVision"], [TYPE, TABLET]], [/;\\s(k88)\\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, TABLET]], [/;\\s(nx\\d{3}j)\\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, MOBILE]], [/[;\\/]\\s?(gen\\d{3})\\sbuild.*49h/i], [MODEL, [VENDOR, "Swiss"], [TYPE, MOBILE]], [/[;\\/]\\s?(zur\\d{3})\\sbuild/i], [MODEL, [VENDOR, "Swiss"], [TYPE, TABLET]], [/[;\\/]\\s?((zeki)?tb.*\\b)\\sbuild/i], [MODEL, [VENDOR, "Zeki"], [TYPE, TABLET]], [/[;\\/]\\s([yr]\\d{2})\\sbuild/i, /[;\\/]\\s(dragon[\\-\\s]+touch\\s|dt)(\\w{5})\\sbuild/i], [[VENDOR, "Dragon Touch"], MODEL, [TYPE, TABLET]], [/[;\\/]\\s?(ns-?\\w{0,9})\\sbuild/i], [MODEL, [VENDOR, "Insignia"], [TYPE, TABLET]], [/[;\\/]\\s?((nxa|Next)-?\\w{0,9})\\sbuild/i], [MODEL, [VENDOR, "NextBook"], [TYPE, TABLET]], [/[;\\/]\\s?(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05]))\\sbuild/i], [[VENDOR, "Voice"], MODEL, [TYPE, MOBILE]], [/[;\\/]\\s?(lvtel\\-)?(v1[12])\\sbuild/i], [[VENDOR, "LvTel"], MODEL, [TYPE, MOBILE]], [/;\\s(ph-1)\\s/i], [MODEL, [VENDOR, "Essential"], [TYPE, MOBILE]], [/[;\\/]\\s?(v(100md|700na|7011|917g).*\\b)\\sbuild/i], [MODEL, [VENDOR, "Envizen"], [TYPE, TABLET]], [/[;\\/]\\s?(trio[\\s\\w\\-\\.]+)\\sbuild/i], [MODEL, [VENDOR, "MachSpeed"], [TYPE, TABLET]], [/[;\\/]\\s?tu_(1491)\\sbuild/i], [MODEL, [VENDOR, "Rotor"], [TYPE, TABLET]], [/(shield[\\w\\s]+)\\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, TABLET]], [/(sprint)\\s(\\w+)/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kin\\.[onetw]{3})/i], [[MODEL, /\\./g, " "], [VENDOR, "Microsoft"], [TYPE, MOBILE]], [/droid\\s[\\d\\.]+;\\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, TABLET]], [/droid\\s[\\d\\.]+;\\s(ec30|ps20|tc[2-8]\\d[kx])\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, MOBILE]], [/\\s(ouya)\\s/i, /(nintendo)\\s([wids3utch]+)/i], [VENDOR, MODEL, [TYPE, CONSOLE]], [/droid.+;\\s(shield)\\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, CONSOLE]], [/(playstation\\s[345portablevi]+)/i], [MODEL, [VENDOR, "Sony"], [TYPE, CONSOLE]], [/[\\s\\(;](xbox(?:\\sone)?(?!;\\sxbox))[\\s\\);]/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, CONSOLE]], [/smart-tv.+(samsung)/i], [VENDOR, [TYPE, SMARTTV]], [/hbbtv.+maple;(\\d+)/i], [[MODEL, /^/, "SmartTV"], [VENDOR, "Samsung"], [TYPE, SMARTTV]], [/(?:linux;\\snetcast.+smarttv|lg\\snetcast\\.tv-201\\d)/i], [[VENDOR, "LG"], [TYPE, SMARTTV]], [/(apple)\\s?tv/i], [VENDOR, [MODEL, "Apple TV"], [TYPE, SMARTTV]], [/crkey/i], [[MODEL, "Chromecast"], [VENDOR, "Google"], [TYPE, SMARTTV]], [/droid.+aft([\\w])(\\sbuild\\/|\\))/i], [MODEL, [VENDOR, "Amazon"], [TYPE, SMARTTV]], [/\\(dtv[\\);].+(aquos)/i], [MODEL, [VENDOR, "Sharp"], [TYPE, SMARTTV]], [/hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [/[\\s\\/\\(](android\\s|smart[-\\s]?|opera\\s)tv[;\\)\\s]/i], [[TYPE, SMARTTV]], [/((pebble))app\\/[\\d\\.]+\\s/i], [VENDOR, MODEL, [TYPE, WEARABLE]], [/droid.+;\\s(glass)\\s\\d/i], [MODEL, [VENDOR, "Google"], [TYPE, WEARABLE]], [/droid\\s[\\d\\.]+;\\s(wt63?0{2,3})\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, WEARABLE]], [/(tesla)(?:\\sqtcarbrowser|\\/20[12]\\d\\.[\\w\\.-]+)/i], [VENDOR, [TYPE, EMBEDDED]], [/droid .+?; ([^;]+?)(?: build|\\) applewebkit).+? mobile safari/i], [MODEL, [TYPE, MOBILE]], [/droid .+?;\\s([^;]+?)(?: build|\\) applewebkit).+?(?! mobile) safari/i], [MODEL, [TYPE, TABLET]], [/\\s(tablet|tab)[;\\/]/i, /\\s(mobile)(?:[;\\/]|\\ssafari)/i], [[TYPE, util.lowerize]], [/(android[\\w\\.\\s\\-]{0,9});.+build/i], [MODEL, [VENDOR, "Generic"]], [/(phone)/i], [[TYPE, MOBILE]]],\n engine: [[/windows.+\\sedge\\/([\\w\\.]+)/i], [VERSION, [NAME, "EdgeHTML"]], [/webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i], [VERSION, [NAME, "Blink"]], [/(presto)\\/([\\w\\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, /ekioh(flow)\\/([\\w\\.]+)/i, /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i, /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i], [NAME, VERSION], [/rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i], [VERSION, NAME]],\n os: [[/microsoft\\s(windows)\\s(vista|xp)/i], [NAME, VERSION], [/(windows)\\snt\\s6\\.2;\\s(arm)/i, /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i, /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)(?!.+xbox)/i], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [/(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i], [[NAME, "Windows"], [VERSION, mapper.str, maps.os.windows.version]], [/ip[honead]{2,4}\\b(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i, /cfnetwork\\/.+darwin/i], [[VERSION, /_/g, "."], [NAME, "iOS"]], [/(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i, /(macintosh|mac(?=_powerpc)\\s)(?!.+haiku)/i], [[NAME, "Mac OS"], [VERSION, /_/g, "."]], [/(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|sailfish|contiki)[\\/\\s-]?([\\w\\.]*)/i, /(blackberry)\\w*\\/([\\w\\.]*)/i, /(tizen|kaios)[\\/\\s]([\\w\\.]+)/i, /\\((series40);/i], [NAME, VERSION], [/\\(bb(10);/i], [VERSION, [NAME, "BlackBerry"]], [/(?:symbian\\s?os|symbos|s60(?=;)|series60)[\\/\\s-]?([\\w\\.]*)/i], [VERSION, [NAME, "Symbian"]], [/mozilla.+\\(mobile;.+gecko.+firefox/i], [[NAME, "Firefox OS"]], [/web0s;.+rt(tv)/i, /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i], [VERSION, [NAME, "webOS"]], [/crkey\\/([\\d\\.]+)/i], [VERSION, [NAME, "Chromecast"]], [/(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i], [[NAME, "Chromium OS"], VERSION], [/(nintendo|playstation)\\s([wids345portablevuch]+)/i, /(xbox);\\s+xbox\\s([^\\);]+)/i, /(mint)[\\/\\s\\(\\)]?(\\w*)/i, /(mageia|vectorlinux)[;\\s]/i, /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\\sgnu\\/linux)?(?:\\slinux)?[\\/\\s-]?(?!chrom|package)([\\w\\.-]*)/i, /(hurd|linux)\\s?([\\w\\.]*)/i, /(gnu)\\s?([\\w\\.]*)/i, /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, /(haiku)\\s(\\w+)/i], [NAME, VERSION], [/(sunos)\\s?([\\w\\.\\d]*)/i], [[NAME, "Solaris"], VERSION], [/((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i, /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i, /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms|fuchsia)/i, /(unix)\\s?([\\w\\.]*)/i], [NAME, VERSION]]\n };\n\n var UAParser = function UAParser(ua, extensions) {\n if (typeof ua === "object") {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || (typeof window !== "undefined" && window.navigator && window.navigator.userAgent ? window.navigator.userAgent : EMPTY);\n\n var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_browser, _ua, _rgxmap.browser);\n _browser.major = util.major(_browser.version);\n return _browser;\n };\n\n this.getCPU = function () {\n var _cpu = {\n architecture: undefined\n };\n mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n\n this.getDevice = function () {\n var _device = {\n vendor: undefined,\n model: undefined,\n type: undefined\n };\n mapper.rgx.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n\n this.getEngine = function () {\n var _engine = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n\n this.getOS = function () {\n var _os = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n\n this.getResult = function () {\n return {\n ua: this.getUA(),\n browser: this.getBrowser(),\n engine: this.getEngine(),\n os: this.getOS(),\n device: this.getDevice(),\n cpu: this.getCPU()\n };\n };\n\n this.getUA = function () {\n return _ua;\n };\n\n this.setUA = function (ua) {\n _ua = typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH ? util.trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = {\n NAME: NAME,\n MAJOR: MAJOR,\n VERSION: VERSION\n };\n UAParser.CPU = {\n ARCHITECTURE: ARCHITECTURE\n };\n UAParser.DEVICE = {\n MODEL: MODEL,\n VENDOR: VENDOR,\n TYPE: TYPE,\n CONSOLE: CONSOLE,\n MOBILE: MOBILE,\n SMARTTV: SMARTTV,\n TABLET: TABLET,\n WEARABLE: WEARABLE,\n EMBEDDED: EMBEDDED\n };\n UAParser.ENGINE = {\n NAME: NAME,\n VERSION: VERSION\n };\n UAParser.OS = {\n NAME: NAME,\n VERSION: VERSION\n };\n\n if (typeof exports !== UNDEF_TYPE) {\n if ("object" !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n\n exports.UAParser = UAParser;\n } else {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return UAParser;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n }\n\n var $ = typeof window !== "undefined" && (window.jQuery || window.Zepto);\n\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n\n $.ua.get = function () {\n return parser.getUA();\n };\n\n $.ua.set = function (uastring) {\n parser.setUA(uastring);\n var result = parser.getResult();\n\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n})(typeof window === "object" ? window : this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91YS1wYXJzZXItanMvZGlzdC91YS1wYXJzZXIubWluLmpzP2QxMjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQ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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLFFBQWE7QUFDckI7QUFDQTs7QUFFQSxJQUFJLGdCQUFnQjtBQUNwQixHQUFHO0FBQ0gsUUFBUSxJQUEwQztBQUNsRCxNQUFNLG1DQUFPO0FBQ2I7QUFDQSxPQUFPO0FBQUEsa0dBQUM7QUFDUixLQUFLLE1BQU0sRUFFTjtBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6IjQ4ODkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFAbGljZW5zZVxuICogVUFQYXJzZXIuanMgdjAuNy4yOFxuICogTGlnaHR3ZWlnaHQgSmF2YVNjcmlwdC1iYXNlZCBVc2VyLUFnZW50IHN0cmluZyBwYXJzZXJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWlzYWxtYW4vdWEtcGFyc2VyLWpzXG4gKlxuICogQ29weXJpZ2h0IMKpIDIwMTItMjAyMSBGYWlzYWwgU2FsbWFuIDxmQGZhaXNhbG1hbi5jb20+XG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgTGljZW5zZVxuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgdW5kZWZpbmVkKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBMSUJWRVJTSU9OID0gXCIwLjcuMjhcIixcbiAgICAgIEVNUFRZID0gXCJcIixcbiAgICAgIFVOS05PV04gPSBcIj9cIixcbiAgICAgIEZVTkNfVFlQRSA9IFwiZnVuY3Rpb25cIixcbiAgICAgIFVOREVGX1RZUEUgPSBcInVuZGVmaW5lZFwiLFxuICAgICAgT0JKX1RZUEUgPSBcIm9iamVjdFwiLFxuICAgICAgU1RSX1RZUEUgPSBcInN0cmluZ1wiLFxuICAgICAgTUFKT1IgPSBcIm1ham9yXCIsXG4gICAgICBNT0RFTCA9IFwibW9kZWxcIixcbiAgICAgIE5BTUUgPSBcIm5hbWVcIixcbiAgICAgIFRZUEUgPSBcInR5cGVcIixcbiAgICAgIFZFTkRPUiA9IFwidmVuZG9yXCIsXG4gICAgICBWRVJTSU9OID0gXCJ2ZXJzaW9uXCIsXG4gICAgICBBUkNISVRFQ1RVUkUgPSBcImFyY2hpdGVjdHVyZVwiLFxuICAgICAgQ09OU09MRSA9IFwiY29uc29sZVwiLFxuICAgICAgTU9CSUxFID0gXCJtb2JpbGVcIixcbiAgICAgIFRBQkxFVCA9IFwidGFibGV0XCIsXG4gICAgICBTTUFSVFRWID0gXCJzbWFydHR2XCIsXG4gICAgICBXRUFSQUJMRSA9IFwid2VhcmFibGVcIixcbiAgICAgIEVNQkVEREVEID0gXCJlbWJlZGRlZFwiLFxuICAgICAgVUFfTUFYX0xFTkdUSCA9IDI1NTtcbiAgdmFyIHV0aWwgPSB7XG4gICAgZXh0ZW5kOiBmdW5jdGlvbiBleHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykge1xuICAgICAgdmFyIG1lcmdlZFJlZ2V4ZXMgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiByZWdleGVzKSB7XG4gICAgICAgIGlmIChleHRlbnNpb25zW2ldICYmIGV4dGVuc2lvbnNbaV0ubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgICAgIG1lcmdlZFJlZ2V4ZXNbaV0gPSBleHRlbnNpb25zW2ldLmNvbmNhdChyZWdleGVzW2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXJnZWRSZWdleGVzW2ldID0gcmVnZXhlc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2VkUmVnZXhlcztcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKHN0cjEsIHN0cjIpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygc3RyMSA9PT0gU1RSX1RZUEUgPyBzdHIyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzdHIxLnRvTG93ZXJDYXNlKCkpICE9PSAtMSA6IGZhbHNlO1xuICAgIH0sXG4gICAgbG93ZXJpemU6IGZ1bmN0aW9uIGxvd2VyaXplKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH0sXG4gICAgbWFqb3I6IGZ1bmN0aW9uIG1ham9yKHZlcnNpb24pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gU1RSX1RZUEUgPyB2ZXJzaW9uLnJlcGxhY2UoL1teXFxkXFwuXS9nLCBcIlwiKS5zcGxpdChcIi5cIilbMF0gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICB0cmltOiBmdW5jdGlvbiB0cmltKHN0ciwgbGVuKSB7XG4gICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csIFwiXCIpO1xuICAgICAgcmV0dXJuIHR5cGVvZiBsZW4gPT09IFVOREVGX1RZUEUgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKDAsIFVBX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1hcHBlciA9IHtcbiAgICByZ3g6IGZ1bmN0aW9uIHJneCh1YSwgYXJyYXlzKSB7XG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgaixcbiAgICAgICAgICBrLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgcSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIG1hdGNoO1xuXG4gICAgICB3aGlsZSAoaSA8IGFycmF5cy5sZW5ndGggJiYgIW1hdGNoZXMpIHtcbiAgICAgICAgdmFyIHJlZ2V4ID0gYXJyYXlzW2ldLFxuICAgICAgICAgICAgcHJvcHMgPSBhcnJheXNbaSArIDFdO1xuICAgICAgICBqID0gayA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCByZWdleC5sZW5ndGggJiYgIW1hdGNoZXMpIHtcbiAgICAgICAgICBtYXRjaGVzID0gcmVnZXhbaisrXS5leGVjKHVhKTtcblxuICAgICAgICAgIGlmICghIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBwcm9wcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXNbKytrXTtcbiAgICAgICAgICAgICAgcSA9IHByb3BzW3BdO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcSA9PT0gT0JKX1RZUEUgJiYgcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHEubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PSBGVU5DX1RZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1txWzBdXSA9IHFbMV0uY2FsbCh0aGlzLCBtYXRjaCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PT0gRlVOQ19UWVBFICYmICEocVsxXS5leGVjICYmIHFbMV0udGVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1txWzBdXSA9IG1hdGNoID8gcVsxXS5jYWxsKHRoaXMsIG1hdGNoLCBxWzJdKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcVswXV0gPSBtYXRjaCA/IG1hdGNoLnJlcGxhY2UocVsxXSwgcVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzNdLmNhbGwodGhpcywgbWF0Y2gucmVwbGFjZShxWzFdLCBxWzJdKSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNbcV0gPSBtYXRjaCA/IG1hdGNoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAyO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3RyOiBmdW5jdGlvbiBzdHIoX3N0ciwgbWFwKSB7XG4gICAgICBmb3IgKHZhciBpIGluIG1hcCkge1xuICAgICAgICBpZiAodHlwZW9mIG1hcFtpXSA9PT0gT0JKX1RZUEUgJiYgbWFwW2ldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcFtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHV0aWwuaGFzKG1hcFtpXVtqXSwgX3N0cikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGkgPT09IFVOS05PV04gPyB1bmRlZmluZWQgOiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmhhcyhtYXBbaV0sIF9zdHIpKSB7XG4gICAgICAgICAgcmV0dXJuIGkgPT09IFVOS05PV04gPyB1bmRlZmluZWQgOiBpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfc3RyO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1hcHMgPSB7XG4gICAgYnJvd3Nlcjoge1xuICAgICAgb2xkU2FmYXJpOiB7XG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICBcIjEuMFwiOiBcIi84XCIsXG4gICAgICAgICAgMS4yOiBcIi8xXCIsXG4gICAgICAgICAgMS4zOiBcIi8zXCIsXG4gICAgICAgICAgXCIyLjBcIjogXCIvNDEyXCIsXG4gICAgICAgICAgXCIyLjAuMlwiOiBcIi80MTZcIixcbiAgICAgICAgICBcIjIuMC4zXCI6IFwiLzQxN1wiLFxuICAgICAgICAgIFwiMi4wLjRcIjogXCIvNDE5XCIsXG4gICAgICAgICAgXCI/XCI6IFwiL1wiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbGRFZGdlOiB7XG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAuMTogXCIxMi5cIixcbiAgICAgICAgICAyMTogXCIxMy5cIixcbiAgICAgICAgICAzMTogXCIxNC5cIixcbiAgICAgICAgICAzOTogXCIxNS5cIixcbiAgICAgICAgICA0MTogXCIxNi5cIixcbiAgICAgICAgICA0MjogXCIxNy5cIixcbiAgICAgICAgICA0NDogXCIxOC5cIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBvczoge1xuICAgICAgd2luZG93czoge1xuICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgTUU6IFwiNC45MFwiLFxuICAgICAgICAgIFwiTlQgMy4xMVwiOiBcIk5UMy41MVwiLFxuICAgICAgICAgIFwiTlQgNC4wXCI6IFwiTlQ0LjBcIixcbiAgICAgICAgICAyZTM6IFwiTlQgNS4wXCIsXG4gICAgICAgICAgWFA6IFtcIk5UIDUuMVwiLCBcIk5UIDUuMlwiXSxcbiAgICAgICAgICBWaXN0YTogXCJOVCA2LjBcIixcbiAgICAgICAgICA3OiBcIk5UIDYuMVwiLFxuICAgICAgICAgIDg6IFwiTlQgNi4yXCIsXG4gICAgICAgICAgOC4xOiBcIk5UIDYuM1wiLFxuICAgICAgICAgIDEwOiBbXCJOVCA2LjRcIiwgXCJOVCAxMC4wXCJdLFxuICAgICAgICAgIFJUOiBcIkFSTVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciByZWdleGVzID0ge1xuICAgIGJyb3dzZXI6IFtbL1xcYig/OmNybW98Y3Jpb3MpXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJDaHJvbWVcIl1dLCBbLyg/OmVkZ2V8ZWRnaW9zfGVkZ2F8ZWRnKVxcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRWRnZVwiXV0sIFsvKG9wZXJhXFxzbWluaSlcXC8oW1xcd1xcLi1dKykvaSwgLyhvcGVyYVxcc1ttb2JpbGV0YWJdezMsNn0pXFxiLit2ZXJzaW9uXFwvKFtcXHdcXC4tXSspL2ksIC8ob3BlcmEpKD86Lit2ZXJzaW9uXFwvfFtcXC9cXHNdKykoW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL29waW9zW1xcL1xcc10rKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBNaW5pXCJdXSwgWy9cXHNvcHJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIk9wZXJhXCJdXSwgWy8oa2luZGxlKVxcLyhbXFx3XFwuXSspL2ksIC8obHVuYXNjYXBlfG1heHRob258bmV0ZnJvbnR8amFzbWluZXxibGF6ZXIpW1xcL1xcc10/KFtcXHdcXC5dKikvaSwgLyhhdmFudFxcc3xpZW1vYmlsZXxzbGltKSg/OmJyb3dzZXIpP1tcXC9cXHNdPyhbXFx3XFwuXSopL2ksIC8oYmE/aWR1YnJvd3NlcilbXFwvXFxzXT8oW1xcd1xcLl0rKS9pLCAvKD86bXN8XFwoKShpZSlcXHMoW1xcd1xcLl0rKS9pLCAvKGZsb2NrfHJvY2ttZWx0fG1pZG9yaXxlcGlwaGFueXxzaWxrfHNreWZpcmV8b3ZpYnJvd3Nlcnxib2x0fGlyb258dml2YWxkaXxpcmlkaXVtfHBoYW50b21qc3xib3dzZXJ8cXVhcmt8cXVwemlsbGF8ZmFsa29uKVxcLyhbXFx3XFwuLV0rKS9pLCAvKHJla29ucXxwdWZmaW58YnJhdmV8d2hhbGV8cXFicm93c2VybGl0ZXxxcSlcXC8oW1xcd1xcLl0rKS9pLCAvKHdlaWJvKV9fKFtcXGRcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8oPzpbXFxzXFwvXXVjP1xccz9icm93c2VyfCg/Omp1Yy4rKXVjd2ViKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiVUNCcm93c2VyXCJdXSwgWy8oPzp3aW5kb3dzd2VjaGF0KT9cXHNxYmNvcmVcXC8oW1xcd1xcLl0rKVxcYi4qKD86d2luZG93c3dlY2hhdCk/L2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiV2VDaGF0KFdpbikgRGVza3RvcFwiXV0sIFsvbWljcm9tZXNzZW5nZXJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIldlQ2hhdFwiXV0sIFsva29ucXVlcm9yXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJLb25xdWVyb3JcIl1dLCBbL3RyaWRlbnQuK3J2WzpcXHNdKFtcXHdcXC5dezEsOX0pXFxiLitsaWtlXFxzZ2Vja28vaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJJRVwiXV0sIFsveWFicm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJZYW5kZXhcIl1dLCBbLyhhdmFzdHxhdmcpXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgLyguKykvLCBcIiQxIFNlY3VyZSBCcm93c2VyXCJdLCBWRVJTSU9OXSwgWy9mb2N1c1xcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRmlyZWZveCBGb2N1c1wiXV0sIFsvb3B0XFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBUb3VjaFwiXV0sIFsvY29jX2NvY19icm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJDb2MgQ29jXCJdXSwgWy9kb2xmaW5cXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkRvbHBoaW5cIl1dLCBbL2NvYXN0XFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBDb2FzdFwiXV0sIFsveGlhb21pXFwvbWl1aWJyb3dzZXJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIk1JVUkgQnJvd3NlclwiXV0sIFsvZnhpb3NcXC8oW1xcd1xcLi1dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJGaXJlZm94XCJdXSwgWy8ocWlodXxxaGJyb3dzZXJ8cWlob29icm93c2VyfDM2MGJyb3dzZXIpL2ldLCBbW05BTUUsIFwiMzYwIEJyb3dzZXJcIl1dLCBbLyhvY3VsdXN8c2Ftc3VuZ3xzYWlsZmlzaClicm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgLyguKykvLCBcIiQxIEJyb3dzZXJcIl0sIFZFUlNJT05dLCBbLyhjb21vZG9fZHJhZ29uKVxcLyhbXFx3XFwuXSspL2ldLCBbW05BTUUsIC9fL2csIFwiIFwiXSwgVkVSU0lPTl0sIFsvXFxzKGVsZWN0cm9uKVxcLyhbXFx3XFwuXSspXFxzc2FmYXJpL2ksIC8odGVzbGEpKD86XFxzcXRjYXJicm93c2VyfFxcLygyMFsxMl1cXGRcXC5bXFx3XFwuLV0rKSkvaSwgL20/KHFxYnJvd3NlcnxiYWlkdWJveGFwcHwyMzQ1RXhwbG9yZXIpW1xcL1xcc10/KFtcXHdcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8oTWV0YVNyKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ksIC8oTEJCUk9XU0VSKS9pXSwgW05BTUVdLCBbLztmYmF2XFwvKFtcXHdcXC5dKyk7L2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRmFjZWJvb2tcIl1dLCBbL0ZCQU5cXC9GQklPU3xGQl9JQUJcXC9GQjRBL2ldLCBbW05BTUUsIFwiRmFjZWJvb2tcIl1dLCBbL3NhZmFyaVxccyhsaW5lKVxcLyhbXFx3XFwuXSspL2ksIC9cXGIobGluZSlcXC8oW1xcd1xcLl0rKVxcL2lhYi9pLCAvKGNocm9taXVtfGluc3RhZ3JhbSlbXFwvXFxzXShbXFx3XFwuLV0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL1xcYmdzYVxcLyhbXFx3XFwuXSspXFxzLipzYWZhcmlcXC8vaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJHU0FcIl1dLCBbL2hlYWRsZXNzY2hyb21lKD86XFwvKFtcXHdcXC5dKyl8XFxzKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkNocm9tZSBIZWFkbGVzc1wiXV0sIFsvXFxzd3ZcXCkuKyhjaHJvbWUpXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgXCJDaHJvbWUgV2ViVmlld1wiXSwgVkVSU0lPTl0sIFsvZHJvaWQuK1xcc3ZlcnNpb25cXC8oW1xcd1xcLl0rKVxcYi4rKD86bW9iaWxlXFxzc2FmYXJpfHNhZmFyaSkvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJBbmRyb2lkIEJyb3dzZXJcIl1dLCBbLyhjaHJvbWV8b21uaXdlYnxhcm9yYXxbdGl6ZW5va2FdezV9XFxzP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL3ZlcnNpb25cXC8oW1xcd1xcLl0rKVxccy4qbW9iaWxlXFwvXFx3K1xccyhzYWZhcmkpL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiTW9iaWxlIFNhZmFyaVwiXV0sIFsvdmVyc2lvblxcLyhbXFx3XFwuXSspXFxzLioobW9iaWxlXFxzP3NhZmFyaXxzYWZhcmkpL2ldLCBbVkVSU0lPTiwgTkFNRV0sIFsvd2Via2l0Lis/KG1vYmlsZVxccz9zYWZhcml8c2FmYXJpKShcXC9bXFx3XFwuXSspL2ldLCBbTkFNRSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMuYnJvd3Nlci5vbGRTYWZhcmkudmVyc2lvbl1dLCBbLyh3ZWJraXR8a2h0bWwpXFwvKFtcXHdcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8obmF2aWdhdG9yfG5ldHNjYXBlKVxcLyhbXFx3XFwuLV0rKS9pXSwgW1tOQU1FLCBcIk5ldHNjYXBlXCJdLCBWRVJTSU9OXSwgWy9pbGVcXHN2cjtcXHNydjooW1xcd1xcLl0rKVxcKS4rZmlyZWZveC9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkZpcmVmb3ggUmVhbGl0eVwiXV0sIFsvZWtpb2hmLisoZmxvdylcXC8oW1xcd1xcLl0rKS9pLCAvKHN3aWZ0Zm94KS9pLCAvKGljZWRyYWdvbnxpY2V3ZWFzZWx8Y2FtaW5vfGNoaW1lcmF8ZmVubmVjfG1hZW1vXFxzYnJvd3NlcnxtaW5pbW98Y29ua2Vyb3IpW1xcL1xcc10/KFtcXHdcXC5cXCtdKykvaSwgLyhmaXJlZm94fHNlYW1vbmtleXxrLW1lbGVvbnxpY2VjYXR8aWNlYXBlfGZpcmViaXJkfHBob2VuaXh8cGFsZW1vb258YmFzaWxpc2t8d2F0ZXJmb3gpXFwvKFtcXHdcXC4tXSspJC9pLCAvKGZpcmVmb3gpXFwvKFtcXHdcXC5dKylcXHNbXFx3XFxzXFwtXStcXC9bXFx3XFwuXSskL2ksIC8obW96aWxsYSlcXC8oW1xcd1xcLl0rKVxccy4rcnZcXDouK2dlY2tvXFwvXFxkKy9pLCAvKHBvbGFyaXN8bHlueHxkaWxsb3xpY2FifGRvcmlzfGFtYXlhfHczbXxuZXRzdXJmfHNsZWlwbmlyKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ksIC8obGlua3MpXFxzXFwoKFtcXHdcXC5dKykvaSwgLyhnb2Jyb3dzZXIpXFwvPyhbXFx3XFwuXSopL2ksIC8oaWNlXFxzP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl9dKykvaSwgLyhtb3NhaWMpW1xcL1xcc10oW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dXSxcbiAgICBjcHU6IFtbLyg/OihhbWR8eCg/Oig/Ojg2fDY0KVtfLV0pP3x3b3d8d2luKTY0KVs7XFwpXS9pXSwgW1tBUkNISVRFQ1RVUkUsIFwiYW1kNjRcIl1dLCBbLyhpYTMyKD89OykpL2ldLCBbW0FSQ0hJVEVDVFVSRSwgdXRpbC5sb3dlcml6ZV1dLCBbLygoPzppWzM0Nl18eCk4NilbO1xcKV0vaV0sIFtbQVJDSElURUNUVVJFLCBcImlhMzJcIl1dLCBbL1xcYihhYXJjaDY0fGFybXY/OGU/bD8pXFxiL2ldLCBbW0FSQ0hJVEVDVFVSRSwgXCJhcm02NFwiXV0sIFsvXFxiKGFybSg/OnZbNjddKT9odD9uP1tmbF1wPylcXGIvaV0sIFtbQVJDSElURUNUVVJFLCBcImFybWhmXCJdXSwgWy93aW5kb3dzXFxzKGNlfG1vYmlsZSk7XFxzcHBjOy9pXSwgW1tBUkNISVRFQ1RVUkUsIFwiYXJtXCJdXSwgWy8oKD86cHBjfHBvd2VycGMpKD86NjQpPykoPzpcXHNtYWN8O3xcXCkpL2ldLCBbW0FSQ0hJVEVDVFVSRSwgL293ZXIvLCBcIlwiLCB1dGlsLmxvd2VyaXplXV0sIFsvKHN1bjRcXHcpWztcXCldL2ldLCBbW0FSQ0hJVEVDVFVSRSwgXCJzcGFyY1wiXV0sIFsvKCg/OmF2cjMyfGlhNjQoPz07KSl8NjhrKD89XFwpKXxcXGJhcm0oPzo2NHwoPz12KD86WzEtN118WzUtN10xKWw/fDt8ZWFiaSkpfCg/PWF0bWVsXFxzKWF2cnwoPzppcml4fG1pcHN8c3BhcmMpKD86NjQpP1xcYnxwYS1yaXNjKS9pXSwgW1tBUkNISVRFQ1RVUkUsIHV0aWwubG93ZXJpemVdXV0sXG4gICAgZGV2aWNlOiBbWy9cXGIoc2NoLWlbODldMFxcZHxzaHctbTM4MHN8c20tW3B0XVxcd3syLDR9fGd0LVtwbl1cXGR7Miw0fXxzZ2gtdDhbNTZdOXxuZXh1c1xcczEwKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNhbXN1bmdcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9cXGIoKD86c1tjZ3BdaHxndHxzbSktXFx3K3xnYWxheHlcXHNuZXh1cykvaSwgL1xcc3NhbXN1bmdbXFxzLV0oW1xcdy1dKykvaSwgL3NlYy0oc2doXFx3KykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTYW1zdW5nXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKGlwKD86aG9uZXxvZClbXFxzXFx3XSopOy9pXSwgW01PREVMLCBbVkVORE9SLCBcIkFwcGxlXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKGlwYWQpO1tcXHdcXHNcXCksOy1dK2FwcGxlL2ksIC9hcHBsZWNvcmVtZWRpYVxcL1tcXHdcXC5dK1xcc1xcKChpcGFkKS9pLCAvXFxiKGlwYWQpXFxkXFxkPyxcXGRcXGQ/WztcXF1dLitpb3MvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBcHBsZVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1xcYigoPzphZ3J8YWdzWzIzXXxiYWgyP3xzaHQ/KS1hP1tsd11cXGR7Mn0pL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiSHVhd2VpXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvZFxcL2h1YXdlaShbXFx3XFxzLV0rKVs7XFwpXS9pLCAvXFxiKG5leHVzXFxzNnB8dm9nLVthdF0/bFxcZFxcZHxhbmUtW2F0XT9sW3hcXGRdXFxkfGVtbC1hP2xcXGRcXGRhP3xseWEtW2F0XT9sXFxkW1xcZGNdfGNsdC1hP2xcXGRcXGRpP3xlbGUtbFxcZFxcZCkvaSwgL1xcYihcXHd7Miw0fS1bYXR1XVtsbl1bMDEyNTldWzAxOV0pWztcXClcXHNdL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiSHVhd2VpXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxiKHBvY29bXFxzXFx3XSspKD86XFxzYnVpbGR8XFwpKS9pLCAvXFxiO1xccyhcXHcrKVxcc2J1aWxkXFwvaG1cXDEvaSwgL1xcYihobVtcXHNcXC1fXT9ub3RlP1tcXHNfXT8oPzpcXGRcXHcpPylcXHNidWlsZC9pLCAvXFxiKHJlZG1pW1xcc1xcLV9dPyg/Om5vdGV8ayk/W1xcd1xcc19dKykoPzpcXHNidWlsZHxcXCkpL2ksIC9cXGIobWlbXFxzXFwtX10/KD86YVxcZHxvbmV8b25lW1xcc19dcGx1c3xub3RlIGx0ZSk/W1xcc19dPyg/OlxcZD9cXHc/KVtcXHNfXT8oPzpwbHVzKT8pXFxzYnVpbGQvaV0sIFtbTU9ERUwsIC9fL2csIFwiIFwiXSwgW1ZFTkRPUiwgXCJYaWFvbWlcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXGIobWlbXFxzXFwtX10/KD86cGFkKSg/OltcXHdcXHNfXSspKSg/Olxcc2J1aWxkfFxcKSkvaV0sIFtbTU9ERUwsIC9fL2csIFwiIFwiXSwgW1ZFTkRPUiwgXCJYaWFvbWlcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy87XFxzKFxcdyspXFxzYnVpbGQuK1xcc29wcG8vaSwgL1xccyhjcGhbMTJdXFxkezN9fHAoPzphZnxjW2FsXXxkXFx3fGVbYXJdKVttdF1cXGQwfHg5MDA3KVxcYi9pXSwgW01PREVMLCBbVkVORE9SLCBcIk9QUE9cIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHN2aXZvXFxzKFxcdyspKD86XFxzYnVpbGR8XFwpKS9pLCAvXFxzKHZbMTJdXFxkezN9XFx3P1thdF0pKD86XFxzYnVpbGR8OykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJWaXZvXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxzKHJteFsxMl1cXGR7M30pKD86XFxzYnVpbGR8OykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSZWFsbWVcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHMobWlsZXN0b25lfGRyb2lkKD86WzItNHhdfFxccyg/OmJpb25pY3x4Mnxwcm98cmF6cikpPzo/KFxcczRnKT8pXFxiW1xcd1xcc10rYnVpbGRcXC8vaSwgL1xcc21vdCg/Om9yb2xhKT9bXFxzLV0oXFx3KikvaSwgLygoPzptb3RvW1xcc1xcd1xcKFxcKV0rfHh0XFxkezMsNH18bmV4dXNcXHM2KSg/PVxcc2J1aWxkfFxcKSkpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTW90b3JvbGFcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHMobXo2MFxcZHx4b29tW1xcczJdezAsMn0pXFxzYnVpbGRcXC8vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNb3Rvcm9sYVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLygoPz1sZyk/W3ZsXWtcXC0/XFxkezN9KVxcc2J1aWxkfFxcczNcXC5bXFxzXFx3Oy1dezEwfWxnPy0oWzA2Y3Y5XXszLDR9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkxHXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvKGxtLT9mMTAwW252XT98bmV4dXNcXHNbNDVdKS9pLCAvbGdbZTtcXHNcXC8tXSsoKD8hYnJvd3NlcnxuZXRjYXN0KVxcdyspL2ksIC9cXGJsZyhcXC0/W1xcZFxcd10rKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTEdcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy8oaWRlYXRhYltcXHdcXC1cXHNdKykvaSwgL2xlbm92b1xccz8ocyg/OjUwMDB8NjAwMCkoPzpbXFx3LV0rKXx0YWIoPzpbXFxzXFx3XSspfHl0W1xcZFxcdy1dezZ9fHRiW1xcZFxcdy1dezZ9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkxlbm92b1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyg/Om1hZW1vfG5va2lhKS4qKG45MDB8bHVtaWFcXHNcXGQrKS9pLCAvbm9raWFbXFxzXy1dPyhbXFx3XFwuLV0qKS9pXSwgW1tNT0RFTCwgL18vZywgXCIgXCJdLCBbVkVORE9SLCBcIk5va2lhXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWQuKztcXHMocGl4ZWxcXHNjKVtcXHMpXS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkdvb2dsZVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL2Ryb2lkLis7XFxzKHBpeGVsW1xcc1xcZGF4bF17MCw2fSkoPzpcXHNidWlsZHxcXCkpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiR29vZ2xlXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWQuK1xccyhbYy1nXVxcZHs0fXxzb1stbF1cXHcrfHhxLWFcXHdbNC03XVsxMl0pKD89XFxzYnVpbGRcXC98XFwpLitjaHJvbWVcXC8oPyFbMS02XXswLDF9XFxkXFwuKSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTb255XCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvc29ueVxcc3RhYmxldFxcc1twc11cXHNidWlsZFxcLy9pLCAvKD86c29ueSk/c2dwXFx3Kyg/Olxcc2J1aWxkXFwvfFxcKSkvaV0sIFtbTU9ERUwsIFwiWHBlcmlhIFRhYmxldFwiXSwgW1ZFTkRPUiwgXCJTb255XCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvXFxzKGtiMjAwNXxpbjIwWzEyXTV8YmUyMFsxMl1bNTldKVxcYi9pLCAvXFxiYTAwMCgxKVxcc2J1aWxkL2ksIC9cXGJvbmVwbHVzXFxzKGFcXGR7NH0pW1xccyldL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiT25lUGx1c1wiXSwgW1RZUEUsIE1PQklMRV1dLCBbLyhhbGV4YSl3ZWJtL2ksIC8oa2ZbYS16XXsyfXdpKShcXHNidWlsZFxcL3xcXCkpL2ksIC8oa2ZbYS16XSspKFxcc2J1aWxkXFwvfFxcKSkuK3NpbGtcXC8vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBbWF6b25cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy8oc2R8a2YpWzAzNDloaWpvcnN0dXddKyhcXHNidWlsZFxcL3xcXCkpLitzaWxrXFwvL2ldLCBbW01PREVMLCBcIkZpcmUgUGhvbmVcIl0sIFtWRU5ET1IsIFwiQW1hem9uXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKHBsYXlib29rKTtbXFx3XFxzXFwpLDstXSsocmltKS9pXSwgW01PREVMLCBWRU5ET1IsIFtUWVBFLCBUQUJMRVRdXSwgWy8oKD86YmJbYS1mXXxzdFtodl0pMTAwLVxcZCkvaSwgL1xcKGJiMTA7XFxzKFxcdyspL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQmxhY2tCZXJyeVwiXSwgW1RZUEUsIE1PQklMRV1dLCBbLyg/OlxcYnxhc3VzXykodHJhbnNmb1twcmltZVxcc117NCwxMH1cXHNcXHcrfGVlZXBjfHNsaWRlclxcc1xcdyt8bmV4dXNcXHM3fHBhZGZvbmV8cDAwW2NqXSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBU1VTXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvXFxzKHpbZXNdNlswMjddWzAxXVtrbV1bbHNdfHplbmZvbmVcXHNcXGRcXHc/KVxcYi9pXSwgW01PREVMLCBbVkVORE9SLCBcIkFTVVNcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy8obmV4dXNcXHM5KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkhUQ1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyhodGMpWztfXFxzLV17MSwyfShbXFx3XFxzXSsoPz1cXCl8XFxzYnVpbGQpfFxcdyspL2ksIC8oenRlKS0oXFx3KikvaSwgLyhhbGNhdGVsfGdlZWtzcGhvbmV8bmV4aWFufHBhbmFzb25pY3woPz07XFxzKXNvbnkpW19cXHMtXT8oW1xcdy1dKikvaV0sIFtWRU5ET1IsIFtNT0RFTCwgL18vZywgXCIgXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWRbeFxcZFxcLlxccztdK1xccyhbYWJdWzEtN11cXC0/WzAxNzhhXVxcZFxcZD8pL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQWNlclwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL2Ryb2lkLis7XFxzKG1bMS01XVxcc25vdGUpXFxzYnVpbGQvaSwgL1xcYm16LShbXFx3LV17Mix9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIk1laXp1XCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvKGJsYWNrYmVycnl8YmVucXxwYWxtKD89XFwtKXxzb255ZXJpY3Nzb258YWNlcnxhc3VzfGRlbGx8bWVpenV8bW90b3JvbGF8cG9seXRyb24pW1xcc18tXT8oW1xcdy1dKikvaSwgLyhocClcXHMoW1xcd1xcc10rXFx3KS9pLCAvKGFzdXMpLT8oXFx3KykvaSwgLyhtaWNyb3NvZnQpO1xccyhsdW1pYVtcXHNcXHddKykvaSwgLyhsZW5vdm8pW19cXHMtXT8oW1xcdy1dKykvaSwgL2xpbnV4Oy4rKGpvbGxhKTsvaSwgL2Ryb2lkLis7XFxzKG9wcG8pXFxzPyhbXFx3XFxzXSspXFxzYnVpbGQvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFsvKGFyY2hvcylcXHMoZ2FtZXBhZDI/KS9pLCAvKGhwKS4rKHRvdWNocGFkKD8hLit0YWJsZXQpfHRhYmxldCkvaSwgLyhraW5kbGUpXFwvKFtcXHdcXC5dKykvaSwgL1xccyhub29rKVtcXHdcXHNdK2J1aWxkXFwvKFxcdyspL2ksIC8oZGVsbClcXHMoc3RyZWFba3ByXFxzXFxkXSpbXFxka29dKS9pLCAvWztcXC9dXFxzPyhsZVtcXHNcXC1dK3BhbilbXFxzXFwtXSsoXFx3ezEsOX0pXFxzYnVpbGQvaSwgL1s7XFwvXVxccz8odHJpbml0eSlbXFwtXFxzXSoodFxcZHszfSlcXHNidWlsZC9pLCAvXFxiKGdpZ2FzZXQpW1xcc1xcLV0rKHFcXHd7MSw5fSlcXHNidWlsZC9pLCAvXFxiKHZvZGFmb25lKVxccyhbXFx3XFxzXSspKD86XFwpfFxcc2J1aWxkKS9pXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgWy9cXHMoc3VyZmFjZVxcc2R1bylcXHMvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNaWNyb3NvZnRcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9kcm9pZFxcc1tcXGRcXC5dKztcXHMoZnBcXGR1PylcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkZhaXJwaG9uZVwiXSwgW1RZUEUsIE1PQklMRV1dLCBbL1xccyh1MzA0YWEpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBVCZUXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvc2llLShcXHcqKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNpZW1lbnNcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9bO1xcL11cXHM/KHJjdFxcdyspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSQ0FcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL1xcc10odmVudWVbXFxkXFxzXXsyLDd9KVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiRGVsbFwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8ocSg/Om12fHRhKVxcdyspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJWZXJpem9uXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzKD86YmFybmVzWyZcXHNdK25vYmxlXFxzfGJuW3J0XSkoW1xcd1xcc1xcK10qKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQmFybmVzICYgTm9ibGVcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHModG1cXGR7M31cXHcrKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTnVWaXNpb25cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy87XFxzKGs4OClcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIlpURVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLztcXHMobnhcXGR7M31qKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiWlRFXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyhnZW5cXGR7M30pXFxzYnVpbGQuKjQ5aC9pXSwgW01PREVMLCBbVkVORE9SLCBcIlN3aXNzXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyh6dXJcXGR7M30pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTd2lzc1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oKHpla2kpP3RiLipcXGIpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJaZWtpXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzKFt5cl1cXGR7Mn0pXFxzYnVpbGQvaSwgL1s7XFwvXVxccyhkcmFnb25bXFwtXFxzXSt0b3VjaFxcc3xkdCkoXFx3ezV9KVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJEcmFnb24gVG91Y2hcIl0sIE1PREVMLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzPyhucy0/XFx3ezAsOX0pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJJbnNpZ25pYVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oKG54YXxOZXh0KS0/XFx3ezAsOX0pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJOZXh0Qm9va1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oeHRyZW1lXFxfKT8odigxWzA0NV18MlswMTVdfFszNDY5XTB8N1swNV0pKVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJWb2ljZVwiXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy9bO1xcL11cXHM/KGx2dGVsXFwtKT8odjFbMTJdKVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJMdlRlbFwiXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy87XFxzKHBoLTEpXFxzL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiRXNzZW50aWFsXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyh2KDEwMG1kfDcwMG5hfDcwMTF8OTE3ZykuKlxcYilcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkVudml6ZW5cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHM/KHRyaW9bXFxzXFx3XFwtXFwuXSspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNYWNoU3BlZWRcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHM/dHVfKDE0OTEpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSb3RvclwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyhzaGllbGRbXFx3XFxzXSspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJOdmlkaWFcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy8oc3ByaW50KVxccyhcXHcrKS9pXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy8oa2luXFwuW29uZXR3XXszfSkvaV0sIFtbTU9ERUwsIC9cXC4vZywgXCIgXCJdLCBbVkVORE9SLCBcIk1pY3Jvc29mdFwiXSwgW1RZUEUsIE1PQklMRV1dLCBbL2Ryb2lkXFxzW1xcZFxcLl0rO1xccyhjYzY2NjY/fGV0NVsxNl18bWNbMjM5XVsyM114P3x2YzhbMDNdeD8pXFwpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiWmVicmFcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9kcm9pZFxcc1tcXGRcXC5dKztcXHMoZWMzMHxwczIwfHRjWzItOF1cXGRba3hdKVxcKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlplYnJhXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxzKG91eWEpXFxzL2ksIC8obmludGVuZG8pXFxzKFt3aWRzM3V0Y2hdKykvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgQ09OU09MRV1dLCBbL2Ryb2lkLis7XFxzKHNoaWVsZClcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIk52aWRpYVwiXSwgW1RZUEUsIENPTlNPTEVdXSwgWy8ocGxheXN0YXRpb25cXHNbMzQ1cG9ydGFibGV2aV0rKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNvbnlcIl0sIFtUWVBFLCBDT05TT0xFXV0sIFsvW1xcc1xcKDtdKHhib3goPzpcXHNvbmUpPyg/ITtcXHN4Ym94KSlbXFxzXFwpO10vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNaWNyb3NvZnRcIl0sIFtUWVBFLCBDT05TT0xFXV0sIFsvc21hcnQtdHYuKyhzYW1zdW5nKS9pXSwgW1ZFTkRPUiwgW1RZUEUsIFNNQVJUVFZdXSwgWy9oYmJ0di4rbWFwbGU7KFxcZCspL2ldLCBbW01PREVMLCAvXi8sIFwiU21hcnRUVlwiXSwgW1ZFTkRPUiwgXCJTYW1zdW5nXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbLyg/OmxpbnV4O1xcc25ldGNhc3QuK3NtYXJ0dHZ8bGdcXHNuZXRjYXN0XFwudHYtMjAxXFxkKS9pXSwgW1tWRU5ET1IsIFwiTEdcIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvKGFwcGxlKVxccz90di9pXSwgW1ZFTkRPUiwgW01PREVMLCBcIkFwcGxlIFRWXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbL2Nya2V5L2ldLCBbW01PREVMLCBcIkNocm9tZWNhc3RcIl0sIFtWRU5ET1IsIFwiR29vZ2xlXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbL2Ryb2lkLithZnQoW1xcd10pKFxcc2J1aWxkXFwvfFxcKSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBbWF6b25cIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvXFwoZHR2W1xcKTtdLisoYXF1b3MpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiU2hhcnBcIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvaGJidHZcXC9cXGQrXFwuXFxkK1xcLlxcZCtcXHMrXFwoW1xcd1xcc10qO1xccyooXFx3W147XSopOyhbXjtdKikvaV0sIFtbVkVORE9SLCB1dGlsLnRyaW1dLCBbTU9ERUwsIHV0aWwudHJpbV0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvW1xcc1xcL1xcKF0oYW5kcm9pZFxcc3xzbWFydFstXFxzXT98b3BlcmFcXHMpdHZbO1xcKVxcc10vaV0sIFtbVFlQRSwgU01BUlRUVl1dLCBbLygocGViYmxlKSlhcHBcXC9bXFxkXFwuXStcXHMvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgV0VBUkFCTEVdXSwgWy9kcm9pZC4rO1xccyhnbGFzcylcXHNcXGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJHb29nbGVcIl0sIFtUWVBFLCBXRUFSQUJMRV1dLCBbL2Ryb2lkXFxzW1xcZFxcLl0rO1xccyh3dDYzPzB7MiwzfSlcXCkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJaZWJyYVwiXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFsvKHRlc2xhKSg/Olxcc3F0Y2FyYnJvd3NlcnxcXC8yMFsxMl1cXGRcXC5bXFx3XFwuLV0rKS9pXSwgW1ZFTkRPUiwgW1RZUEUsIEVNQkVEREVEXV0sIFsvZHJvaWQgLis/OyAoW147XSs/KSg/OiBidWlsZHxcXCkgYXBwbGV3ZWJraXQpLis/IG1vYmlsZSBzYWZhcmkvaV0sIFtNT0RFTCwgW1RZUEUsIE1PQklMRV1dLCBbL2Ryb2lkIC4rPztcXHMoW147XSs/KSg/OiBidWlsZHxcXCkgYXBwbGV3ZWJraXQpLis/KD8hIG1vYmlsZSkgc2FmYXJpL2ldLCBbTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgWy9cXHModGFibGV0fHRhYilbO1xcL10vaSwgL1xccyhtb2JpbGUpKD86WztcXC9dfFxcc3NhZmFyaSkvaV0sIFtbVFlQRSwgdXRpbC5sb3dlcml6ZV1dLCBbLyhhbmRyb2lkW1xcd1xcLlxcc1xcLV17MCw5fSk7LitidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkdlbmVyaWNcIl1dLCBbLyhwaG9uZSkvaV0sIFtbVFlQRSwgTU9CSUxFXV1dLFxuICAgIGVuZ2luZTogW1svd2luZG93cy4rXFxzZWRnZVxcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRWRnZUhUTUxcIl1dLCBbL3dlYmtpdFxcLzUzN1xcLjM2LitjaHJvbWVcXC8oPyEyNykoW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkJsaW5rXCJdXSwgWy8ocHJlc3RvKVxcLyhbXFx3XFwuXSspL2ksIC8od2Via2l0fHRyaWRlbnR8bmV0ZnJvbnR8bmV0c3VyZnxhbWF5YXxseW54fHczbXxnb2FubmEpXFwvKFtcXHdcXC5dKykvaSwgL2VraW9oKGZsb3cpXFwvKFtcXHdcXC5dKykvaSwgLyhraHRtbHx0YXNtYW58bGlua3MpW1xcL1xcc11cXCg/KFtcXHdcXC5dKykvaSwgLyhpY2FiKVtcXC9cXHNdKFsyM11cXC5bXFxkXFwuXSspL2ldLCBbTkFNRSwgVkVSU0lPTl0sIFsvcnZcXDooW1xcd1xcLl17MSw5fSlcXGIuKyhnZWNrbykvaV0sIFtWRVJTSU9OLCBOQU1FXV0sXG4gICAgb3M6IFtbL21pY3Jvc29mdFxccyh3aW5kb3dzKVxccyh2aXN0YXx4cCkvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8od2luZG93cylcXHNudFxcczZcXC4yO1xccyhhcm0pL2ksIC8od2luZG93c1xcc3Bob25lKD86XFxzb3MpKilbXFxzXFwvXT8oW1xcZFxcLlxcc1xcd10qKS9pLCAvKHdpbmRvd3NcXHNtb2JpbGV8d2luZG93cylbXFxzXFwvXT8oW250Y2VcXGRcXC5cXHNdK1xcdykoPyEuK3hib3gpL2ldLCBbTkFNRSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMub3Mud2luZG93cy52ZXJzaW9uXV0sIFsvKHdpbig/PTN8OXxuKXx3aW5cXHM5eFxccykoW250XFxkXFwuXSspL2ldLCBbW05BTUUsIFwiV2luZG93c1wiXSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMub3Mud2luZG93cy52ZXJzaW9uXV0sIFsvaXBbaG9uZWFkXXsyLDR9XFxiKD86Lipvc1xccyhbXFx3XSspXFxzbGlrZVxcc21hY3w7XFxzb3BlcmEpL2ksIC9jZm5ldHdvcmtcXC8uK2Rhcndpbi9pXSwgW1tWRVJTSU9OLCAvXy9nLCBcIi5cIl0sIFtOQU1FLCBcImlPU1wiXV0sIFsvKG1hY1xcc29zXFxzeClcXHM/KFtcXHdcXHNcXC5dKikvaSwgLyhtYWNpbnRvc2h8bWFjKD89X3Bvd2VycGMpXFxzKSg/IS4raGFpa3UpL2ldLCBbW05BTUUsIFwiTWFjIE9TXCJdLCBbVkVSU0lPTiwgL18vZywgXCIuXCJdXSwgWy8oYW5kcm9pZHx3ZWJvc3xwYWxtXFxzb3N8cW54fGJhZGF8cmltXFxzdGFibGV0XFxzb3N8bWVlZ298c2FpbGZpc2h8Y29udGlraSlbXFwvXFxzLV0/KFtcXHdcXC5dKikvaSwgLyhibGFja2JlcnJ5KVxcdypcXC8oW1xcd1xcLl0qKS9pLCAvKHRpemVufGthaW9zKVtcXC9cXHNdKFtcXHdcXC5dKykvaSwgL1xcKChzZXJpZXM0MCk7L2ldLCBbTkFNRSwgVkVSU0lPTl0sIFsvXFwoYmIoMTApOy9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkJsYWNrQmVycnlcIl1dLCBbLyg/OnN5bWJpYW5cXHM/b3N8c3ltYm9zfHM2MCg/PTspfHNlcmllczYwKVtcXC9cXHMtXT8oW1xcd1xcLl0qKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIlN5bWJpYW5cIl1dLCBbL21vemlsbGEuK1xcKG1vYmlsZTsuK2dlY2tvLitmaXJlZm94L2ldLCBbW05BTUUsIFwiRmlyZWZveCBPU1wiXV0sIFsvd2ViMHM7LitydCh0dikvaSwgL1xcYig/OmhwKT93b3MoPzpicm93c2VyKT9cXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIndlYk9TXCJdXSwgWy9jcmtleVxcLyhbXFxkXFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiQ2hyb21lY2FzdFwiXV0sIFsvKGNyb3MpXFxzW1xcd10rXFxzKFtcXHdcXC5dK1xcdykvaV0sIFtbTkFNRSwgXCJDaHJvbWl1bSBPU1wiXSwgVkVSU0lPTl0sIFsvKG5pbnRlbmRvfHBsYXlzdGF0aW9uKVxccyhbd2lkczM0NXBvcnRhYmxldnVjaF0rKS9pLCAvKHhib3gpO1xccyt4Ym94XFxzKFteXFwpO10rKS9pLCAvKG1pbnQpW1xcL1xcc1xcKFxcKV0/KFxcdyopL2ksIC8obWFnZWlhfHZlY3RvcmxpbnV4KVs7XFxzXS9pLCAvKGpvbGl8W2t4bG5dP3VidW50dXxkZWJpYW58c3VzZXxvcGVuc3VzZXxnZW50b298YXJjaCg/PVxcc2xpbnV4KXxzbGFja3dhcmV8ZmVkb3JhfG1hbmRyaXZhfGNlbnRvc3xwY2xpbnV4b3N8cmVkaGF0fHplbndhbGt8bGlucHVzfHJhc3BiaWFuKSg/Olxcc2dudVxcL2xpbnV4KT8oPzpcXHNsaW51eCk/W1xcL1xccy1dPyg/IWNocm9tfHBhY2thZ2UpKFtcXHdcXC4tXSopL2ksIC8oaHVyZHxsaW51eClcXHM/KFtcXHdcXC5dKikvaSwgLyhnbnUpXFxzPyhbXFx3XFwuXSopL2ksIC9cXHMoW2ZyZW50b3BjLV17MCw0fWJzZHxkcmFnb25mbHkpXFxzPyg/IWFtZHxbaXgzNDZdezEsMn04NikoW1xcd1xcLl0qKS9pLCAvKGhhaWt1KVxccyhcXHcrKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbLyhzdW5vcylcXHM/KFtcXHdcXC5cXGRdKikvaV0sIFtbTkFNRSwgXCJTb2xhcmlzXCJdLCBWRVJTSU9OXSwgWy8oKD86b3Blbik/c29sYXJpcylbXFwvXFxzLV0/KFtcXHdcXC5dKikvaSwgLyhhaXgpXFxzKChcXGQpKD89XFwufFxcKXxcXHMpW1xcd1xcLl0pKi9pLCAvKHBsYW5cXHM5fG1pbml4fGJlb3N8b3NcXC8yfGFtaWdhb3N8bW9ycGhvc3xyaXNjXFxzb3N8b3BlbnZtc3xmdWNoc2lhKS9pLCAvKHVuaXgpXFxzPyhbXFx3XFwuXSopL2ldLCBbTkFNRSwgVkVSU0lPTl1dXG4gIH07XG5cbiAgdmFyIFVBUGFyc2VyID0gZnVuY3Rpb24gVUFQYXJzZXIodWEsIGV4dGVuc2lvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBleHRlbnNpb25zID0gdWE7XG4gICAgICB1YSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVUFQYXJzZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFVBUGFyc2VyKHVhLCBleHRlbnNpb25zKS5nZXRSZXN1bHQoKTtcbiAgICB9XG5cbiAgICB2YXIgX3VhID0gdWEgfHwgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCA/IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50IDogRU1QVFkpO1xuXG4gICAgdmFyIF9yZ3htYXAgPSBleHRlbnNpb25zID8gdXRpbC5leHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykgOiByZWdleGVzO1xuXG4gICAgdGhpcy5nZXRCcm93c2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9icm93c2VyID0ge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcnNpb246IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfYnJvd3NlciwgX3VhLCBfcmd4bWFwLmJyb3dzZXIpO1xuICAgICAgX2Jyb3dzZXIubWFqb3IgPSB1dGlsLm1ham9yKF9icm93c2VyLnZlcnNpb24pO1xuICAgICAgcmV0dXJuIF9icm93c2VyO1xuICAgIH07XG5cbiAgICB0aGlzLmdldENQVSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfY3B1ID0ge1xuICAgICAgICBhcmNoaXRlY3R1cmU6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfY3B1LCBfdWEsIF9yZ3htYXAuY3B1KTtcbiAgICAgIHJldHVybiBfY3B1O1xuICAgIH07XG5cbiAgICB0aGlzLmdldERldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZGV2aWNlID0ge1xuICAgICAgICB2ZW5kb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbW9kZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgbWFwcGVyLnJneC5jYWxsKF9kZXZpY2UsIF91YSwgX3JneG1hcC5kZXZpY2UpO1xuICAgICAgcmV0dXJuIF9kZXZpY2U7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RW5naW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9lbmdpbmUgPSB7XG4gICAgICAgIG5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgbWFwcGVyLnJneC5jYWxsKF9lbmdpbmUsIF91YSwgX3JneG1hcC5lbmdpbmUpO1xuICAgICAgcmV0dXJuIF9lbmdpbmU7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0T1MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX29zID0ge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcnNpb246IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfb3MsIF91YSwgX3JneG1hcC5vcyk7XG4gICAgICByZXR1cm4gX29zO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFJlc3VsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVhOiB0aGlzLmdldFVBKCksXG4gICAgICAgIGJyb3dzZXI6IHRoaXMuZ2V0QnJvd3NlcigpLFxuICAgICAgICBlbmdpbmU6IHRoaXMuZ2V0RW5naW5lKCksXG4gICAgICAgIG9zOiB0aGlzLmdldE9TKCksXG4gICAgICAgIGRldmljZTogdGhpcy5nZXREZXZpY2UoKSxcbiAgICAgICAgY3B1OiB0aGlzLmdldENQVSgpXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0aGlzLmdldFVBID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF91YTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRVQSA9IGZ1bmN0aW9uICh1YSkge1xuICAgICAgX3VhID0gdHlwZW9mIHVhID09PSBTVFJfVFlQRSAmJiB1YS5sZW5ndGggPiBVQV9NQVhfTEVOR1RIID8gdXRpbC50cmltKHVhLCBVQV9NQVhfTEVOR1RIKSA6IHVhO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0VUEoX3VhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBVQVBhcnNlci5WRVJTSU9OID0gTElCVkVSU0lPTjtcbiAgVUFQYXJzZXIuQlJPV1NFUiA9IHtcbiAgICBOQU1FOiBOQU1FLFxuICAgIE1BSk9SOiBNQUpPUixcbiAgICBWRVJTSU9OOiBWRVJTSU9OXG4gIH07XG4gIFVBUGFyc2VyLkNQVSA9IHtcbiAgICBBUkNISVRFQ1RVUkU6IEFSQ0hJVEVDVFVSRVxuICB9O1xuICBVQVBhcnNlci5ERVZJQ0UgPSB7XG4gICAgTU9ERUw6IE1PREVMLFxuICAgIFZFTkRPUjogVkVORE9SLFxuICAgIFRZUEU6IFRZUEUsXG4gICAgQ09OU09MRTogQ09OU09MRSxcbiAgICBNT0JJTEU6IE1PQklMRSxcbiAgICBTTUFSVFRWOiBTTUFSVFRWLFxuICAgIFRBQkxFVDogVEFCTEVULFxuICAgIFdFQVJBQkxFOiBXRUFSQUJMRSxcbiAgICBFTUJFRERFRDogRU1CRURERURcbiAgfTtcbiAgVUFQYXJzZXIuRU5HSU5FID0ge1xuICAgIE5BTUU6IE5BTUUsXG4gICAgVkVSU0lPTjogVkVSU0lPTlxuICB9O1xuICBVQVBhcnNlci5PUyA9IHtcbiAgICBOQU1FOiBOQU1FLFxuICAgIFZFUlNJT046IFZFUlNJT05cbiAgfTtcblxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFVOREVGX1RZUEUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gVU5ERUZfVFlQRSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gVUFQYXJzZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5VQVBhcnNlciA9IFVBUGFyc2VyO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFVBUGFyc2VyO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuVUFQYXJzZXIgPSBVQVBhcnNlcjtcbiAgICB9XG4gIH1cblxuICB2YXIgJCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvKTtcblxuICBpZiAoJCAmJiAhJC51YSkge1xuICAgIHZhciBwYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgICAkLnVhID0gcGFyc2VyLmdldFJlc3VsdCgpO1xuXG4gICAgJC51YS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLmdldFVBKCk7XG4gICAgfTtcblxuICAgICQudWEuc2V0ID0gZnVuY3Rpb24gKHVhc3RyaW5nKSB7XG4gICAgICBwYXJzZXIuc2V0VUEodWFzdHJpbmcpO1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5nZXRSZXN1bHQoKTtcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiByZXN1bHQpIHtcbiAgICAgICAgJC51YVtwcm9wXSA9IHJlc3VsdFtwcm9wXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDogdGhpcyk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4889\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")},6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},6666: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: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/HowYouCanHelp/howYouCanHelp.module.scss\n// extracted by mini-css-extract-plugin\nvar howYouCanHelpContainer = \"howYouCanHelp-module--howYouCanHelpContainer--3wcow\";\nvar howYouCanHelpText = \"howYouCanHelp-module--howYouCanHelpText--38HSA\";\nvar howYouCanHelpHeader = \"howYouCanHelp-module--howYouCanHelpHeader--16A1k\";\nvar howYouCanHelpList = \"howYouCanHelp-module--howYouCanHelpList--3wyFv\";\nvar howYouCanHelpListWrapper = \"howYouCanHelp-module--howYouCanHelpListWrapper--BL7AD\";\n;// CONCATENATED MODULE: ./src/components/HowYouCanHelp/index.tsx\nvar HowYouCanHelp=function HowYouCanHelp(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({youCanHelpHeader:{id:'howYouCanHelp.header.text',defaultMessage:'How You Can Help Improve the Tool',description:'the header of the how you can help section'},youCanHelpInfoText:{id:'youCanHelpInfoText.list.element.prefix',defaultMessage:'If you have helpful information, we’d love to',description:'you can help info text '},youCanHelpInfoLinkText:{id:'youCanHelpInfoLink.link.text',defaultMessage:'get an email from you',description:'you can help info text '},youCanHelpDataMethPrefixText:{id:'youCanHelpDataMethPrefixText.link.prefix.text',defaultMessage:'View our',description:'view our'},youCanHelpDataMethLinkText:{id:'youCanHelpDataMethLinkText.link.text',defaultMessage:'Data & methodology',description:'Data & methodology link'},youCanHelpDataMethSuffixText:{id:'youCanHelpDataMethSuffixText.link.suffix.text',defaultMessage:'and send us feedback',description:'send us feedbackv via email'},youCanHelpSharingPrefixText:{id:'youCanHelpSharingPrefixText.link.prefix.text',defaultMessage:'Find your community and',description:'find your community'},youCanHelpSharingLinkText:{id:'youCanHelpSharingLinkText.link.text',defaultMessage:'share your feedback',description:'sharing link to email'}});return/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpContainer},/*#__PURE__*/react.createElement(\"h2\",{className:howYouCanHelpHeader},intl.formatMessage(messages.youCanHelpHeader)),/*#__PURE__*/react.createElement(\"ul\",{className:howYouCanHelpListWrapper},/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpText},intl.formatMessage(messages.youCanHelpInfoText),\" \",/*#__PURE__*/react.createElement(\"a\",{href:'mailto:screeningtool.feedback@usds.gov'},intl.formatMessage(messages.youCanHelpInfoLinkText)),\" \",\".\")),/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpText},intl.formatMessage(messages.youCanHelpDataMethPrefixText),\" \",/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology'},intl.formatMessage(messages.youCanHelpDataMethLinkText)),\" \",intl.formatMessage(messages.youCanHelpDataMethSuffixText))),/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpText},intl.formatMessage(messages.youCanHelpSharingPrefixText),\" \",/*#__PURE__*/react.createElement(\"a\",{href:'mailto:screeningtool.feedback@usds.gov'},intl.formatMessage(messages.youCanHelpSharingLinkText)),\" \",\".\"))));};/* harmony default export */ var components_HowYouCanHelp = (HowYouCanHelp);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 4 modules\nvar layout = __webpack_require__(828);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nfunction _extends() {\n _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 return _extends.apply(this, arguments);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 3 modules\nvar toConsumableArray = __webpack_require__(7329);\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/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\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;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\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}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n\n\n\n\nfunction slicedToArray_slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || (0,unsupportedIterableToArray/* default */.Z)(arr, i) || _nonIterableRest();\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js\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}\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.math.hypot.js\nvar es_math_hypot = __webpack_require__(5438);\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/common.js\n\n\n/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nvar RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nfunction setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nfunction toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nfunction equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec4.js\n\n\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nfunction set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec4_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nfunction normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nfunction cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nfunction transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nvar sub = (/* unused pure expression or super */ null && (subtract));\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nvar mul = (/* unused pure expression or super */ null && (multiply));\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nvar div = (/* unused pure expression or super */ null && (divide));\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nvar dist = (/* unused pure expression or super */ null && (distance));\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nvar sqrDist = (/* unused pure expression or super */ null && (squaredDistance));\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nvar len = (/* unused pure expression or super */ null && (vec4_length));\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nvar sqrLen = (/* unused pure expression or super */ null && (squaredLength));\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/math-utils.js\n\nfunction createMat4() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\nfunction transformVector(matrix, vector) {\n var result = transformMat4([], vector, matrix);\n scale(result, result, 1 / result[3]);\n return result;\n}\nfunction mod(value, divisor) {\n var modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction math_utils_lerp(start, end, step) {\n return step * end + (1 - step) * start;\n}\n\nfunction ieLog2(x) {\n return Math.log(x) * Math.LOG2E;\n}\n\nvar log2 = Math.log2 || ieLog2;\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat4.js\n\n\n/**\r\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nfunction mat4_create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nfunction mat4_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nfunction mat4_fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nfunction identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nfunction translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nfunction mat4_scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nfunction rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nfunction fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nfunction getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nfunction getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nfunction getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nfunction fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nfunction perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nfunction lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nfunction targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nfunction mat4_str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nfunction frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nfunction multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nfunction mat4_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nfunction mat4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nvar mat4_mul = (/* unused pure expression or super */ null && (mat4_multiply));\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nvar mat4_sub = (/* unused pure expression or super */ null && (mat4_subtract));\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec2.js\n\n\n/**\r\n * 2 Dimensional Vector\r\n * @module vec2\r\n */\n\n/**\r\n * Creates a new, empty vec2\r\n *\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_create() {\n var out = new ARRAY_TYPE(2);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec2} a vector to clone\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Copy the values from one vec2 to another\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the source vector\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Set the components of a vec2 to the given values\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Adds two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\r\n * Multiplies two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\r\n * Divides two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to ceil\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to floor\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\r\n * Math.round the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to round\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\r\n * Scales a vec2 by a scalar number\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\r\n * Adds two vec2's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction vec2_distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction vec2_squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\r\n * Calculates the length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec2_length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction vec2_squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\r\n * Negates the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to negate\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to invert\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\r\n * Normalize a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to normalize\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction vec2_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\r\n * Computes the cross product of two vec2's\r\n * Note that the cross product must by definition produce a 3D vector\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec2_cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2d\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2d} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat3\r\n * 3rd vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat3} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat4\r\n * 3rd vector component is implicitly '0'\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\r\n * Rotate a 2D vector\r\n * @param {vec2} out The receiving vec2\r\n * @param {ReadonlyVec2} a The vec2 point to rotate\r\n * @param {ReadonlyVec2} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\r\n * Get the angle between two 2D vectors\r\n * @param {ReadonlyVec2} a The first operand\r\n * @param {ReadonlyVec2} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nfunction angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec2 to zero\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec2} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction vec2_str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\r\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec2_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec2_equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\r\n * Alias for {@link vec2.length}\r\n * @function\r\n */\n\nvar vec2_len = (/* unused pure expression or super */ null && (vec2_length));\n/**\r\n * Alias for {@link vec2.subtract}\r\n * @function\r\n */\n\nvar vec2_sub = vec2_subtract;\n/**\r\n * Alias for {@link vec2.multiply}\r\n * @function\r\n */\n\nvar vec2_mul = (/* unused pure expression or super */ null && (vec2_multiply));\n/**\r\n * Alias for {@link vec2.divide}\r\n * @function\r\n */\n\nvar vec2_div = (/* unused pure expression or super */ null && (vec2_divide));\n/**\r\n * Alias for {@link vec2.distance}\r\n * @function\r\n */\n\nvar vec2_dist = (/* unused pure expression or super */ null && (vec2_distance));\n/**\r\n * Alias for {@link vec2.squaredDistance}\r\n * @function\r\n */\n\nvar vec2_sqrDist = (/* unused pure expression or super */ null && (vec2_squaredDistance));\n/**\r\n * Alias for {@link vec2.squaredLength}\r\n * @function\r\n */\n\nvar vec2_sqrLen = (/* unused pure expression or super */ null && (vec2_squaredLength));\n/**\r\n * Perform some operation over an array of vec2s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar vec2_forEach = function () {\n var vec = vec2_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec3.js\n\n\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_create() {\n var out = new ARRAY_TYPE(3);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec3_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction vec3_distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction vec3_squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction vec3_squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction vec3_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nfunction vec3_angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && vec3_dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction vec3_str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec3_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec3_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nvar vec3_sub = (/* unused pure expression or super */ null && (vec3_subtract));\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nvar vec3_mul = vec3_multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nvar vec3_div = (/* unused pure expression or super */ null && (vec3_divide));\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nvar vec3_dist = (/* unused pure expression or super */ null && (vec3_distance));\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nvar vec3_sqrDist = (/* unused pure expression or super */ null && (vec3_squaredDistance));\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nvar vec3_len = (/* unused pure expression or super */ null && (vec3_length));\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nvar vec3_sqrLen = (/* unused pure expression or super */ null && (vec3_squaredLength));\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar vec3_forEach = function () {\n var vec = vec3_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/assert.js\nfunction assert_assert(condition, message) {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/web-mercator-utils.js\n\n\n\n\n\n\nvar PI = Math.PI;\nvar PI_4 = PI / 4;\nvar DEGREES_TO_RADIANS = PI / 180;\nvar RADIANS_TO_DEGREES = 180 / PI;\nvar TILE_SIZE = 512;\nvar EARTH_CIRCUMFERENCE = 40.03e6;\nvar DEFAULT_ALTITUDE = 1.5;\nfunction zoomToScale(zoom) {\n return Math.pow(2, zoom);\n}\nfunction scaleToZoom(scale) {\n return log2(scale);\n}\nfunction lngLatToWorld(_ref) {\n var _ref2 = slicedToArray_slicedToArray(_ref, 2),\n lng = _ref2[0],\n lat = _ref2[1];\n\n assert_assert(Number.isFinite(lng));\n assert_assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n var lambda2 = lng * DEGREES_TO_RADIANS;\n var phi2 = lat * DEGREES_TO_RADIANS;\n var x = TILE_SIZE * (lambda2 + PI) / (2 * PI);\n var y = TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5))) / (2 * PI);\n return [x, y];\n}\nfunction worldToLngLat(_ref3) {\n var _ref4 = slicedToArray_slicedToArray(_ref3, 2),\n x = _ref4[0],\n y = _ref4[1];\n\n var lambda2 = x / TILE_SIZE * (2 * PI) - PI;\n var phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\nfunction getMeterZoom(_ref5) {\n var latitude = _ref5.latitude;\n assert(Number.isFinite(latitude));\n var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\nfunction getDistanceScales(_ref6) {\n var latitude = _ref6.latitude,\n longitude = _ref6.longitude,\n _ref6$highPrecision = _ref6.highPrecision,\n highPrecision = _ref6$highPrecision === void 0 ? false : _ref6$highPrecision;\n assert_assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n var result = {};\n var worldSize = TILE_SIZE;\n var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n var unitsPerDegreeX = worldSize / 360;\n var unitsPerDegreeY = unitsPerDegreeX / latCosine;\n var altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n result.unitsPerMeter = [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter];\n result.metersPerUnit = [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter];\n result.unitsPerDegree = [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter];\n result.degreesPerUnit = [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter];\n\n if (highPrecision) {\n var latCosine2 = DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS) / latCosine;\n var unitsPerDegreeY2 = unitsPerDegreeX * latCosine2 / 2;\n var altUnitsPerDegree2 = worldSize / EARTH_CIRCUMFERENCE * latCosine2;\n var altUnitsPerMeter2 = altUnitsPerDegree2 / unitsPerDegreeY * altUnitsPerMeter;\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n return result;\n}\nfunction addMetersToLngLat(lngLatZ, xyz) {\n var _lngLatZ = _slicedToArray(lngLatZ, 3),\n longitude = _lngLatZ[0],\n latitude = _lngLatZ[1],\n z0 = _lngLatZ[2];\n\n var _xyz = _slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var _getDistanceScales = getDistanceScales({\n longitude: longitude,\n latitude: latitude,\n highPrecision: true\n }),\n unitsPerMeter = _getDistanceScales.unitsPerMeter,\n unitsPerMeter2 = _getDistanceScales.unitsPerMeter2;\n\n var worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n var newLngLat = worldToLngLat(worldspace);\n var newZ = (z0 || 0) + (z || 0);\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\nfunction getViewMatrix(_ref7) {\n var height = _ref7.height,\n pitch = _ref7.pitch,\n bearing = _ref7.bearing,\n altitude = _ref7.altitude,\n scale = _ref7.scale,\n _ref7$center = _ref7.center,\n center = _ref7$center === void 0 ? null : _ref7$center;\n var vm = createMat4();\n translate(vm, vm, [0, 0, -altitude]);\n rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n scale /= height;\n mat4_scale(vm, vm, [scale, scale, scale]);\n\n if (center) {\n translate(vm, vm, vec3_negate([], center));\n }\n\n return vm;\n}\nfunction getProjectionParameters(_ref8) {\n var width = _ref8.width,\n height = _ref8.height,\n _ref8$fovy = _ref8.fovy,\n fovy = _ref8$fovy === void 0 ? altitudeToFovy(DEFAULT_ALTITUDE) : _ref8$fovy,\n altitude = _ref8.altitude,\n _ref8$pitch = _ref8.pitch,\n pitch = _ref8$pitch === void 0 ? 0 : _ref8$pitch,\n _ref8$nearZMultiplier = _ref8.nearZMultiplier,\n nearZMultiplier = _ref8$nearZMultiplier === void 0 ? 1 : _ref8$nearZMultiplier,\n _ref8$farZMultiplier = _ref8.farZMultiplier,\n farZMultiplier = _ref8$farZMultiplier === void 0 ? 1 : _ref8$farZMultiplier;\n\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n var halfFov = 0.5 * fovy * DEGREES_TO_RADIANS;\n var focalDistance = fovyToAltitude(fovy);\n var pitchRadians = pitch * DEGREES_TO_RADIANS;\n var topHalfSurfaceDistance = Math.sin(halfFov) * focalDistance / Math.sin(Math.min(Math.max(Math.PI / 2 - pitchRadians - halfFov, 0.01), Math.PI - 0.01));\n var farZ = Math.sin(pitchRadians) * topHalfSurfaceDistance + focalDistance;\n return {\n fov: 2 * halfFov,\n aspect: width / height,\n focalDistance: focalDistance,\n near: nearZMultiplier,\n far: farZ * farZMultiplier\n };\n}\nfunction getProjectionMatrix(_ref9) {\n var width = _ref9.width,\n height = _ref9.height,\n pitch = _ref9.pitch,\n altitude = _ref9.altitude,\n fovy = _ref9.fovy,\n nearZMultiplier = _ref9.nearZMultiplier,\n farZMultiplier = _ref9.farZMultiplier;\n\n var _getProjectionParamet = getProjectionParameters({\n width: width,\n height: height,\n altitude: altitude,\n fovy: fovy,\n pitch: pitch,\n nearZMultiplier: nearZMultiplier,\n farZMultiplier: farZMultiplier\n }),\n fov = _getProjectionParamet.fov,\n aspect = _getProjectionParamet.aspect,\n near = _getProjectionParamet.near,\n far = _getProjectionParamet.far;\n\n var projectionMatrix = perspective([], fov, aspect, near, far);\n return projectionMatrix;\n}\nfunction altitudeToFovy(altitude) {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\nfunction fovyToAltitude(fovy) {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\nfunction worldToPixels(xyz, pixelProjectionMatrix) {\n var _xyz2 = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz2[0],\n y = _xyz2[1],\n _xyz2$ = _xyz2[2],\n z = _xyz2$ === void 0 ? 0 : _xyz2$;\n\n assert_assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\nfunction pixelsToWorld(xyz, pixelUnprojectionMatrix) {\n var targetZ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n var _xyz3 = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz3[0],\n y = _xyz3[1],\n z = _xyz3[2];\n\n assert_assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n var coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n var coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n var coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n var z0 = coord0[2];\n var z1 = coord1[2];\n var t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2_lerp([], coord0, coord1, t);\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/fit-bounds.js\n\n\n\n\nfunction fit_bounds_fitBounds(_ref) {\n var width = _ref.width,\n height = _ref.height,\n bounds = _ref.bounds,\n _ref$minExtent = _ref.minExtent,\n minExtent = _ref$minExtent === void 0 ? 0 : _ref$minExtent,\n _ref$maxZoom = _ref.maxZoom,\n maxZoom = _ref$maxZoom === void 0 ? 24 : _ref$maxZoom,\n _ref$padding = _ref.padding,\n padding = _ref$padding === void 0 ? 0 : _ref$padding,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? [0, 0] : _ref$offset;\n\n var _bounds = slicedToArray_slicedToArray(bounds, 2),\n _bounds$ = slicedToArray_slicedToArray(_bounds[0], 2),\n west = _bounds$[0],\n south = _bounds$[1],\n _bounds$2 = slicedToArray_slicedToArray(_bounds[1], 2),\n east = _bounds$2[0],\n north = _bounds$2[1];\n\n if (Number.isFinite(padding)) {\n var p = padding;\n padding = {\n top: p,\n bottom: p,\n left: p,\n right: p\n };\n } else {\n assert_assert(Number.isFinite(padding.top) && Number.isFinite(padding.bottom) && Number.isFinite(padding.left) && Number.isFinite(padding.right));\n }\n\n var viewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: 0,\n latitude: 0,\n zoom: 0\n });\n var nw = viewport.project([west, north]);\n var se = viewport.project([east, south]);\n var size = [Math.max(Math.abs(se[0] - nw[0]), minExtent), Math.max(Math.abs(se[1] - nw[1]), minExtent)];\n var targetSize = [width - padding.left - padding.right - Math.abs(offset[0]) * 2, height - padding.top - padding.bottom - Math.abs(offset[1]) * 2];\n assert_assert(targetSize[0] > 0 && targetSize[1] > 0);\n var scaleX = targetSize[0] / size[0];\n var scaleY = targetSize[1] / size[1];\n var offsetX = (padding.right - padding.left) / 2 / scaleX;\n var offsetY = (padding.bottom - padding.top) / 2 / scaleY;\n var center = [(se[0] + nw[0]) / 2 + offsetX, (se[1] + nw[1]) / 2 + offsetY];\n var centerLngLat = viewport.unproject(center);\n var zoom = Math.min(maxZoom, viewport.zoom + log2(Math.abs(Math.min(scaleX, scaleY))));\n assert_assert(Number.isFinite(zoom));\n return {\n longitude: centerLngLat[0],\n latitude: centerLngLat[1],\n zoom: zoom\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/get-bounds.js\n\n\n\nvar get_bounds_DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getBounds(viewport) {\n var z = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var width = viewport.width,\n height = viewport.height,\n unproject = viewport.unproject;\n var unprojectOps = {\n targetZ: z\n };\n var bottomLeft = unproject([0, height], unprojectOps);\n var bottomRight = unproject([width, height], unprojectOps);\n var topLeft;\n var topRight;\n var halfFov = viewport.fovy ? 0.5 * viewport.fovy * get_bounds_DEGREES_TO_RADIANS : Math.atan(0.5 / viewport.altitude);\n var angleToGround = (90 - viewport.pitch) * get_bounds_DEGREES_TO_RADIANS;\n\n if (halfFov > angleToGround - 0.01) {\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\nfunction unprojectOnFarPlane(viewport, x, targetZ) {\n var pixelUnprojectionMatrix = viewport.pixelUnprojectionMatrix;\n var coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n var coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n var z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n var t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n var coord = vec2_lerp([], coord0, coord1, t);\n var result = worldToLngLat(coord);\n result[2] = targetZ;\n return result;\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/web-mercator-viewport.js\n\n\n\n\n\n\n\n\n\n\n\n\nvar WebMercatorViewport = /*#__PURE__*/function () {\n function WebMercatorViewport() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n width: 1,\n height: 1\n },\n width = _ref.width,\n height = _ref.height,\n _ref$latitude = _ref.latitude,\n latitude = _ref$latitude === void 0 ? 0 : _ref$latitude,\n _ref$longitude = _ref.longitude,\n longitude = _ref$longitude === void 0 ? 0 : _ref$longitude,\n _ref$zoom = _ref.zoom,\n zoom = _ref$zoom === void 0 ? 0 : _ref$zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? null : _ref$altitude,\n _ref$fovy = _ref.fovy,\n fovy = _ref$fovy === void 0 ? null : _ref$fovy,\n _ref$position = _ref.position,\n position = _ref$position === void 0 ? null : _ref$position,\n _ref$nearZMultiplier = _ref.nearZMultiplier,\n nearZMultiplier = _ref$nearZMultiplier === void 0 ? 0.02 : _ref$nearZMultiplier,\n _ref$farZMultiplier = _ref.farZMultiplier,\n farZMultiplier = _ref$farZMultiplier === void 0 ? 1.01 : _ref$farZMultiplier;\n\n _classCallCheck(this, WebMercatorViewport);\n\n width = width || 1;\n height = height || 1;\n\n if (fovy === null && altitude === null) {\n altitude = DEFAULT_ALTITUDE;\n fovy = altitudeToFovy(altitude);\n } else if (fovy === null) {\n fovy = altitudeToFovy(altitude);\n } else if (altitude === null) {\n altitude = fovyToAltitude(fovy);\n }\n\n var scale = zoomToScale(zoom);\n altitude = Math.max(0.75, altitude);\n var distanceScales = getDistanceScales({\n longitude: longitude,\n latitude: latitude\n });\n var center = lngLatToWorld([longitude, latitude]);\n center[2] = 0;\n\n if (position) {\n vec3_add(center, center, vec3_mul([], position, distanceScales.unitsPerMeter));\n }\n\n this.projectionMatrix = getProjectionMatrix({\n width: width,\n height: height,\n pitch: pitch,\n fovy: fovy,\n nearZMultiplier: nearZMultiplier,\n farZMultiplier: farZMultiplier\n });\n this.viewMatrix = getViewMatrix({\n height: height,\n scale: scale,\n center: center,\n pitch: pitch,\n bearing: bearing,\n altitude: altitude\n });\n this.width = width;\n this.height = height;\n this.scale = scale;\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n this.center = center;\n this.meterOffset = position || [0, 0, 0];\n this.distanceScales = distanceScales;\n\n this._initMatrices();\n\n this.equals = this.equals.bind(this);\n this.project = this.project.bind(this);\n this.unproject = this.unproject.bind(this);\n this.projectPosition = this.projectPosition.bind(this);\n this.unprojectPosition = this.unprojectPosition.bind(this);\n Object.freeze(this);\n }\n\n _createClass(WebMercatorViewport, [{\n key: \"_initMatrices\",\n value: function _initMatrices() {\n var width = this.width,\n height = this.height,\n projectionMatrix = this.projectionMatrix,\n viewMatrix = this.viewMatrix;\n var vpm = createMat4();\n mat4_multiply(vpm, vpm, projectionMatrix);\n mat4_multiply(vpm, vpm, viewMatrix);\n this.viewProjectionMatrix = vpm;\n var m = createMat4();\n mat4_scale(m, m, [width / 2, -height / 2, 1]);\n translate(m, m, [1, -1, 0]);\n mat4_multiply(m, m, vpm);\n var mInverse = invert(createMat4(), m);\n\n if (!mInverse) {\n throw new Error('Pixel project matrix not invertible');\n }\n\n this.pixelProjectionMatrix = m;\n this.pixelUnprojectionMatrix = mInverse;\n }\n }, {\n key: \"equals\",\n value: function equals(viewport) {\n if (!(viewport instanceof WebMercatorViewport)) {\n return false;\n }\n\n return viewport.width === this.width && viewport.height === this.height && mat4_equals(viewport.projectionMatrix, this.projectionMatrix) && mat4_equals(viewport.viewMatrix, this.viewMatrix);\n }\n }, {\n key: \"project\",\n value: function project(xyz) {\n var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref2$topLeft = _ref2.topLeft,\n topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft;\n\n var worldPosition = this.projectPosition(xyz);\n var coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n var _coord = slicedToArray_slicedToArray(coord, 2),\n x = _coord[0],\n y = _coord[1];\n\n var y2 = topLeft ? y : this.height - y;\n return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n }\n }, {\n key: \"unproject\",\n value: function unproject(xyz) {\n var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref3$topLeft = _ref3.topLeft,\n topLeft = _ref3$topLeft === void 0 ? true : _ref3$topLeft,\n _ref3$targetZ = _ref3.targetZ,\n targetZ = _ref3$targetZ === void 0 ? undefined : _ref3$targetZ;\n\n var _xyz = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var y2 = topLeft ? y : this.height - y;\n var targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n var coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n\n var _this$unprojectPositi = this.unprojectPosition(coord),\n _this$unprojectPositi2 = slicedToArray_slicedToArray(_this$unprojectPositi, 3),\n X = _this$unprojectPositi2[0],\n Y = _this$unprojectPositi2[1],\n Z = _this$unprojectPositi2[2];\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n\n return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n }\n }, {\n key: \"projectPosition\",\n value: function projectPosition(xyz) {\n var _lngLatToWorld = lngLatToWorld(xyz),\n _lngLatToWorld2 = slicedToArray_slicedToArray(_lngLatToWorld, 2),\n X = _lngLatToWorld2[0],\n Y = _lngLatToWorld2[1];\n\n var Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n }\n }, {\n key: \"unprojectPosition\",\n value: function unprojectPosition(xyz) {\n var _worldToLngLat = worldToLngLat(xyz),\n _worldToLngLat2 = slicedToArray_slicedToArray(_worldToLngLat, 2),\n X = _worldToLngLat2[0],\n Y = _worldToLngLat2[1];\n\n var Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n }\n }, {\n key: \"projectFlat\",\n value: function projectFlat(lngLat) {\n return lngLatToWorld(lngLat);\n }\n }, {\n key: \"unprojectFlat\",\n value: function unprojectFlat(xy) {\n return worldToLngLat(xy);\n }\n }, {\n key: \"getMapCenterByLngLatPosition\",\n value: function getMapCenterByLngLatPosition(_ref4) {\n var lngLat = _ref4.lngLat,\n pos = _ref4.pos;\n var fromLocation = pixelsToWorld(pos, this.pixelUnprojectionMatrix);\n var toLocation = lngLatToWorld(lngLat);\n var translate = vec2_add([], toLocation, vec2_negate([], fromLocation));\n var newCenter = vec2_add([], this.center, translate);\n return worldToLngLat(newCenter);\n }\n }, {\n key: \"getLocationAtPoint\",\n value: function getLocationAtPoint(_ref5) {\n var lngLat = _ref5.lngLat,\n pos = _ref5.pos;\n return this.getMapCenterByLngLatPosition({\n lngLat: lngLat,\n pos: pos\n });\n }\n }, {\n key: \"fitBounds\",\n value: function fitBounds(bounds) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var width = this.width,\n height = this.height;\n\n var _fitBounds2 = fit_bounds_fitBounds(Object.assign({\n width: width,\n height: height,\n bounds: bounds\n }, options)),\n longitude = _fitBounds2.longitude,\n latitude = _fitBounds2.latitude,\n zoom = _fitBounds2.zoom;\n\n return new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n }\n }, {\n key: \"getBounds\",\n value: function getBounds(options) {\n var corners = this.getBoundingRegion(options);\n var west = Math.min.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[0];\n })));\n var east = Math.max.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[0];\n })));\n var south = Math.min.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[1];\n })));\n var north = Math.max.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[1];\n })));\n return [[west, south], [east, north]];\n }\n }, {\n key: \"getBoundingRegion\",\n value: function getBoundingRegion() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return getBounds(this, options.z || 0);\n }\n }]);\n\n return WebMercatorViewport;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/normalize-viewport-props.js\n\n\nvar MAX_LATITUDE = 85.05113;\nvar MIN_LATITUDE = -85.05113;\nfunction normalizeViewportProps(_ref) {\n var width = _ref.width,\n height = _ref.height,\n longitude = _ref.longitude,\n latitude = _ref.latitude,\n zoom = _ref.zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing;\n\n if (longitude < -180 || longitude > 180) {\n longitude = mod(longitude + 180, 360) - 180;\n }\n\n if (bearing < -180 || bearing > 180) {\n bearing = mod(bearing + 180, 360) - 180;\n }\n\n var flatViewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n var topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n var bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n var shiftY = 0;\n\n if (bottomY - topY < height) {\n zoom += log2(height / (bottomY - topY));\n flatViewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n }\n\n if (topY > 0) {\n shiftY = topY;\n } else if (bottomY < height) {\n shiftY = bottomY - height;\n }\n\n if (shiftY) {\n latitude = flatViewport.unproject([width / 2, height / 2 + shiftY])[1];\n }\n\n return {\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom,\n pitch: pitch,\n bearing: bearing\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/fly-to-viewport.js\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\n\n\n\nvar fly_to_viewport_EPSILON = 0.01;\nvar VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom'];\nvar DEFAULT_OPTS = {\n curve: 1.414,\n speed: 1.2\n};\nfunction flyToViewport(startProps, endProps, t) {\n var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var viewport = {};\n\n var _getFlyToTransitionPa = getFlyToTransitionParams(startProps, endProps, opts),\n startZoom = _getFlyToTransitionPa.startZoom,\n startCenterXY = _getFlyToTransitionPa.startCenterXY,\n uDelta = _getFlyToTransitionPa.uDelta,\n w0 = _getFlyToTransitionPa.w0,\n u1 = _getFlyToTransitionPa.u1,\n S = _getFlyToTransitionPa.S,\n rho = _getFlyToTransitionPa.rho,\n rho2 = _getFlyToTransitionPa.rho2,\n r0 = _getFlyToTransitionPa.r0;\n\n if (u1 < fly_to_viewport_EPSILON) {\n var _iterator = _createForOfIteratorHelper(VIEWPORT_TRANSITION_PROPS),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n viewport[key] = math_utils_lerp(startValue, endValue, t);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return viewport;\n }\n\n var s = t * S;\n var w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n var u = w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2) / u1;\n var scaleIncrement = 1 / w;\n var newZoom = startZoom + scaleToZoom(scaleIncrement);\n var newCenterWorld = vec2_scale([], uDelta, u);\n vec2_add(newCenterWorld, newCenterWorld, startCenterXY);\n var newCenter = worldToLngLat(newCenterWorld);\n viewport.longitude = newCenter[0];\n viewport.latitude = newCenter[1];\n viewport.zoom = newZoom;\n return viewport;\n}\nfunction getFlyToDuration(startProps, endProps) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n var _opts = opts,\n screenSpeed = _opts.screenSpeed,\n speed = _opts.speed,\n maxDuration = _opts.maxDuration;\n\n var _getFlyToTransitionPa2 = getFlyToTransitionParams(startProps, endProps, opts),\n S = _getFlyToTransitionPa2.S,\n rho = _getFlyToTransitionPa2.rho;\n\n var length = 1000 * S;\n var duration;\n\n if (Number.isFinite(screenSpeed)) {\n duration = length / (screenSpeed / rho);\n } else {\n duration = length / speed;\n }\n\n return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\n\nfunction getFlyToTransitionParams(startProps, endProps, opts) {\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n var rho = opts.curve;\n var startZoom = startProps.zoom;\n var startCenter = [startProps.longitude, startProps.latitude];\n var startScale = zoomToScale(startZoom);\n var endZoom = endProps.zoom;\n var endCenter = [endProps.longitude, endProps.latitude];\n var scale = zoomToScale(endZoom - startZoom);\n var startCenterXY = lngLatToWorld(startCenter);\n var endCenterXY = lngLatToWorld(endCenter);\n var uDelta = vec2_sub([], endCenterXY, startCenterXY);\n var w0 = Math.max(startProps.width, startProps.height);\n var w1 = w0 / scale;\n var u1 = vec2_length(uDelta) * startScale;\n\n var _u1 = Math.max(u1, fly_to_viewport_EPSILON);\n\n var rho2 = rho * rho;\n var b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n var b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n var r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n var r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n var S = (r1 - r0) / rho;\n return {\n startZoom: startZoom,\n startCenterXY: startCenterXY,\n uDelta: uDelta,\n w0: w0,\n u1: u1,\n S: S,\n rho: rho,\n rho2: rho2,\n r0: r0,\n r1: r1\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/index.js\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/viewport-mercator-project/module.js\n\n\n;// CONCATENATED MODULE: ./node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js\n/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\n\n/* eslint-disable require-jsdoc, valid-jsdoc */\nvar MapShim = function () {\n if (typeof Map !== 'undefined') {\n return Map;\n }\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\n\n\n function getIndex(arr, key) {\n var result = -1;\n arr.some(function (entry, index) {\n if (entry[0] === key) {\n result = index;\n return true;\n }\n\n return false;\n });\n return result;\n }\n\n return (\n /** @class */\n function () {\n function class_1() {\n this.__entries__ = [];\n }\n\n Object.defineProperty(class_1.prototype, \"size\", {\n /**\r\n * @returns {boolean}\r\n */\n get: function get() {\n return this.__entries__.length;\n },\n enumerable: true,\n configurable: true\n });\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\n\n class_1.prototype.get = function (key) {\n var index = getIndex(this.__entries__, key);\n var entry = this.__entries__[index];\n return entry && entry[1];\n };\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.set = function (key, value) {\n var index = getIndex(this.__entries__, key);\n\n if (~index) {\n this.__entries__[index][1] = value;\n } else {\n this.__entries__.push([key, value]);\n }\n };\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.delete = function (key) {\n var entries = this.__entries__;\n var index = getIndex(entries, key);\n\n if (~index) {\n entries.splice(index, 1);\n }\n };\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.has = function (key) {\n return !!~getIndex(this.__entries__, key);\n };\n /**\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.clear = function () {\n this.__entries__.splice(0);\n };\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.forEach = function (callback, ctx) {\n if (ctx === void 0) {\n ctx = null;\n }\n\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\n var entry = _a[_i];\n callback.call(ctx, entry[1], entry[0]);\n }\n };\n\n return class_1;\n }()\n );\n}();\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\n\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document; // Returns global object of a current environment.\n\nvar global$1 = function () {\n if (typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.Math === Math) {\n return __webpack_require__.g;\n }\n\n if (typeof self !== 'undefined' && self.Math === Math) {\n return self;\n }\n\n if (typeof window !== 'undefined' && window.Math === Math) {\n return window;\n } // eslint-disable-next-line no-new-func\n\n\n return Function('return this')();\n}();\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\n\n\nvar requestAnimationFrame$1 = function () {\n if (typeof requestAnimationFrame === 'function') {\n // It's required to use a bounded function because IE sometimes throws\n // an \"Invalid calling object\" error if rAF is invoked without the global\n // object on the left hand side.\n return requestAnimationFrame.bind(global$1);\n }\n\n return function (callback) {\n return setTimeout(function () {\n return callback(Date.now());\n }, 1000 / 60);\n };\n}(); // Defines minimum timeout before adding a trailing call.\n\n\nvar trailingTimeout = 2;\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\n\nfunction throttle(callback, delay) {\n var leadingCall = false,\n trailingCall = false,\n lastCallTime = 0;\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\n\n function resolvePending() {\n if (leadingCall) {\n leadingCall = false;\n callback();\n }\n\n if (trailingCall) {\n proxy();\n }\n }\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\n\n\n function timeoutCallback() {\n requestAnimationFrame$1(resolvePending);\n }\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\n\n\n function proxy() {\n var timeStamp = Date.now();\n\n if (leadingCall) {\n // Reject immediately following calls.\n if (timeStamp - lastCallTime < trailingTimeout) {\n return;\n } // Schedule new call to be in invoked when the pending one is resolved.\n // This is important for \"transitions\" which never actually start\n // immediately so there is a chance that we might miss one if change\n // happens amids the pending invocation.\n\n\n trailingCall = true;\n } else {\n leadingCall = true;\n trailingCall = false;\n setTimeout(timeoutCallback, delay);\n }\n\n lastCallTime = timeStamp;\n }\n\n return proxy;\n} // Minimum delay before invoking the update of observers.\n\n\nvar REFRESH_DELAY = 20; // A list of substrings of CSS properties used to find transition events that\n// might affect dimensions of observed elements.\n\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight']; // Check if MutationObserver is available.\n\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\n\nvar ResizeObserverController =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\n function ResizeObserverController() {\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\n this.connected_ = false;\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\n\n this.mutationEventsAdded_ = false;\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\n\n this.mutationsObserver_ = null;\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\n\n this.observers_ = [];\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\n }\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.addObserver = function (observer) {\n if (!~this.observers_.indexOf(observer)) {\n this.observers_.push(observer);\n } // Add listeners if they haven't been added yet.\n\n\n if (!this.connected_) {\n this.connect_();\n }\n };\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.removeObserver = function (observer) {\n var observers = this.observers_;\n var index = observers.indexOf(observer); // Remove observer if it's present in registry.\n\n if (~index) {\n observers.splice(index, 1);\n } // Remove listeners if controller has no connected observers.\n\n\n if (!observers.length && this.connected_) {\n this.disconnect_();\n }\n };\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.refresh = function () {\n var changesDetected = this.updateObservers_(); // Continue running updates if changes have been detected as there might\n // be future ones caused by CSS transitions.\n\n if (changesDetected) {\n this.refresh();\n }\n };\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\n\n\n ResizeObserverController.prototype.updateObservers_ = function () {\n // Collect observers that have active observations.\n var activeObservers = this.observers_.filter(function (observer) {\n return observer.gatherActive(), observer.hasActive();\n }); // Deliver notifications in a separate cycle in order to avoid any\n // collisions between observers, e.g. when multiple instances of\n // ResizeObserver are tracking the same element and the callback of one\n // of them changes content dimensions of the observed target. Sometimes\n // this may result in notifications being blocked for the rest of observers.\n\n activeObservers.forEach(function (observer) {\n return observer.broadcastActive();\n });\n return activeObservers.length > 0;\n };\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.connect_ = function () {\n // Do nothing if running in a non-browser environment or if listeners\n // have been already added.\n if (!isBrowser || this.connected_) {\n return;\n } // Subscription to the \"Transitionend\" event is used as a workaround for\n // delayed transitions. This way it's possible to capture at least the\n // final state of an element.\n\n\n document.addEventListener('transitionend', this.onTransitionEnd_);\n window.addEventListener('resize', this.refresh);\n\n if (mutationObserverSupported) {\n this.mutationsObserver_ = new MutationObserver(this.refresh);\n this.mutationsObserver_.observe(document, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n } else {\n document.addEventListener('DOMSubtreeModified', this.refresh);\n this.mutationEventsAdded_ = true;\n }\n\n this.connected_ = true;\n };\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.disconnect_ = function () {\n // Do nothing if running in a non-browser environment or if listeners\n // have been already removed.\n if (!isBrowser || !this.connected_) {\n return;\n }\n\n document.removeEventListener('transitionend', this.onTransitionEnd_);\n window.removeEventListener('resize', this.refresh);\n\n if (this.mutationsObserver_) {\n this.mutationsObserver_.disconnect();\n }\n\n if (this.mutationEventsAdded_) {\n document.removeEventListener('DOMSubtreeModified', this.refresh);\n }\n\n this.mutationsObserver_ = null;\n this.mutationEventsAdded_ = false;\n this.connected_ = false;\n };\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\n var _b = _a.propertyName,\n propertyName = _b === void 0 ? '' : _b; // Detect whether transition may affect dimensions of an element.\n\n var isReflowProperty = transitionKeys.some(function (key) {\n return !!~propertyName.indexOf(key);\n });\n\n if (isReflowProperty) {\n this.refresh();\n }\n };\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\n\n\n ResizeObserverController.getInstance = function () {\n if (!this.instance_) {\n this.instance_ = new ResizeObserverController();\n }\n\n return this.instance_;\n };\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\n\n\n ResizeObserverController.instance_ = null;\n return ResizeObserverController;\n}();\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\n\n\nvar defineConfigurable = function defineConfigurable(target, props) {\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n var key = _a[_i];\n Object.defineProperty(target, key, {\n value: props[key],\n enumerable: false,\n writable: false,\n configurable: true\n });\n }\n\n return target;\n};\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\n\n\nvar getWindowOf = function getWindowOf(target) {\n // Assume that the element is an instance of Node, which means that it\n // has the \"ownerDocument\" property from which we can retrieve a\n // corresponding global object.\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView; // Return the local global object if it's not possible extract one from\n // provided element.\n\n return ownerGlobal || global$1;\n}; // Placeholder of an empty content rectangle.\n\n\nvar emptyRect = createRectInit(0, 0, 0, 0);\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\n\nfunction toFloat(value) {\n return parseFloat(value) || 0;\n}\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\n\n\nfunction getBordersSize(styles) {\n var positions = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n positions[_i - 1] = arguments[_i];\n }\n\n return positions.reduce(function (size, position) {\n var value = styles['border-' + position + '-width'];\n return size + toFloat(value);\n }, 0);\n}\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\n\n\nfunction getPaddings(styles) {\n var positions = ['top', 'right', 'bottom', 'left'];\n var paddings = {};\n\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\n var position = positions_1[_i];\n var value = styles['padding-' + position];\n paddings[position] = toFloat(value);\n }\n\n return paddings;\n}\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getSVGContentRect(target) {\n var bbox = target.getBBox();\n return createRectInit(0, 0, bbox.width, bbox.height);\n}\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getHTMLElementContentRect(target) {\n // Client width & height properties can't be\n // used exclusively as they provide rounded values.\n var clientWidth = target.clientWidth,\n clientHeight = target.clientHeight; // By this condition we can catch all non-replaced inline, hidden and\n // detached elements. Though elements with width & height properties less\n // than 0.5 will be discarded as well.\n //\n // Without it we would need to implement separate methods for each of\n // those cases and it's not possible to perform a precise and performance\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\n // gives wrong results for elements with width & height less than 0.5.\n\n if (!clientWidth && !clientHeight) {\n return emptyRect;\n }\n\n var styles = getWindowOf(target).getComputedStyle(target);\n var paddings = getPaddings(styles);\n var horizPad = paddings.left + paddings.right;\n var vertPad = paddings.top + paddings.bottom; // Computed styles of width & height are being used because they are the\n // only dimensions available to JS that contain non-rounded values. It could\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\n // affected by CSS transformations let alone paddings, borders and scroll bars.\n\n var width = toFloat(styles.width),\n height = toFloat(styles.height); // Width & height include paddings and borders when the 'border-box' box\n // model is applied (except for IE).\n\n if (styles.boxSizing === 'border-box') {\n // Following conditions are required to handle Internet Explorer which\n // doesn't include paddings and borders to computed CSS dimensions.\n //\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\n // properties then it's either IE, and thus we don't need to subtract\n // anything, or an element merely doesn't have paddings/borders styles.\n if (Math.round(width + horizPad) !== clientWidth) {\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\n }\n\n if (Math.round(height + vertPad) !== clientHeight) {\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\n }\n } // Following steps can't be applied to the document's root element as its\n // client[Width/Height] properties represent viewport area of the window.\n // Besides, it's as well not necessary as the itself neither has\n // rendered scroll bars nor it can be clipped.\n\n\n if (!isDocumentElement(target)) {\n // In some browsers (only in Firefox, actually) CSS width & height\n // include scroll bars size which can be removed at this step as scroll\n // bars are the only difference between rounded dimensions + paddings\n // and \"client\" properties, though that is not always true in Chrome.\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\n var horizScrollbar = Math.round(height + vertPad) - clientHeight; // Chrome has a rather weird rounding of \"client\" properties.\n // E.g. for an element with content width of 314.2px it sometimes gives\n // the client width of 315px and for the width of 314.7px it may give\n // 314px. And it doesn't happen all the time. So just ignore this delta\n // as a non-relevant.\n\n if (Math.abs(vertScrollbar) !== 1) {\n width -= vertScrollbar;\n }\n\n if (Math.abs(horizScrollbar) !== 1) {\n height -= horizScrollbar;\n }\n }\n\n return createRectInit(paddings.left, paddings.top, width, height);\n}\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\n\n\nvar isSVGGraphicsElement = function () {\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\n // interface.\n if (typeof SVGGraphicsElement !== 'undefined') {\n return function (target) {\n return target instanceof getWindowOf(target).SVGGraphicsElement;\n };\n } // If it's so, then check that element is at least an instance of the\n // SVGElement and that it has the \"getBBox\" method.\n // eslint-disable-next-line no-extra-parens\n\n\n return function (target) {\n return target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === 'function';\n };\n}();\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\n\n\nfunction isDocumentElement(target) {\n return target === getWindowOf(target).document.documentElement;\n}\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getContentRect(target) {\n if (!isBrowser) {\n return emptyRect;\n }\n\n if (isSVGGraphicsElement(target)) {\n return getSVGContentRect(target);\n }\n\n return getHTMLElementContentRect(target);\n}\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\n\n\nfunction createReadOnlyRect(_a) {\n var x = _a.x,\n y = _a.y,\n width = _a.width,\n height = _a.height; // If DOMRectReadOnly is available use it as a prototype for the rectangle.\n\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\n var rect = Object.create(Constr.prototype); // Rectangle's properties are not writable and non-enumerable.\n\n defineConfigurable(rect, {\n x: x,\n y: y,\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: height + y,\n left: x\n });\n return rect;\n}\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction createRectInit(x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height\n };\n}\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\n\n\nvar ResizeObservation =\n/** @class */\nfunction () {\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\n function ResizeObservation(target) {\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\n this.broadcastWidth = 0;\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\n\n this.broadcastHeight = 0;\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\n\n this.contentRect_ = createRectInit(0, 0, 0, 0);\n this.target = target;\n }\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\n\n\n ResizeObservation.prototype.isActive = function () {\n var rect = getContentRect(this.target);\n this.contentRect_ = rect;\n return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;\n };\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\n\n\n ResizeObservation.prototype.broadcastRect = function () {\n var rect = this.contentRect_;\n this.broadcastWidth = rect.width;\n this.broadcastHeight = rect.height;\n return rect;\n };\n\n return ResizeObservation;\n}();\n\nvar ResizeObserverEntry =\n/** @class */\nfunction () {\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\n function ResizeObserverEntry(target, rectInit) {\n var contentRect = createReadOnlyRect(rectInit); // According to the specification following properties are not writable\n // and are also not enumerable in the native implementation.\n //\n // Property accessors are not being used as they'd require to define a\n // private WeakMap storage which may cause memory leaks in browsers that\n // don't support this type of collections.\n\n defineConfigurable(this, {\n target: target,\n contentRect: contentRect\n });\n }\n\n return ResizeObserverEntry;\n}();\n\nvar ResizeObserverSPI =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\n function ResizeObserverSPI(callback, controller, callbackCtx) {\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\n this.activeObservations_ = [];\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\n\n this.observations_ = new MapShim();\n\n if (typeof callback !== 'function') {\n throw new TypeError('The callback provided as parameter 1 is not a function.');\n }\n\n this.callback_ = callback;\n this.controller_ = controller;\n this.callbackCtx_ = callbackCtx;\n }\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.observe = function (target) {\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n } // Do nothing if current environment doesn't have the Element interface.\n\n\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\n return;\n }\n\n if (!(target instanceof getWindowOf(target).Element)) {\n throw new TypeError('parameter 1 is not of type \"Element\".');\n }\n\n var observations = this.observations_; // Do nothing if element is already being observed.\n\n if (observations.has(target)) {\n return;\n }\n\n observations.set(target, new ResizeObservation(target));\n this.controller_.addObserver(this); // Force the update of observations.\n\n this.controller_.refresh();\n };\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.unobserve = function (target) {\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n } // Do nothing if current environment doesn't have the Element interface.\n\n\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\n return;\n }\n\n if (!(target instanceof getWindowOf(target).Element)) {\n throw new TypeError('parameter 1 is not of type \"Element\".');\n }\n\n var observations = this.observations_; // Do nothing if element is not being observed.\n\n if (!observations.has(target)) {\n return;\n }\n\n observations.delete(target);\n\n if (!observations.size) {\n this.controller_.removeObserver(this);\n }\n };\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.disconnect = function () {\n this.clearActive();\n this.observations_.clear();\n this.controller_.removeObserver(this);\n };\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.gatherActive = function () {\n var _this = this;\n\n this.clearActive();\n this.observations_.forEach(function (observation) {\n if (observation.isActive()) {\n _this.activeObservations_.push(observation);\n }\n });\n };\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.broadcastActive = function () {\n // Do nothing if observer doesn't have active observations.\n if (!this.hasActive()) {\n return;\n }\n\n var ctx = this.callbackCtx_; // Create ResizeObserverEntry instance for every active observation.\n\n var entries = this.activeObservations_.map(function (observation) {\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\n });\n this.callback_.call(ctx, entries, ctx);\n this.clearActive();\n };\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.clearActive = function () {\n this.activeObservations_.splice(0);\n };\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\n\n\n ResizeObserverSPI.prototype.hasActive = function () {\n return this.activeObservations_.length > 0;\n };\n\n return ResizeObserverSPI;\n}(); // Registry of internal observers. If WeakMap is not available use current shim\n// for the Map collection as it has all required methods and because WeakMap\n// can't be fully polyfilled anyway.\n\n\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\n\nvar ResizeObserver =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\n function ResizeObserver(callback) {\n if (!(this instanceof ResizeObserver)) {\n throw new TypeError('Cannot call a class as a function.');\n }\n\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n\n var controller = ResizeObserverController.getInstance();\n var observer = new ResizeObserverSPI(callback, controller, this);\n observers.set(this, observer);\n }\n\n return ResizeObserver;\n}(); // Expose public methods of ResizeObserver.\n\n\n['observe', 'unobserve', 'disconnect'].forEach(function (method) {\n ResizeObserver.prototype[method] = function () {\n var _a;\n\n return (_a = observers.get(this))[method].apply(_a, arguments);\n };\n});\n\nvar index = function () {\n // Export existing implementation if available.\n if (typeof global$1.ResizeObserver !== 'undefined') {\n return global$1.ResizeObserver;\n }\n\n return ResizeObserver;\n}();\n\n/* harmony default export */ var ResizeObserver_es = (index);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/globals.js\nvar window_ = typeof window !== 'undefined' ? window : __webpack_require__.g;\nvar global_ = typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : window;\nvar document_ = typeof document !== 'undefined' ? document : {};\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/style-utils.js\n\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction style_utils_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = style_utils_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction style_utils_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return style_utils_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 style_utils_arrayLikeToArray(o, minLen);\n}\n\nfunction style_utils_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\nvar refProps = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\nfunction normalizeStyle(style) {\n if (!style) {\n return null;\n }\n\n if (typeof style === 'string') {\n return style;\n }\n\n if (style.toJS) {\n style = style.toJS();\n }\n\n var layerIndex = {};\n\n var _iterator = style_utils_createForOfIteratorHelper(style.layers),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var layer = _step.value;\n layerIndex[layer.id] = layer;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var layers = style.layers.map(function (layer) {\n var layerRef = layerIndex[layer.ref];\n var normalizedLayer = null;\n\n if ('interactive' in layer) {\n normalizedLayer = _objectSpread({}, layer);\n delete normalizedLayer.interactive;\n }\n\n if (layerRef) {\n normalizedLayer = normalizedLayer || _objectSpread({}, layer);\n delete normalizedLayer.ref;\n\n var _iterator2 = style_utils_createForOfIteratorHelper(refProps),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var propName = _step2.value;\n\n if (propName in layerRef) {\n normalizedLayer[propName] = layerRef[propName];\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n\n return normalizedLayer || layer;\n });\n return _objectSpread(_objectSpread({}, style), {}, {\n layers: layers\n });\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/mapbox/mapbox.js\n\n\n\n\n\n\n\nfunction noop() {}\n\nfunction defaultOnError(event) {\n if (event) {\n console.error(event.error);\n }\n}\n\nvar propTypes = {\n container: prop_types.object,\n gl: prop_types.object,\n mapboxApiAccessToken: prop_types.string,\n mapboxApiUrl: prop_types.string,\n attributionControl: prop_types.bool,\n preserveDrawingBuffer: prop_types.bool,\n reuseMaps: prop_types.bool,\n transformRequest: prop_types.func,\n mapOptions: prop_types.object,\n mapStyle: prop_types.oneOfType([prop_types.string, prop_types.object]),\n preventStyleDiffing: prop_types.bool,\n visible: prop_types.bool,\n asyncRender: prop_types.bool,\n onLoad: prop_types.func,\n onError: prop_types.func,\n width: prop_types.number,\n height: prop_types.number,\n viewState: prop_types.object,\n longitude: prop_types.number,\n latitude: prop_types.number,\n zoom: prop_types.number,\n bearing: prop_types.number,\n pitch: prop_types.number,\n altitude: prop_types.number\n};\nvar defaultProps = {\n container: document_.body,\n mapboxApiAccessToken: getAccessToken(),\n mapboxApiUrl: 'https://api.mapbox.com',\n preserveDrawingBuffer: false,\n attributionControl: true,\n reuseMaps: false,\n mapOptions: {},\n mapStyle: 'mapbox://styles/mapbox/light-v8',\n preventStyleDiffing: false,\n visible: true,\n asyncRender: false,\n onLoad: noop,\n onError: defaultOnError,\n width: 0,\n height: 0,\n longitude: 0,\n latitude: 0,\n zoom: 0,\n bearing: 0,\n pitch: 0,\n altitude: 1.5\n};\nfunction getAccessToken() {\n var accessToken = null;\n\n if (typeof window !== 'undefined' && window.location) {\n var match = window.location.search.match(/access_token=([^&\\/]*)/);\n accessToken = match && match[1];\n }\n\n if (!accessToken && typeof process !== 'undefined') {\n accessToken = accessToken || ({}).MapboxAccessToken || ({}).REACT_APP_MAPBOX_ACCESS_TOKEN;\n }\n\n return accessToken || 'no-token';\n}\n\nfunction checkPropTypes(props) {\n var component = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'component';\n\n if (props.debug) {\n prop_types.checkPropTypes(propTypes, props, 'prop', component);\n }\n}\n\nvar Mapbox = function () {\n function Mapbox(props) {\n var _this = this;\n\n _classCallCheck(this, Mapbox);\n\n _defineProperty(this, \"props\", defaultProps);\n\n _defineProperty(this, \"width\", 0);\n\n _defineProperty(this, \"height\", 0);\n\n _defineProperty(this, \"_fireLoadEvent\", function () {\n _this.props.onLoad({\n type: 'load',\n target: _this._map\n });\n });\n\n if (!props.mapboxgl) {\n throw new Error('Mapbox not available');\n }\n\n this.mapboxgl = props.mapboxgl;\n\n if (!Mapbox.initialized) {\n Mapbox.initialized = true;\n\n this._checkStyleSheet(this.mapboxgl.version);\n }\n\n this._initialize(props);\n }\n\n _createClass(Mapbox, [{\n key: \"finalize\",\n value: function finalize() {\n this._destroy();\n\n return this;\n }\n }, {\n key: \"setProps\",\n value: function setProps(props) {\n this._update(this.props, props);\n\n return this;\n }\n }, {\n key: \"redraw\",\n value: function redraw() {\n var map = this._map;\n\n if (map.style) {\n if (map._frame) {\n map._frame.cancel();\n\n map._frame = null;\n }\n\n map._render();\n }\n }\n }, {\n key: \"getMap\",\n value: function getMap() {\n return this._map;\n }\n }, {\n key: \"_reuse\",\n value: function _reuse(props) {\n this._map = Mapbox.savedMap;\n\n var oldContainer = this._map.getContainer();\n\n var newContainer = props.container;\n newContainer.classList.add('mapboxgl-map');\n\n while (oldContainer.childNodes.length > 0) {\n newContainer.appendChild(oldContainer.childNodes[0]);\n }\n\n this._map._container = newContainer;\n Mapbox.savedMap = null;\n\n if (props.mapStyle) {\n this._map.setStyle(normalizeStyle(props.mapStyle), {\n diff: false\n });\n }\n\n if (this._map.isStyleLoaded()) {\n this._fireLoadEvent();\n } else {\n this._map.once('styledata', this._fireLoadEvent);\n }\n }\n }, {\n key: \"_create\",\n value: function _create(props) {\n if (props.reuseMaps && Mapbox.savedMap) {\n this._reuse(props);\n } else {\n if (props.gl) {\n var getContext = HTMLCanvasElement.prototype.getContext;\n\n HTMLCanvasElement.prototype.getContext = function () {\n HTMLCanvasElement.prototype.getContext = getContext;\n return props.gl;\n };\n }\n\n var mapOptions = {\n container: props.container,\n center: [0, 0],\n zoom: 8,\n pitch: 0,\n bearing: 0,\n maxZoom: 24,\n style: normalizeStyle(props.mapStyle),\n interactive: false,\n trackResize: false,\n attributionControl: props.attributionControl,\n preserveDrawingBuffer: props.preserveDrawingBuffer\n };\n\n if (props.transformRequest) {\n mapOptions.transformRequest = props.transformRequest;\n }\n\n this._map = new this.mapboxgl.Map(Object.assign({}, mapOptions, props.mapOptions));\n\n this._map.once('load', props.onLoad);\n\n this._map.on('error', props.onError);\n }\n\n return this;\n }\n }, {\n key: \"_destroy\",\n value: function _destroy() {\n if (!this._map) {\n return;\n }\n\n if (!Mapbox.savedMap) {\n Mapbox.savedMap = this._map;\n\n this._map.off('load', this.props.onLoad);\n\n this._map.off('error', this.props.onError);\n\n this._map.off('styledata', this._fireLoadEvent);\n } else {\n this._map.remove();\n }\n\n this._map = null;\n }\n }, {\n key: \"_initialize\",\n value: function _initialize(props) {\n var _this2 = this;\n\n props = Object.assign({}, defaultProps, props);\n checkPropTypes(props, 'Mapbox');\n this.mapboxgl.accessToken = props.mapboxApiAccessToken || defaultProps.mapboxApiAccessToken;\n this.mapboxgl.baseApiUrl = props.mapboxApiUrl;\n\n this._create(props);\n\n var _props = props,\n container = _props.container;\n Object.defineProperty(container, 'offsetWidth', {\n get: function get() {\n return _this2.width;\n }\n });\n Object.defineProperty(container, 'clientWidth', {\n get: function get() {\n return _this2.width;\n }\n });\n Object.defineProperty(container, 'offsetHeight', {\n get: function get() {\n return _this2.height;\n }\n });\n Object.defineProperty(container, 'clientHeight', {\n get: function get() {\n return _this2.height;\n }\n });\n\n var canvas = this._map.getCanvas();\n\n if (canvas) {\n canvas.style.outline = 'none';\n }\n\n this._updateMapViewport({}, props);\n\n this._updateMapSize({}, props);\n\n this.props = props;\n }\n }, {\n key: \"_update\",\n value: function _update(oldProps, newProps) {\n if (!this._map) {\n return;\n }\n\n newProps = Object.assign({}, this.props, newProps);\n checkPropTypes(newProps, 'Mapbox');\n\n var viewportChanged = this._updateMapViewport(oldProps, newProps);\n\n var sizeChanged = this._updateMapSize(oldProps, newProps);\n\n this._updateMapStyle(oldProps, newProps);\n\n if (!newProps.asyncRender && (viewportChanged || sizeChanged)) {\n this.redraw();\n }\n\n this.props = newProps;\n }\n }, {\n key: \"_updateMapStyle\",\n value: function _updateMapStyle(oldProps, newProps) {\n var styleChanged = oldProps.mapStyle !== newProps.mapStyle;\n\n if (styleChanged) {\n this._map.setStyle(normalizeStyle(newProps.mapStyle), {\n diff: !newProps.preventStyleDiffing\n });\n }\n }\n }, {\n key: \"_updateMapSize\",\n value: function _updateMapSize(oldProps, newProps) {\n var sizeChanged = oldProps.width !== newProps.width || oldProps.height !== newProps.height;\n\n if (sizeChanged) {\n this.width = newProps.width;\n this.height = newProps.height;\n\n this._map.resize();\n }\n\n return sizeChanged;\n }\n }, {\n key: \"_updateMapViewport\",\n value: function _updateMapViewport(oldProps, newProps) {\n var oldViewState = this._getViewState(oldProps);\n\n var newViewState = this._getViewState(newProps);\n\n var viewportChanged = newViewState.latitude !== oldViewState.latitude || newViewState.longitude !== oldViewState.longitude || newViewState.zoom !== oldViewState.zoom || newViewState.pitch !== oldViewState.pitch || newViewState.bearing !== oldViewState.bearing || newViewState.altitude !== oldViewState.altitude;\n\n if (viewportChanged) {\n this._map.jumpTo(this._viewStateToMapboxProps(newViewState));\n\n if (newViewState.altitude !== oldViewState.altitude) {\n this._map.transform.altitude = newViewState.altitude;\n }\n }\n\n return viewportChanged;\n }\n }, {\n key: \"_getViewState\",\n value: function _getViewState(props) {\n var _ref = props.viewState || props,\n longitude = _ref.longitude,\n latitude = _ref.latitude,\n zoom = _ref.zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? 1.5 : _ref$altitude;\n\n return {\n longitude: longitude,\n latitude: latitude,\n zoom: zoom,\n pitch: pitch,\n bearing: bearing,\n altitude: altitude\n };\n }\n }, {\n key: \"_checkStyleSheet\",\n value: function _checkStyleSheet() {\n var mapboxVersion = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '0.47.0';\n\n if (typeof document_ === 'undefined') {\n return;\n }\n\n try {\n var testElement = document_.createElement('div');\n testElement.className = 'mapboxgl-map';\n testElement.style.display = 'none';\n document_.body.appendChild(testElement);\n var isCssLoaded = window.getComputedStyle(testElement).position !== 'static';\n\n if (!isCssLoaded) {\n var link = document_.createElement('link');\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('type', 'text/css');\n link.setAttribute('href', \"https://api.tiles.mapbox.com/mapbox-gl-js/v\".concat(mapboxVersion, \"/mapbox-gl.css\"));\n document_.head.appendChild(link);\n }\n } catch (error) {}\n }\n }, {\n key: \"_viewStateToMapboxProps\",\n value: function _viewStateToMapboxProps(viewState) {\n return {\n center: [viewState.longitude, viewState.latitude],\n zoom: viewState.zoom,\n bearing: viewState.bearing,\n pitch: viewState.pitch\n };\n }\n }]);\n\n return Mapbox;\n}();\n\n_defineProperty(Mapbox, \"initialized\", false);\n\n_defineProperty(Mapbox, \"propTypes\", propTypes);\n\n_defineProperty(Mapbox, \"defaultProps\", defaultProps);\n\n_defineProperty(Mapbox, \"savedMap\", null);\n\n\n// EXTERNAL MODULE: ./node_modules/maplibre-gl/dist/maplibre-gl.js\nvar maplibre_gl = __webpack_require__(9910);\nvar maplibre_gl_default = /*#__PURE__*/__webpack_require__.n(maplibre_gl);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/mapboxgl.browser.js\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/math-utils.js\nvar math_utils_EPSILON = 1e-7;\n\nfunction isArray(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\n\nfunction math_utils_equals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; ++i) {\n if (!math_utils_equals(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n return Math.abs(a - b) <= math_utils_EPSILON;\n}\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction utils_math_utils_lerp(a, b, t) {\n if (isArray(a)) {\n return a.map(function (ai, i) {\n return utils_math_utils_lerp(ai, b[i], t);\n });\n }\n\n return t * b + (1 - t) * a;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/assert.js\nfunction utils_assert_assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'react-map-gl: assertion failed.');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-state.js\n\n\n\n\n\nfunction map_state_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_state_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_state_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_state_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar MAPBOX_LIMITS = {\n minZoom: 0,\n maxZoom: 24,\n minPitch: 0,\n maxPitch: 85\n};\nvar DEFAULT_STATE = {\n pitch: 0,\n bearing: 0,\n altitude: 1.5\n};\nvar PITCH_MOUSE_THRESHOLD = 5;\nvar PITCH_ACCEL = 1.2;\n\nvar MapState = function () {\n function MapState(_ref) {\n var width = _ref.width,\n height = _ref.height,\n latitude = _ref.latitude,\n longitude = _ref.longitude,\n zoom = _ref.zoom,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? DEFAULT_STATE.altitude : _ref$altitude,\n _ref$maxZoom = _ref.maxZoom,\n maxZoom = _ref$maxZoom === void 0 ? MAPBOX_LIMITS.maxZoom : _ref$maxZoom,\n _ref$minZoom = _ref.minZoom,\n minZoom = _ref$minZoom === void 0 ? MAPBOX_LIMITS.minZoom : _ref$minZoom,\n _ref$maxPitch = _ref.maxPitch,\n maxPitch = _ref$maxPitch === void 0 ? MAPBOX_LIMITS.maxPitch : _ref$maxPitch,\n _ref$minPitch = _ref.minPitch,\n minPitch = _ref$minPitch === void 0 ? MAPBOX_LIMITS.minPitch : _ref$minPitch,\n transitionDuration = _ref.transitionDuration,\n transitionEasing = _ref.transitionEasing,\n transitionInterpolator = _ref.transitionInterpolator,\n transitionInterruption = _ref.transitionInterruption,\n startPanLngLat = _ref.startPanLngLat,\n startZoomLngLat = _ref.startZoomLngLat,\n startRotatePos = _ref.startRotatePos,\n startBearing = _ref.startBearing,\n startPitch = _ref.startPitch,\n startZoom = _ref.startZoom;\n\n _classCallCheck(this, MapState);\n\n utils_assert_assert(Number.isFinite(width), '`width` must be supplied');\n utils_assert_assert(Number.isFinite(height), '`height` must be supplied');\n utils_assert_assert(Number.isFinite(longitude), '`longitude` must be supplied');\n utils_assert_assert(Number.isFinite(latitude), '`latitude` must be supplied');\n utils_assert_assert(Number.isFinite(zoom), '`zoom` must be supplied');\n this._viewportProps = this._applyConstraints({\n width: width,\n height: height,\n latitude: latitude,\n longitude: longitude,\n zoom: zoom,\n bearing: bearing,\n pitch: pitch,\n altitude: altitude,\n maxZoom: maxZoom,\n minZoom: minZoom,\n maxPitch: maxPitch,\n minPitch: minPitch,\n transitionDuration: transitionDuration,\n transitionEasing: transitionEasing,\n transitionInterpolator: transitionInterpolator,\n transitionInterruption: transitionInterruption\n });\n this._state = {\n startPanLngLat: startPanLngLat,\n startZoomLngLat: startZoomLngLat,\n startRotatePos: startRotatePos,\n startBearing: startBearing,\n startPitch: startPitch,\n startZoom: startZoom\n };\n }\n\n _createClass(MapState, [{\n key: \"getViewportProps\",\n value: function getViewportProps() {\n return this._viewportProps;\n }\n }, {\n key: \"getState\",\n value: function getState() {\n return this._state;\n }\n }, {\n key: \"panStart\",\n value: function panStart(_ref2) {\n var pos = _ref2.pos;\n return this._getUpdatedMapState({\n startPanLngLat: this._unproject(pos)\n });\n }\n }, {\n key: \"pan\",\n value: function pan(_ref3) {\n var pos = _ref3.pos,\n startPos = _ref3.startPos;\n\n var startPanLngLat = this._state.startPanLngLat || this._unproject(startPos);\n\n if (!startPanLngLat) {\n return this;\n }\n\n var _this$_calculateNewLn = this._calculateNewLngLat({\n startPanLngLat: startPanLngLat,\n pos: pos\n }),\n _this$_calculateNewLn2 = slicedToArray_slicedToArray(_this$_calculateNewLn, 2),\n longitude = _this$_calculateNewLn2[0],\n latitude = _this$_calculateNewLn2[1];\n\n return this._getUpdatedMapState({\n longitude: longitude,\n latitude: latitude\n });\n }\n }, {\n key: \"panEnd\",\n value: function panEnd() {\n return this._getUpdatedMapState({\n startPanLngLat: null\n });\n }\n }, {\n key: \"rotateStart\",\n value: function rotateStart(_ref4) {\n var pos = _ref4.pos;\n return this._getUpdatedMapState({\n startRotatePos: pos,\n startBearing: this._viewportProps.bearing,\n startPitch: this._viewportProps.pitch\n });\n }\n }, {\n key: \"rotate\",\n value: function rotate(_ref5) {\n var pos = _ref5.pos,\n _ref5$deltaAngleX = _ref5.deltaAngleX,\n deltaAngleX = _ref5$deltaAngleX === void 0 ? 0 : _ref5$deltaAngleX,\n _ref5$deltaAngleY = _ref5.deltaAngleY,\n deltaAngleY = _ref5$deltaAngleY === void 0 ? 0 : _ref5$deltaAngleY;\n var _this$_state = this._state,\n startRotatePos = _this$_state.startRotatePos,\n startBearing = _this$_state.startBearing,\n startPitch = _this$_state.startPitch;\n\n if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) {\n return this;\n }\n\n var newRotation;\n\n if (pos) {\n newRotation = this._calculateNewPitchAndBearing(map_state_objectSpread(map_state_objectSpread({}, this._getRotationParams(pos, startRotatePos)), {}, {\n startBearing: startBearing,\n startPitch: startPitch\n }));\n } else {\n newRotation = {\n bearing: startBearing + deltaAngleX,\n pitch: startPitch + deltaAngleY\n };\n }\n\n return this._getUpdatedMapState(newRotation);\n }\n }, {\n key: \"rotateEnd\",\n value: function rotateEnd() {\n return this._getUpdatedMapState({\n startBearing: null,\n startPitch: null\n });\n }\n }, {\n key: \"zoomStart\",\n value: function zoomStart(_ref6) {\n var pos = _ref6.pos;\n return this._getUpdatedMapState({\n startZoomLngLat: this._unproject(pos),\n startZoom: this._viewportProps.zoom\n });\n }\n }, {\n key: \"zoom\",\n value: function zoom(_ref7) {\n var pos = _ref7.pos,\n startPos = _ref7.startPos,\n scale = _ref7.scale;\n utils_assert_assert(scale > 0, '`scale` must be a positive number');\n var _this$_state2 = this._state,\n startZoom = _this$_state2.startZoom,\n startZoomLngLat = _this$_state2.startZoomLngLat;\n\n if (!Number.isFinite(startZoom)) {\n startZoom = this._viewportProps.zoom;\n startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n }\n\n utils_assert_assert(startZoomLngLat, '`startZoomLngLat` prop is required ' + 'for zoom behavior to calculate where to position the map.');\n\n var zoom = this._calculateNewZoom({\n scale: scale,\n startZoom: startZoom || 0\n });\n\n var zoomedViewport = new WebMercatorViewport(Object.assign({}, this._viewportProps, {\n zoom: zoom\n }));\n\n var _zoomedViewport$getMa = zoomedViewport.getMapCenterByLngLatPosition({\n lngLat: startZoomLngLat,\n pos: pos\n }),\n _zoomedViewport$getMa2 = slicedToArray_slicedToArray(_zoomedViewport$getMa, 2),\n longitude = _zoomedViewport$getMa2[0],\n latitude = _zoomedViewport$getMa2[1];\n\n return this._getUpdatedMapState({\n zoom: zoom,\n longitude: longitude,\n latitude: latitude\n });\n }\n }, {\n key: \"zoomEnd\",\n value: function zoomEnd() {\n return this._getUpdatedMapState({\n startZoomLngLat: null,\n startZoom: null\n });\n }\n }, {\n key: \"_getUpdatedMapState\",\n value: function _getUpdatedMapState(newProps) {\n return new MapState(Object.assign({}, this._viewportProps, this._state, newProps));\n }\n }, {\n key: \"_applyConstraints\",\n value: function _applyConstraints(props) {\n var maxZoom = props.maxZoom,\n minZoom = props.minZoom,\n zoom = props.zoom;\n props.zoom = clamp(zoom, minZoom, maxZoom);\n var maxPitch = props.maxPitch,\n minPitch = props.minPitch,\n pitch = props.pitch;\n props.pitch = clamp(pitch, minPitch, maxPitch);\n Object.assign(props, normalizeViewportProps(props));\n return props;\n }\n }, {\n key: \"_unproject\",\n value: function _unproject(pos) {\n var viewport = new WebMercatorViewport(this._viewportProps);\n return pos && viewport.unproject(pos);\n }\n }, {\n key: \"_calculateNewLngLat\",\n value: function _calculateNewLngLat(_ref8) {\n var startPanLngLat = _ref8.startPanLngLat,\n pos = _ref8.pos;\n var viewport = new WebMercatorViewport(this._viewportProps);\n return viewport.getMapCenterByLngLatPosition({\n lngLat: startPanLngLat,\n pos: pos\n });\n }\n }, {\n key: \"_calculateNewZoom\",\n value: function _calculateNewZoom(_ref9) {\n var scale = _ref9.scale,\n startZoom = _ref9.startZoom;\n var _this$_viewportProps = this._viewportProps,\n maxZoom = _this$_viewportProps.maxZoom,\n minZoom = _this$_viewportProps.minZoom;\n var zoom = startZoom + Math.log2(scale);\n return clamp(zoom, minZoom, maxZoom);\n }\n }, {\n key: \"_calculateNewPitchAndBearing\",\n value: function _calculateNewPitchAndBearing(_ref10) {\n var deltaScaleX = _ref10.deltaScaleX,\n deltaScaleY = _ref10.deltaScaleY,\n startBearing = _ref10.startBearing,\n startPitch = _ref10.startPitch;\n deltaScaleY = clamp(deltaScaleY, -1, 1);\n var _this$_viewportProps2 = this._viewportProps,\n minPitch = _this$_viewportProps2.minPitch,\n maxPitch = _this$_viewportProps2.maxPitch;\n var bearing = startBearing + 180 * deltaScaleX;\n var pitch = startPitch;\n\n if (deltaScaleY > 0) {\n pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n } else if (deltaScaleY < 0) {\n pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n }\n\n return {\n pitch: pitch,\n bearing: bearing\n };\n }\n }, {\n key: \"_getRotationParams\",\n value: function _getRotationParams(pos, startPos) {\n var deltaX = pos[0] - startPos[0];\n var deltaY = pos[1] - startPos[1];\n var centerY = pos[1];\n var startY = startPos[1];\n var _this$_viewportProps3 = this._viewportProps,\n width = _this$_viewportProps3.width,\n height = _this$_viewportProps3.height;\n var deltaScaleX = deltaX / width;\n var deltaScaleY = 0;\n\n if (deltaY > 0) {\n if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) {\n deltaScaleY = deltaY / (startY - height) * PITCH_ACCEL;\n }\n } else if (deltaY < 0) {\n if (startY > PITCH_MOUSE_THRESHOLD) {\n deltaScaleY = 1 - centerY / startY;\n }\n }\n\n deltaScaleY = Math.min(1, Math.max(-1, deltaScaleY));\n return {\n deltaScaleX: deltaScaleX,\n deltaScaleY: deltaScaleY\n };\n }\n }]);\n\n return MapState;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-constraints.js\n\n\nfunction decapitalize(s) {\n return s[0].toLowerCase() + s.slice(1);\n}\n\nfunction checkVisibilityConstraints(props) {\n var constraints = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : MAPBOX_LIMITS;\n\n for (var constraintName in constraints) {\n var type = constraintName.slice(0, 3);\n var propName = decapitalize(constraintName.slice(3));\n\n if (type === 'min' && props[propName] < constraints[constraintName]) {\n return false;\n }\n\n if (type === 'max' && props[propName] > constraints[constraintName]) {\n return false;\n }\n }\n\n return true;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/map-context.js\n\n\n\nfunction map_context_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_context_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_context_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_context_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar MapContext = (0,react.createContext)({\n viewport: null,\n map: null,\n container: null,\n onViewportChange: null,\n onViewStateChange: null,\n eventManager: null\n});\nvar MapContextProvider = MapContext.Provider;\n\nfunction WrappedProvider(_ref) {\n var value = _ref.value,\n children = _ref.children;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n map = _useState2[0],\n setMap = _useState2[1];\n\n var context = (0,react.useContext)(MapContext);\n value = map_context_objectSpread(map_context_objectSpread({\n setMap: setMap\n }, context), {}, {\n map: context && context.map || map\n }, value);\n return react.createElement(MapContextProvider, {\n value: value\n }, children);\n}\n\nMapContext.Provider = WrappedProvider;\n/* harmony default export */ var map_context = (MapContext);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/use-isomorphic-layout-effect.js\n\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? react.useLayoutEffect : react.useEffect;\n/* harmony default export */ var use_isomorphic_layout_effect = (useIsomorphicLayoutEffect);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/terrain.js\nfunction getTerrainElevation(map, _ref) {\n var longitude = _ref.longitude,\n latitude = _ref.latitude;\n\n if (map && map.queryTerrainElevation) {\n return map.queryTerrainElevation([longitude, latitude]) || 0;\n }\n\n return 0;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/static-map.js\n\n\n\nfunction static_map_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction static_map_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n static_map_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n static_map_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\n\n\nvar TOKEN_DOC_URL = 'https://visgl.github.io/react-map-gl/docs/get-started/mapbox-tokens';\nvar NO_TOKEN_WARNING = 'A valid API access token is required to use Mapbox data';\n\nfunction static_map_noop() {}\n\nfunction getViewport(_ref) {\n var map = _ref.map,\n props = _ref.props,\n width = _ref.width,\n height = _ref.height;\n\n var viewportProps = static_map_objectSpread(static_map_objectSpread(static_map_objectSpread({}, props), props.viewState), {}, {\n width: width,\n height: height\n });\n\n viewportProps.position = [0, 0, getTerrainElevation(map, viewportProps)];\n return new WebMercatorViewport(viewportProps);\n}\nvar UNAUTHORIZED_ERROR_CODE = 401;\nvar CONTAINER_STYLE = {\n position: 'absolute',\n width: '100%',\n height: '100%',\n overflow: 'hidden'\n};\nvar static_map_defaultProps = Object.assign({}, Mapbox.defaultProps, {\n disableTokenWarning: false,\n visible: true,\n onResize: static_map_noop,\n className: '',\n style: null,\n visibilityConstraints: MAPBOX_LIMITS\n});\n\nfunction NoTokenWarning() {\n var style = {\n position: 'absolute',\n left: 0,\n top: 0\n };\n return react.createElement(\"div\", {\n key: \"warning\",\n id: \"no-token-warning\",\n style: style\n }, react.createElement(\"h3\", {\n key: \"header\"\n }, NO_TOKEN_WARNING), react.createElement(\"div\", {\n key: \"text\"\n }, \"For information on setting up your basemap, read\"), react.createElement(\"a\", {\n key: \"link\",\n href: TOKEN_DOC_URL\n }, \"Note on Map Tokens\"));\n}\n\nfunction getRefHandles(mapboxRef) {\n return {\n getMap: function getMap() {\n return mapboxRef.current && mapboxRef.current.getMap();\n },\n queryRenderedFeatures: function queryRenderedFeatures(geometry) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var map = mapboxRef.current && mapboxRef.current.getMap();\n return map && map.queryRenderedFeatures(geometry, options);\n }\n };\n}\n\nvar StaticMap = (0,react.forwardRef)(function (props, ref) {\n var _useState = (0,react.useState)(true),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n accessTokenValid = _useState2[0],\n setTokenState = _useState2[1];\n\n var _useState3 = (0,react.useState)({\n width: 0,\n height: 0\n }),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n size = _useState4[0],\n setSize = _useState4[1];\n\n var mapboxRef = (0,react.useRef)(null);\n var mapDivRef = (0,react.useRef)(null);\n var containerRef = (0,react.useRef)(null);\n var overlayRef = (0,react.useRef)(null);\n var context = (0,react.useContext)(map_context);\n use_isomorphic_layout_effect(function () {\n if (!StaticMap.supported()) {\n return undefined;\n }\n\n var mapbox = new Mapbox(static_map_objectSpread(static_map_objectSpread(static_map_objectSpread({}, props), size), {}, {\n mapboxgl: (maplibre_gl_default()),\n container: mapDivRef.current,\n onError: function onError(evt) {\n var statusCode = evt.error && evt.error.status || evt.status;\n\n if (statusCode === UNAUTHORIZED_ERROR_CODE && accessTokenValid) {\n console.error(NO_TOKEN_WARNING);\n setTokenState(false);\n }\n\n props.onError(evt);\n }\n }));\n mapboxRef.current = mapbox;\n\n if (context && context.setMap) {\n context.setMap(mapbox.getMap());\n }\n\n var resizeObserver = new ResizeObserver_es(function (entries) {\n if (entries[0].contentRect) {\n var _entries$0$contentRec = entries[0].contentRect,\n _width = _entries$0$contentRec.width,\n _height = _entries$0$contentRec.height;\n setSize({\n width: _width,\n height: _height\n });\n props.onResize({\n width: _width,\n height: _height\n });\n }\n });\n resizeObserver.observe(containerRef.current);\n return function () {\n mapbox.finalize();\n mapboxRef.current = null;\n resizeObserver.disconnect();\n };\n }, []);\n use_isomorphic_layout_effect(function () {\n if (mapboxRef.current) {\n mapboxRef.current.setProps(static_map_objectSpread(static_map_objectSpread({}, props), size));\n }\n });\n var map = mapboxRef.current && mapboxRef.current.getMap();\n (0,react.useImperativeHandle)(ref, function () {\n return getRefHandles(mapboxRef);\n }, []);\n var preventScroll = (0,react.useCallback)(function (_ref2) {\n var target = _ref2.target;\n\n if (target === overlayRef.current) {\n target.scrollTo(0, 0);\n }\n }, []);\n var overlays = map && react.createElement(MapContextProvider, {\n value: static_map_objectSpread(static_map_objectSpread({}, context), {}, {\n viewport: context.viewport || getViewport(static_map_objectSpread({\n map: map,\n props: props\n }, size)),\n map: map,\n container: context.container || containerRef.current\n })\n }, react.createElement(\"div\", {\n key: \"map-overlays\",\n className: \"overlays\",\n ref: overlayRef,\n style: CONTAINER_STYLE,\n onScroll: preventScroll\n }, props.children));\n var className = props.className,\n width = props.width,\n height = props.height,\n style = props.style,\n visibilityConstraints = props.visibilityConstraints;\n var mapContainerStyle = Object.assign({\n position: 'relative'\n }, style, {\n width: width,\n height: height\n });\n var visible = props.visible && checkVisibilityConstraints(props.viewState || props, visibilityConstraints);\n var mapStyle = Object.assign({}, CONTAINER_STYLE, {\n visibility: visible ? 'inherit' : 'hidden'\n });\n return react.createElement(\"div\", {\n key: \"map-container\",\n ref: containerRef,\n style: mapContainerStyle\n }, react.createElement(\"div\", {\n key: \"map-mapbox\",\n ref: mapDivRef,\n style: mapStyle,\n className: className\n }), overlays, !accessTokenValid && !props.disableTokenWarning && react.createElement(NoTokenWarning, null));\n});\n\nStaticMap.supported = function () {\n return (maplibre_gl_default()) && maplibre_gl_default().supported();\n};\n\nStaticMap.defaultProps = static_map_defaultProps;\n/* harmony default export */ var static_map = (StaticMap);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/transition-interpolator.js\n\n\n\n\nfunction transition_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = transition_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction transition_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return transition_interpolator_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 transition_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction transition_interpolator_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\n\n\n\nvar TransitionInterpolator = function () {\n function TransitionInterpolator() {\n _classCallCheck(this, TransitionInterpolator);\n\n _defineProperty(this, \"propNames\", []);\n }\n\n _createClass(TransitionInterpolator, [{\n key: \"arePropsEqual\",\n value: function arePropsEqual(currentProps, nextProps) {\n var _iterator = transition_interpolator_createForOfIteratorHelper(this.propNames || []),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n\n if (!math_utils_equals(currentProps[key], nextProps[key])) {\n return false;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return true;\n }\n }, {\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n return {\n start: startProps,\n end: endProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n utils_assert_assert(false, 'interpolateProps is not implemented');\n }\n }, {\n key: \"getDuration\",\n value: function getDuration(startProps, endProps) {\n return endProps.transitionDuration;\n }\n }]);\n\n return TransitionInterpolator;\n}();\n\n\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// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nvar setPrototypeOf = __webpack_require__(4665);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js\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/* default */.Z)(subClass, superClass);\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/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}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js\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}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/transition-utils.js\nvar WRAPPED_ANGULAR_PROPS = {\n longitude: 1,\n bearing: 1\n};\nfunction transition_utils_mod(value, divisor) {\n var modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction isValid(prop) {\n return Number.isFinite(prop) || Array.isArray(prop);\n}\n\nfunction isWrappedAngularProp(propName) {\n return propName in WRAPPED_ANGULAR_PROPS;\n}\n\nfunction getEndValueByShortestPath(propName, startValue, endValue) {\n if (isWrappedAngularProp(propName) && Math.abs(endValue - startValue) > 180) {\n endValue = endValue < 0 ? endValue + 360 : endValue - 360;\n }\n\n return endValue;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/viewport-fly-to-interpolator.js\n\n\n\n\n\n\n\n\nfunction viewport_fly_to_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = viewport_fly_to_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction viewport_fly_to_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return viewport_fly_to_interpolator_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 viewport_fly_to_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction viewport_fly_to_interpolator_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\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\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 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\n\nvar viewport_fly_to_interpolator_VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\nvar REQUIRED_PROPS = ['latitude', 'longitude', 'zoom', 'width', 'height'];\nvar LINEARLY_INTERPOLATED_PROPS = ['bearing', 'pitch'];\nvar viewport_fly_to_interpolator_DEFAULT_OPTS = {\n speed: 1.2,\n curve: 1.414\n};\n\nvar ViewportFlyToInterpolator = function (_TransitionInterpolat) {\n _inherits(ViewportFlyToInterpolator, _TransitionInterpolat);\n\n var _super = _createSuper(ViewportFlyToInterpolator);\n\n function ViewportFlyToInterpolator() {\n var _this;\n\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, ViewportFlyToInterpolator);\n\n _this = _super.call(this);\n\n _defineProperty(_assertThisInitialized(_this), \"propNames\", viewport_fly_to_interpolator_VIEWPORT_TRANSITION_PROPS);\n\n _this.props = Object.assign({}, viewport_fly_to_interpolator_DEFAULT_OPTS, props);\n return _this;\n }\n\n _createClass(ViewportFlyToInterpolator, [{\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n var startViewportProps = {};\n var endViewportProps = {};\n\n var _iterator = viewport_fly_to_interpolator_createForOfIteratorHelper(REQUIRED_PROPS),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n utils_assert_assert(isValid(startValue) && isValid(endValue), \"\".concat(key, \" must be supplied for transition\"));\n startViewportProps[key] = startValue;\n endViewportProps[key] = getEndValueByShortestPath(key, startValue, endValue);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var _iterator2 = viewport_fly_to_interpolator_createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _key = _step2.value;\n\n var _startValue = startProps[_key] || 0;\n\n var _endValue = endProps[_key] || 0;\n\n startViewportProps[_key] = _startValue;\n endViewportProps[_key] = getEndValueByShortestPath(_key, _startValue, _endValue);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n return {\n start: startViewportProps,\n end: endViewportProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n var viewport = flyToViewport(startProps, endProps, t, this.props);\n\n var _iterator3 = viewport_fly_to_interpolator_createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var key = _step3.value;\n viewport[key] = utils_math_utils_lerp(startProps[key], endProps[key], t);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n return viewport;\n }\n }, {\n key: \"getDuration\",\n value: function getDuration(startProps, endProps) {\n var transitionDuration = endProps.transitionDuration;\n\n if (transitionDuration === 'auto') {\n transitionDuration = getFlyToDuration(startProps, endProps, this.props);\n }\n\n return transitionDuration;\n }\n }]);\n\n return ViewportFlyToInterpolator;\n}(TransitionInterpolator);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/linear-interpolator.js\n\n\n\n\n\n\n\nfunction linear_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = linear_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction linear_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return linear_interpolator_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 linear_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction linear_interpolator_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\nfunction linear_interpolator_createSuper(Derived) {\n var hasNativeReflectConstruct = linear_interpolator_isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction linear_interpolator_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 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\n\nvar linear_interpolator_VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\n\nvar LinearInterpolator = function (_TransitionInterpolat) {\n _inherits(LinearInterpolator, _TransitionInterpolat);\n\n var _super = linear_interpolator_createSuper(LinearInterpolator);\n\n function LinearInterpolator() {\n var _this;\n\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, LinearInterpolator);\n\n _this = _super.call(this);\n\n if (Array.isArray(opts)) {\n opts = {\n transitionProps: opts\n };\n }\n\n _this.propNames = opts.transitionProps || linear_interpolator_VIEWPORT_TRANSITION_PROPS;\n\n if (opts.around) {\n _this.around = opts.around;\n }\n\n return _this;\n }\n\n _createClass(LinearInterpolator, [{\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n var startViewportProps = {};\n var endViewportProps = {};\n\n if (this.around) {\n startViewportProps.around = this.around;\n var aroundLngLat = new WebMercatorViewport(startProps).unproject(this.around);\n Object.assign(endViewportProps, endProps, {\n around: new WebMercatorViewport(endProps).project(aroundLngLat),\n aroundLngLat: aroundLngLat\n });\n }\n\n var _iterator = linear_interpolator_createForOfIteratorHelper(this.propNames),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n utils_assert_assert(isValid(startValue) && isValid(endValue), \"\".concat(key, \" must be supplied for transition\"));\n startViewportProps[key] = startValue;\n endViewportProps[key] = getEndValueByShortestPath(key, startValue, endValue);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return {\n start: startViewportProps,\n end: endViewportProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n var viewport = {};\n\n var _iterator2 = linear_interpolator_createForOfIteratorHelper(this.propNames),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var key = _step2.value;\n viewport[key] = utils_math_utils_lerp(startProps[key], endProps[key], t);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (endProps.around) {\n var _WebMercatorViewport$ = new WebMercatorViewport(Object.assign({}, endProps, viewport)).getMapCenterByLngLatPosition({\n lngLat: endProps.aroundLngLat,\n pos: utils_math_utils_lerp(startProps.around, endProps.around, t)\n }),\n _WebMercatorViewport$2 = slicedToArray_slicedToArray(_WebMercatorViewport$, 2),\n longitude = _WebMercatorViewport$2[0],\n latitude = _WebMercatorViewport$2[1];\n\n viewport.longitude = longitude;\n viewport.latitude = latitude;\n }\n\n return viewport;\n }\n }]);\n\n return LinearInterpolator;\n}(TransitionInterpolator);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/index.js\n\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition-manager.js\n\n\n\n\n\n\n\nvar transition_manager_noop = function noop() {};\n\nfunction cropEasingFunction(easing, x0) {\n var y0 = easing(x0);\n return function (t) {\n return 1 / (1 - y0) * (easing(t * (1 - x0) + x0) - y0);\n };\n}\nvar TRANSITION_EVENTS = {\n BREAK: 1,\n SNAP_TO_END: 2,\n IGNORE: 3,\n UPDATE: 4\n};\nvar DEFAULT_PROPS = {\n transitionDuration: 0,\n transitionEasing: function transitionEasing(t) {\n return t;\n },\n transitionInterpolator: new LinearInterpolator(),\n transitionInterruption: TRANSITION_EVENTS.BREAK,\n onTransitionStart: transition_manager_noop,\n onTransitionInterrupt: transition_manager_noop,\n onTransitionEnd: transition_manager_noop\n};\n\nvar TransitionManager = function () {\n function TransitionManager() {\n var _this = this;\n\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, TransitionManager);\n\n _defineProperty(this, \"_animationFrame\", null);\n\n _defineProperty(this, \"_onTransitionFrame\", function () {\n _this._animationFrame = requestAnimationFrame(_this._onTransitionFrame);\n\n _this._updateViewport();\n });\n\n this.props = null;\n this.onViewportChange = opts.onViewportChange || transition_manager_noop;\n this.onStateChange = opts.onStateChange || transition_manager_noop;\n this.time = opts.getTime || Date.now;\n }\n\n _createClass(TransitionManager, [{\n key: \"getViewportInTransition\",\n value: function getViewportInTransition() {\n return this._animationFrame ? this.state.propsInTransition : null;\n }\n }, {\n key: \"processViewportChange\",\n value: function processViewportChange(nextProps) {\n var currentProps = this.props;\n this.props = nextProps;\n\n if (!currentProps || this._shouldIgnoreViewportChange(currentProps, nextProps)) {\n return false;\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n var startProps = Object.assign({}, currentProps);\n var endProps = Object.assign({}, nextProps);\n\n if (this._isTransitionInProgress()) {\n currentProps.onTransitionInterrupt();\n\n if (this.state.interruption === TRANSITION_EVENTS.SNAP_TO_END) {\n Object.assign(startProps, this.state.endProps);\n } else {\n Object.assign(startProps, this.state.propsInTransition);\n }\n\n if (this.state.interruption === TRANSITION_EVENTS.UPDATE) {\n var currentTime = this.time();\n var x0 = (currentTime - this.state.startTime) / this.state.duration;\n endProps.transitionDuration = this.state.duration - (currentTime - this.state.startTime);\n endProps.transitionEasing = cropEasingFunction(this.state.easing, x0);\n endProps.transitionInterpolator = startProps.transitionInterpolator;\n }\n }\n\n endProps.onTransitionStart();\n\n this._triggerTransition(startProps, endProps);\n\n return true;\n }\n\n if (this._isTransitionInProgress()) {\n currentProps.onTransitionInterrupt();\n\n this._endTransition();\n }\n\n return false;\n }\n }, {\n key: \"_isTransitionInProgress\",\n value: function _isTransitionInProgress() {\n return Boolean(this._animationFrame);\n }\n }, {\n key: \"_isTransitionEnabled\",\n value: function _isTransitionEnabled(props) {\n var transitionDuration = props.transitionDuration,\n transitionInterpolator = props.transitionInterpolator;\n return (transitionDuration > 0 || transitionDuration === 'auto') && Boolean(transitionInterpolator);\n }\n }, {\n key: \"_isUpdateDueToCurrentTransition\",\n value: function _isUpdateDueToCurrentTransition(props) {\n if (this.state.propsInTransition) {\n return this.state.interpolator.arePropsEqual(props, this.state.propsInTransition);\n }\n\n return false;\n }\n }, {\n key: \"_shouldIgnoreViewportChange\",\n value: function _shouldIgnoreViewportChange(currentProps, nextProps) {\n if (!currentProps) {\n return true;\n }\n\n if (this._isTransitionInProgress()) {\n return this.state.interruption === TRANSITION_EVENTS.IGNORE || this._isUpdateDueToCurrentTransition(nextProps);\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n return nextProps.transitionInterpolator.arePropsEqual(currentProps, nextProps);\n }\n\n return true;\n }\n }, {\n key: \"_triggerTransition\",\n value: function _triggerTransition(startProps, endProps) {\n utils_assert_assert(this._isTransitionEnabled(endProps));\n\n if (this._animationFrame) {\n cancelAnimationFrame(this._animationFrame);\n }\n\n var transitionInterpolator = endProps.transitionInterpolator;\n var duration = transitionInterpolator.getDuration ? transitionInterpolator.getDuration(startProps, endProps) : endProps.transitionDuration;\n\n if (duration === 0) {\n return;\n }\n\n var initialProps = endProps.transitionInterpolator.initializeProps(startProps, endProps);\n var interactionState = {\n inTransition: true,\n isZooming: startProps.zoom !== endProps.zoom,\n isPanning: startProps.longitude !== endProps.longitude || startProps.latitude !== endProps.latitude,\n isRotating: startProps.bearing !== endProps.bearing || startProps.pitch !== endProps.pitch\n };\n this.state = {\n duration: duration,\n easing: endProps.transitionEasing,\n interpolator: endProps.transitionInterpolator,\n interruption: endProps.transitionInterruption,\n startTime: this.time(),\n startProps: initialProps.start,\n endProps: initialProps.end,\n animation: null,\n propsInTransition: {}\n };\n\n this._onTransitionFrame();\n\n this.onStateChange(interactionState);\n }\n }, {\n key: \"_endTransition\",\n value: function _endTransition() {\n if (this._animationFrame) {\n cancelAnimationFrame(this._animationFrame);\n this._animationFrame = null;\n }\n\n this.onStateChange({\n inTransition: false,\n isZooming: false,\n isPanning: false,\n isRotating: false\n });\n }\n }, {\n key: \"_updateViewport\",\n value: function _updateViewport() {\n var currentTime = this.time();\n var _this$state = this.state,\n startTime = _this$state.startTime,\n duration = _this$state.duration,\n easing = _this$state.easing,\n interpolator = _this$state.interpolator,\n startProps = _this$state.startProps,\n endProps = _this$state.endProps;\n var shouldEnd = false;\n var t = (currentTime - startTime) / duration;\n\n if (t >= 1) {\n t = 1;\n shouldEnd = true;\n }\n\n t = easing(t);\n var viewport = interpolator.interpolateProps(startProps, endProps, t);\n var mapState = new MapState(Object.assign({}, this.props, viewport));\n this.state.propsInTransition = mapState.getViewportProps();\n this.onViewportChange(this.state.propsInTransition, this.props);\n\n if (shouldEnd) {\n this._endTransition();\n\n this.props.onTransitionEnd();\n }\n }\n }]);\n\n return TransitionManager;\n}();\n\n_defineProperty(TransitionManager, \"defaultProps\", DEFAULT_PROPS);\n\n\n// EXTERNAL MODULE: ./node_modules/hammerjs/hammer.js\nvar hammer = __webpack_require__(5087);\nvar hammer_default = /*#__PURE__*/__webpack_require__.n(hammer);\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/hammer-overrides.js\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nfunction some(array, predict) {\n for (var i = 0; i < array.length; i++) {\n if (predict(array[i])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction enhancePointerEventInput(PointerEventInput) {\n var oldHandler = PointerEventInput.prototype.handler;\n\n PointerEventInput.prototype.handler = function handler(ev) {\n var store = this.store;\n\n if (ev.button > 0 && ev.type === 'pointerdown') {\n if (!some(store, function (e) {\n return e.pointerId === ev.pointerId;\n })) {\n store.push(ev);\n }\n }\n\n oldHandler.call(this, ev);\n };\n}\nfunction enhanceMouseInput(MouseInput) {\n MouseInput.prototype.handler = function handler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n if (eventType & INPUT_START && ev.button >= 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which === 0) {\n eventType = INPUT_END;\n }\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: 'mouse',\n srcEvent: ev\n });\n };\n}\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/hammer.browser.js\n\n\nenhancePointerEventInput((hammer_default()).PointerEventInput);\nenhanceMouseInput((hammer_default()).MouseInput);\nvar Manager = (hammer_default()).Manager;\n/* harmony default export */ var hammer_browser = ((hammer_default()));\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/constants.js\n\nvar RECOGNIZERS = hammer_browser ? [[hammer_browser.Pan, {\n event: 'tripan',\n pointers: 3,\n threshold: 0,\n enable: false\n}], [hammer_browser.Rotate, {\n enable: false\n}], [hammer_browser.Pinch, {\n enable: false\n}], [hammer_browser.Swipe, {\n enable: false\n}], [hammer_browser.Pan, {\n threshold: 0,\n enable: false\n}], [hammer_browser.Press, {\n enable: false\n}], [hammer_browser.Tap, {\n event: 'doubletap',\n taps: 2,\n enable: false\n}], [hammer_browser.Tap, {\n event: 'anytap',\n enable: false\n}], [hammer_browser.Tap, {\n enable: false\n}]] : null;\nvar RECOGNIZER_COMPATIBLE_MAP = {\n tripan: ['rotate', 'pinch', 'pan'],\n rotate: ['pinch'],\n pinch: ['pan'],\n pan: ['press', 'doubletap', 'anytap', 'tap'],\n doubletap: ['anytap'],\n anytap: ['tap']\n};\nvar RECOGNIZER_FALLBACK_MAP = {\n doubletap: ['tap']\n};\nvar BASIC_EVENT_ALIASES = {\n pointerdown: 'pointerdown',\n pointermove: 'pointermove',\n pointerup: 'pointerup',\n touchstart: 'pointerdown',\n touchmove: 'pointermove',\n touchend: 'pointerup',\n mousedown: 'pointerdown',\n mousemove: 'pointermove',\n mouseup: 'pointerup'\n};\nvar INPUT_EVENT_TYPES = {\n KEY_EVENTS: ['keydown', 'keyup'],\n MOUSE_EVENTS: ['mousedown', 'mousemove', 'mouseup', 'mouseover', 'mouseout', 'mouseleave'],\n WHEEL_EVENTS: ['wheel', 'mousewheel']\n};\nvar EVENT_RECOGNIZER_MAP = {\n tap: 'tap',\n anytap: 'anytap',\n doubletap: 'doubletap',\n press: 'press',\n pinch: 'pinch',\n pinchin: 'pinch',\n pinchout: 'pinch',\n pinchstart: 'pinch',\n pinchmove: 'pinch',\n pinchend: 'pinch',\n pinchcancel: 'pinch',\n rotate: 'rotate',\n rotatestart: 'rotate',\n rotatemove: 'rotate',\n rotateend: 'rotate',\n rotatecancel: 'rotate',\n tripan: 'tripan',\n tripanstart: 'tripan',\n tripanmove: 'tripan',\n tripanup: 'tripan',\n tripandown: 'tripan',\n tripanleft: 'tripan',\n tripanright: 'tripan',\n tripanend: 'tripan',\n tripancancel: 'tripan',\n pan: 'pan',\n panstart: 'pan',\n panmove: 'pan',\n panup: 'pan',\n pandown: 'pan',\n panleft: 'pan',\n panright: 'pan',\n panend: 'pan',\n pancancel: 'pan',\n swipe: 'swipe',\n swipeleft: 'swipe',\n swiperight: 'swipe',\n swipeup: 'swipe',\n swipedown: 'swipe'\n};\nvar GESTURE_EVENT_ALIASES = {\n click: 'tap',\n anyclick: 'anytap',\n dblclick: 'doubletap',\n mousedown: 'pointerdown',\n mousemove: 'pointermove',\n mouseup: 'pointerup',\n mouseover: 'pointerover',\n mouseout: 'pointerout',\n mouseleave: 'pointerleave'\n};\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/globals.js\nvar userAgent = typeof navigator !== 'undefined' && navigator.userAgent ? navigator.userAgent.toLowerCase() : '';\nvar globals_window_ = typeof window !== 'undefined' ? window : __webpack_require__.g;\nvar globals_global_ = typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : window;\nvar globals_document_ = typeof document !== 'undefined' ? document : {};\n\nvar passiveSupported = false;\n\ntry {\n var options = {\n get passive() {\n passiveSupported = true;\n return true;\n }\n\n };\n globals_window_.addEventListener('test', options, options);\n globals_window_.removeEventListener('test', options, options);\n} catch (err) {}\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/wheel-input.js\n\n\n\n\nvar firefox = userAgent.indexOf('firefox') !== -1;\nvar WHEEL_EVENTS = INPUT_EVENT_TYPES.WHEEL_EVENTS;\nvar EVENT_TYPE = 'wheel';\nvar WHEEL_DELTA_MAGIC_SCALER = 4.000244140625;\nvar WHEEL_DELTA_PER_LINE = 40;\nvar SHIFT_MULTIPLIER = 0.25;\n\nvar WheelInput = /*#__PURE__*/function () {\n function WheelInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, WheelInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.events = WHEEL_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent, passiveSupported ? {\n passive: false\n } : false);\n });\n }\n\n _createClass(WheelInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === EVENT_TYPE) {\n this.options.enable = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (!this.options.enable) {\n return;\n }\n\n var value = event.deltaY;\n\n if (globals_window_.WheelEvent) {\n if (firefox && event.deltaMode === globals_window_.WheelEvent.DOM_DELTA_PIXEL) {\n value /= globals_window_.devicePixelRatio;\n }\n\n if (event.deltaMode === globals_window_.WheelEvent.DOM_DELTA_LINE) {\n value *= WHEEL_DELTA_PER_LINE;\n }\n }\n\n var wheelPosition = {\n x: event.clientX,\n y: event.clientY\n };\n\n if (value !== 0 && value % WHEEL_DELTA_MAGIC_SCALER === 0) {\n value = Math.floor(value / WHEEL_DELTA_MAGIC_SCALER);\n }\n\n if (event.shiftKey && value) {\n value = value * SHIFT_MULTIPLIER;\n }\n\n this._onWheel(event, -value, wheelPosition);\n }\n }, {\n key: \"_onWheel\",\n value: function _onWheel(srcEvent, delta, position) {\n this.callback({\n type: EVENT_TYPE,\n center: position,\n delta: delta,\n srcEvent: srcEvent,\n pointerType: 'mouse',\n target: srcEvent.target\n });\n }\n }]);\n\n return WheelInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/move-input.js\n\n\n\nvar MOUSE_EVENTS = INPUT_EVENT_TYPES.MOUSE_EVENTS;\nvar MOVE_EVENT_TYPE = 'pointermove';\nvar OVER_EVENT_TYPE = 'pointerover';\nvar OUT_EVENT_TYPE = 'pointerout';\nvar LEAVE_EVENT_TYPE = 'pointerleave';\n\nvar MoveInput = /*#__PURE__*/function () {\n function MoveInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, MoveInput);\n\n this.element = element;\n this.callback = callback;\n this.pressed = false;\n this.options = Object.assign({\n enable: true\n }, options);\n this.enableMoveEvent = this.options.enable;\n this.enableLeaveEvent = this.options.enable;\n this.enableOutEvent = this.options.enable;\n this.enableOverEvent = this.options.enable;\n this.events = MOUSE_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent);\n });\n }\n\n _createClass(MoveInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === MOVE_EVENT_TYPE) {\n this.enableMoveEvent = enabled;\n }\n\n if (eventType === OVER_EVENT_TYPE) {\n this.enableOverEvent = enabled;\n }\n\n if (eventType === OUT_EVENT_TYPE) {\n this.enableOutEvent = enabled;\n }\n\n if (eventType === LEAVE_EVENT_TYPE) {\n this.enableLeaveEvent = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n this.handleOverEvent(event);\n this.handleOutEvent(event);\n this.handleLeaveEvent(event);\n this.handleMoveEvent(event);\n }\n }, {\n key: \"handleOverEvent\",\n value: function handleOverEvent(event) {\n if (this.enableOverEvent) {\n if (event.type === 'mouseover') {\n this.callback({\n type: OVER_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleOutEvent\",\n value: function handleOutEvent(event) {\n if (this.enableOutEvent) {\n if (event.type === 'mouseout') {\n this.callback({\n type: OUT_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleLeaveEvent\",\n value: function handleLeaveEvent(event) {\n if (this.enableLeaveEvent) {\n if (event.type === 'mouseleave') {\n this.callback({\n type: LEAVE_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleMoveEvent\",\n value: function handleMoveEvent(event) {\n if (this.enableMoveEvent) {\n switch (event.type) {\n case 'mousedown':\n if (event.button >= 0) {\n this.pressed = true;\n }\n\n break;\n\n case 'mousemove':\n if (event.which === 0) {\n this.pressed = false;\n }\n\n if (!this.pressed) {\n this.callback({\n type: MOVE_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n\n break;\n\n case 'mouseup':\n this.pressed = false;\n break;\n\n default:\n }\n }\n }\n }]);\n\n return MoveInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/key-input.js\n\n\n\nvar KEY_EVENTS = INPUT_EVENT_TYPES.KEY_EVENTS;\nvar DOWN_EVENT_TYPE = 'keydown';\nvar UP_EVENT_TYPE = 'keyup';\n\nvar KeyInput = /*#__PURE__*/function () {\n function KeyInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, KeyInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.enableDownEvent = this.options.enable;\n this.enableUpEvent = this.options.enable;\n this.events = KEY_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n element.tabIndex = options.tabIndex || 0;\n element.style.outline = 'none';\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent);\n });\n }\n\n _createClass(KeyInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === DOWN_EVENT_TYPE) {\n this.enableDownEvent = enabled;\n }\n\n if (eventType === UP_EVENT_TYPE) {\n this.enableUpEvent = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n var targetElement = event.target || event.srcElement;\n\n if (targetElement.tagName === 'INPUT' && targetElement.type === 'text' || targetElement.tagName === 'TEXTAREA') {\n return;\n }\n\n if (this.enableDownEvent && event.type === 'keydown') {\n this.callback({\n type: DOWN_EVENT_TYPE,\n srcEvent: event,\n key: event.key,\n target: event.target\n });\n }\n\n if (this.enableUpEvent && event.type === 'keyup') {\n this.callback({\n type: UP_EVENT_TYPE,\n srcEvent: event,\n key: event.key,\n target: event.target\n });\n }\n }\n }]);\n\n return KeyInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/contextmenu-input.js\n\n\nvar contextmenu_input_EVENT_TYPE = 'contextmenu';\n\nvar ContextmenuInput = /*#__PURE__*/function () {\n function ContextmenuInput(element, callback) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, ContextmenuInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.handleEvent = this.handleEvent.bind(this);\n element.addEventListener('contextmenu', this.handleEvent);\n }\n\n _createClass(ContextmenuInput, [{\n key: \"destroy\",\n value: function destroy() {\n this.element.removeEventListener('contextmenu', this.handleEvent);\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === contextmenu_input_EVENT_TYPE) {\n this.options.enable = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (!this.options.enable) {\n return;\n }\n\n this.callback({\n type: contextmenu_input_EVENT_TYPE,\n center: {\n x: event.clientX,\n y: event.clientY\n },\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }]);\n\n return ContextmenuInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/event-utils.js\nvar DOWN_EVENT = 1;\nvar MOVE_EVENT = 2;\nvar UP_EVENT = 4;\nvar event_utils_MOUSE_EVENTS = {\n pointerdown: DOWN_EVENT,\n pointermove: MOVE_EVENT,\n pointerup: UP_EVENT,\n mousedown: DOWN_EVENT,\n mousemove: MOVE_EVENT,\n mouseup: UP_EVENT\n};\nvar MOUSE_EVENT_WHICH_LEFT = 1;\nvar MOUSE_EVENT_WHICH_MIDDLE = 2;\nvar MOUSE_EVENT_WHICH_RIGHT = 3;\nvar MOUSE_EVENT_BUTTON_LEFT = 0;\nvar MOUSE_EVENT_BUTTON_MIDDLE = 1;\nvar MOUSE_EVENT_BUTTON_RIGHT = 2;\nvar MOUSE_EVENT_BUTTONS_LEFT_MASK = 1;\nvar MOUSE_EVENT_BUTTONS_RIGHT_MASK = 2;\nvar MOUSE_EVENT_BUTTONS_MIDDLE_MASK = 4;\nfunction whichButtons(event) {\n var eventType = event_utils_MOUSE_EVENTS[event.srcEvent.type];\n\n if (!eventType) {\n return null;\n }\n\n var _event$srcEvent = event.srcEvent,\n buttons = _event$srcEvent.buttons,\n button = _event$srcEvent.button,\n which = _event$srcEvent.which;\n var leftButton = false;\n var middleButton = false;\n var rightButton = false;\n\n if (eventType === UP_EVENT || eventType === MOVE_EVENT && !Number.isFinite(buttons)) {\n leftButton = which === MOUSE_EVENT_WHICH_LEFT;\n middleButton = which === MOUSE_EVENT_WHICH_MIDDLE;\n rightButton = which === MOUSE_EVENT_WHICH_RIGHT;\n } else if (eventType === MOVE_EVENT) {\n leftButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_LEFT_MASK);\n middleButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_MIDDLE_MASK);\n rightButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_RIGHT_MASK);\n } else if (eventType === DOWN_EVENT) {\n leftButton = button === MOUSE_EVENT_BUTTON_LEFT;\n middleButton = button === MOUSE_EVENT_BUTTON_MIDDLE;\n rightButton = button === MOUSE_EVENT_BUTTON_RIGHT;\n }\n\n return {\n leftButton: leftButton,\n middleButton: middleButton,\n rightButton: rightButton\n };\n}\nfunction getOffsetPosition(event, rootElement) {\n var srcEvent = event.srcEvent;\n\n if (!event.center && !Number.isFinite(srcEvent.clientX)) {\n return null;\n }\n\n var center = event.center || {\n x: srcEvent.clientX,\n y: srcEvent.clientY\n };\n var rect = rootElement.getBoundingClientRect();\n var scaleX = rect.width / rootElement.offsetWidth || 1;\n var scaleY = rect.height / rootElement.offsetHeight || 1;\n var offsetCenter = {\n x: (center.x - rect.left - rootElement.clientLeft) / scaleX,\n y: (center.y - rect.top - rootElement.clientTop) / scaleY\n };\n return {\n center: center,\n offsetCenter: offsetCenter\n };\n}\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/event-registrar.js\n\n\n\nvar DEFAULT_OPTIONS = {\n srcElement: 'root',\n priority: 0\n};\n\nvar EventRegistrar = /*#__PURE__*/function () {\n function EventRegistrar(eventManager) {\n _classCallCheck(this, EventRegistrar);\n\n this.eventManager = eventManager;\n this.handlers = [];\n this.handlersByElement = new Map();\n this.handleEvent = this.handleEvent.bind(this);\n this._active = false;\n }\n\n _createClass(EventRegistrar, [{\n key: \"isEmpty\",\n value: function isEmpty() {\n return !this._active;\n }\n }, {\n key: \"add\",\n value: function add(type, handler, opts) {\n var once = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var handlers = this.handlers,\n handlersByElement = this.handlersByElement;\n\n if (opts && (typeof opts !== 'object' || opts.addEventListener)) {\n opts = {\n srcElement: opts\n };\n }\n\n opts = opts ? Object.assign({}, DEFAULT_OPTIONS, opts) : DEFAULT_OPTIONS;\n var entries = handlersByElement.get(opts.srcElement);\n\n if (!entries) {\n entries = [];\n handlersByElement.set(opts.srcElement, entries);\n }\n\n var entry = {\n type: type,\n handler: handler,\n srcElement: opts.srcElement,\n priority: opts.priority\n };\n\n if (once) {\n entry.once = true;\n }\n\n if (passive) {\n entry.passive = true;\n }\n\n handlers.push(entry);\n this._active = this._active || !entry.passive;\n var insertPosition = entries.length - 1;\n\n while (insertPosition >= 0) {\n if (entries[insertPosition].priority >= entry.priority) {\n break;\n }\n\n insertPosition--;\n }\n\n entries.splice(insertPosition + 1, 0, entry);\n }\n }, {\n key: \"remove\",\n value: function remove(type, handler) {\n var handlers = this.handlers,\n handlersByElement = this.handlersByElement;\n\n for (var i = handlers.length - 1; i >= 0; i--) {\n var entry = handlers[i];\n\n if (entry.type === type && entry.handler === handler) {\n handlers.splice(i, 1);\n var entries = handlersByElement.get(entry.srcElement);\n entries.splice(entries.indexOf(entry), 1);\n\n if (entries.length === 0) {\n handlersByElement.delete(entry.srcElement);\n }\n }\n }\n\n this._active = handlers.some(function (entry) {\n return !entry.passive;\n });\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (this.isEmpty()) {\n return;\n }\n\n var mjolnirEvent = this._normalizeEvent(event);\n\n var target = event.srcEvent.target;\n\n while (target && target !== mjolnirEvent.rootElement) {\n this._emit(mjolnirEvent, target);\n\n if (mjolnirEvent.handled) {\n return;\n }\n\n target = target.parentNode;\n }\n\n this._emit(mjolnirEvent, 'root');\n }\n }, {\n key: \"_emit\",\n value: function _emit(event, srcElement) {\n var entries = this.handlersByElement.get(srcElement);\n\n if (entries) {\n var immediatePropagationStopped = false;\n\n var stopPropagation = function stopPropagation() {\n event.handled = true;\n };\n\n var stopImmediatePropagation = function stopImmediatePropagation() {\n event.handled = true;\n immediatePropagationStopped = true;\n };\n\n var entriesToRemove = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i = entries[i],\n type = _entries$i.type,\n handler = _entries$i.handler,\n once = _entries$i.once;\n handler(Object.assign({}, event, {\n type: type,\n stopPropagation: stopPropagation,\n stopImmediatePropagation: stopImmediatePropagation\n }));\n\n if (once) {\n entriesToRemove.push(entries[i]);\n }\n\n if (immediatePropagationStopped) {\n break;\n }\n }\n\n for (var _i = 0; _i < entriesToRemove.length; _i++) {\n var _entriesToRemove$_i = entriesToRemove[_i],\n _type = _entriesToRemove$_i.type,\n _handler = _entriesToRemove$_i.handler;\n this.remove(_type, _handler);\n }\n }\n }\n }, {\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(event) {\n var rootElement = this.eventManager.element;\n return Object.assign({}, event, whichButtons(event), getOffsetPosition(event, rootElement), {\n handled: false,\n rootElement: rootElement\n });\n }\n }]);\n\n return EventRegistrar;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/event-manager.js\n\n\n\n\nfunction event_manager_createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = event_manager_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 event_manager_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return event_manager_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 event_manager_arrayLikeToArray(o, minLen); }\n\nfunction event_manager_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\n\n\n\n\n\n\n\nvar event_manager_DEFAULT_OPTIONS = {\n events: null,\n recognizers: null,\n recognizerOptions: {},\n Manager: Manager,\n touchAction: 'none',\n tabIndex: 0\n};\n\nvar EventManager = /*#__PURE__*/function () {\n function EventManager() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, EventManager);\n\n this.options = Object.assign({}, event_manager_DEFAULT_OPTIONS, options);\n this.events = new Map();\n this._onBasicInput = this._onBasicInput.bind(this);\n this._onOtherEvent = this._onOtherEvent.bind(this);\n this.setElement(element);\n var events = options.events;\n\n if (events) {\n this.on(events);\n }\n }\n\n _createClass(EventManager, [{\n key: \"setElement\",\n value: function setElement(element) {\n var _this = this;\n\n if (this.element) {\n this.destroy();\n }\n\n this.element = element;\n\n if (!element) {\n return;\n }\n\n var options = this.options;\n var ManagerClass = options.Manager;\n this.manager = new ManagerClass(element, {\n touchAction: options.touchAction,\n recognizers: options.recognizers || RECOGNIZERS\n }).on('hammer.input', this._onBasicInput);\n\n if (!options.recognizers) {\n Object.keys(RECOGNIZER_COMPATIBLE_MAP).forEach(function (name) {\n var recognizer = _this.manager.get(name);\n\n if (recognizer) {\n RECOGNIZER_COMPATIBLE_MAP[name].forEach(function (otherName) {\n recognizer.recognizeWith(otherName);\n });\n }\n });\n }\n\n for (var recognizerName in options.recognizerOptions) {\n var recognizer = this.manager.get(recognizerName);\n\n if (recognizer) {\n var recognizerOption = options.recognizerOptions[recognizerName];\n delete recognizerOption.enable;\n recognizer.set(recognizerOption);\n }\n }\n\n this.wheelInput = new WheelInput(element, this._onOtherEvent, {\n enable: false\n });\n this.moveInput = new MoveInput(element, this._onOtherEvent, {\n enable: false\n });\n this.keyInput = new KeyInput(element, this._onOtherEvent, {\n enable: false,\n tabIndex: options.tabIndex\n });\n this.contextmenuInput = new ContextmenuInput(element, this._onOtherEvent, {\n enable: false\n });\n\n var _iterator = event_manager_createForOfIteratorHelper(this.events),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = slicedToArray_slicedToArray(_step.value, 2),\n eventAlias = _step$value[0],\n eventRegistrar = _step$value[1];\n\n if (!eventRegistrar.isEmpty()) {\n this._toggleRecognizer(eventRegistrar.recognizerName, true);\n\n this.manager.on(eventAlias, eventRegistrar.handleEvent);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.element) {\n this.wheelInput.destroy();\n this.moveInput.destroy();\n this.keyInput.destroy();\n this.contextmenuInput.destroy();\n this.manager.destroy();\n this.wheelInput = null;\n this.moveInput = null;\n this.keyInput = null;\n this.contextmenuInput = null;\n this.manager = null;\n this.element = null;\n }\n }\n }, {\n key: \"on\",\n value: function on(event, handler, opts) {\n this._addEventHandler(event, handler, opts, false);\n }\n }, {\n key: \"once\",\n value: function once(event, handler, opts) {\n this._addEventHandler(event, handler, opts, true);\n }\n }, {\n key: \"watch\",\n value: function watch(event, handler, opts) {\n this._addEventHandler(event, handler, opts, false, true);\n }\n }, {\n key: \"off\",\n value: function off(event, handler) {\n this._removeEventHandler(event, handler);\n }\n }, {\n key: \"_toggleRecognizer\",\n value: function _toggleRecognizer(name, enabled) {\n var manager = this.manager;\n\n if (!manager) {\n return;\n }\n\n var recognizer = manager.get(name);\n\n if (recognizer && recognizer.options.enable !== enabled) {\n recognizer.set({\n enable: enabled\n });\n var fallbackRecognizers = RECOGNIZER_FALLBACK_MAP[name];\n\n if (fallbackRecognizers && !this.options.recognizers) {\n fallbackRecognizers.forEach(function (otherName) {\n var otherRecognizer = manager.get(otherName);\n\n if (enabled) {\n otherRecognizer.requireFailure(name);\n recognizer.dropRequireFailure(otherName);\n } else {\n otherRecognizer.dropRequireFailure(name);\n }\n });\n }\n }\n\n this.wheelInput.enableEventType(name, enabled);\n this.moveInput.enableEventType(name, enabled);\n this.keyInput.enableEventType(name, enabled);\n this.contextmenuInput.enableEventType(name, enabled);\n }\n }, {\n key: \"_addEventHandler\",\n value: function _addEventHandler(event, handler, opts, once, passive) {\n if (typeof event !== 'string') {\n opts = handler;\n\n for (var eventName in event) {\n this._addEventHandler(eventName, event[eventName], opts, once, passive);\n }\n\n return;\n }\n\n var manager = this.manager,\n events = this.events;\n var eventAlias = GESTURE_EVENT_ALIASES[event] || event;\n var eventRegistrar = events.get(eventAlias);\n\n if (!eventRegistrar) {\n eventRegistrar = new EventRegistrar(this);\n events.set(eventAlias, eventRegistrar);\n eventRegistrar.recognizerName = EVENT_RECOGNIZER_MAP[eventAlias] || eventAlias;\n\n if (manager) {\n manager.on(eventAlias, eventRegistrar.handleEvent);\n }\n }\n\n eventRegistrar.add(event, handler, opts, once, passive);\n\n if (!eventRegistrar.isEmpty()) {\n this._toggleRecognizer(eventRegistrar.recognizerName, true);\n }\n }\n }, {\n key: \"_removeEventHandler\",\n value: function _removeEventHandler(event, handler) {\n if (typeof event !== 'string') {\n for (var eventName in event) {\n this._removeEventHandler(eventName, event[eventName]);\n }\n\n return;\n }\n\n var events = this.events;\n var eventAlias = GESTURE_EVENT_ALIASES[event] || event;\n var eventRegistrar = events.get(eventAlias);\n\n if (!eventRegistrar) {\n return;\n }\n\n eventRegistrar.remove(event, handler);\n\n if (eventRegistrar.isEmpty()) {\n var recognizerName = eventRegistrar.recognizerName;\n var isRecognizerUsed = false;\n\n var _iterator2 = event_manager_createForOfIteratorHelper(events.values()),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var eh = _step2.value;\n\n if (eh.recognizerName === recognizerName && !eh.isEmpty()) {\n isRecognizerUsed = true;\n break;\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (!isRecognizerUsed) {\n this._toggleRecognizer(recognizerName, false);\n }\n }\n }\n }, {\n key: \"_onBasicInput\",\n value: function _onBasicInput(event) {\n var srcEvent = event.srcEvent;\n var alias = BASIC_EVENT_ALIASES[srcEvent.type];\n\n if (alias) {\n this.manager.emit(alias, event);\n }\n }\n }, {\n key: \"_onOtherEvent\",\n value: function _onOtherEvent(event) {\n this.manager.emit(event.type, event);\n }\n }]);\n\n return EventManager;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/index.js\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-controller.js\n\n\n\n\nfunction map_controller_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_controller_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_controller_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_controller_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar NO_TRANSITION_PROPS = {\n transitionDuration: 0\n};\nvar LINEAR_TRANSITION_PROPS = {\n transitionDuration: 300,\n transitionEasing: function transitionEasing(t) {\n return t;\n },\n transitionInterpolator: new LinearInterpolator(),\n transitionInterruption: TRANSITION_EVENTS.BREAK\n};\nvar DEFAULT_INERTIA = 300;\n\nvar INERTIA_EASING = function INERTIA_EASING(t) {\n return 1 - (1 - t) * (1 - t);\n};\n\nvar EVENT_TYPES = {\n WHEEL: ['wheel'],\n PAN: ['panstart', 'panmove', 'panend'],\n PINCH: ['pinchstart', 'pinchmove', 'pinchend'],\n TRIPLE_PAN: ['tripanstart', 'tripanmove', 'tripanend'],\n DOUBLE_TAP: ['doubletap'],\n KEYBOARD: ['keydown']\n};\n\nvar MapController = function () {\n function MapController() {\n var _this = this;\n\n _classCallCheck(this, MapController);\n\n _defineProperty(this, \"events\", []);\n\n _defineProperty(this, \"scrollZoom\", true);\n\n _defineProperty(this, \"dragPan\", true);\n\n _defineProperty(this, \"dragRotate\", true);\n\n _defineProperty(this, \"doubleClickZoom\", true);\n\n _defineProperty(this, \"touchZoom\", true);\n\n _defineProperty(this, \"touchRotate\", false);\n\n _defineProperty(this, \"keyboard\", true);\n\n _defineProperty(this, \"_interactionState\", {\n isDragging: false\n });\n\n _defineProperty(this, \"_events\", {});\n\n _defineProperty(this, \"_setInteractionState\", function (newState) {\n Object.assign(_this._interactionState, newState);\n\n if (_this.onStateChange) {\n _this.onStateChange(_this._interactionState);\n }\n });\n\n _defineProperty(this, \"_onTransition\", function (newViewport, oldViewport) {\n _this.onViewportChange(newViewport, _this._interactionState, oldViewport);\n });\n\n this.handleEvent = this.handleEvent.bind(this);\n this._transitionManager = new TransitionManager({\n onViewportChange: this._onTransition,\n onStateChange: this._setInteractionState\n });\n }\n\n _createClass(MapController, [{\n key: \"handleEvent\",\n value: function handleEvent(event) {\n this.mapState = this.getMapState();\n var eventStartBlocked = this._eventStartBlocked;\n\n switch (event.type) {\n case 'panstart':\n return eventStartBlocked ? false : this._onPanStart(event);\n\n case 'panmove':\n return this._onPan(event);\n\n case 'panend':\n return this._onPanEnd(event);\n\n case 'pinchstart':\n return eventStartBlocked ? false : this._onPinchStart(event);\n\n case 'pinchmove':\n return this._onPinch(event);\n\n case 'pinchend':\n return this._onPinchEnd(event);\n\n case 'tripanstart':\n return eventStartBlocked ? false : this._onTriplePanStart(event);\n\n case 'tripanmove':\n return this._onTriplePan(event);\n\n case 'tripanend':\n return this._onTriplePanEnd(event);\n\n case 'doubletap':\n return this._onDoubleTap(event);\n\n case 'wheel':\n return this._onWheel(event);\n\n case 'keydown':\n return this._onKeyDown(event);\n\n default:\n return false;\n }\n }\n }, {\n key: \"getCenter\",\n value: function getCenter(event) {\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n return [x, y];\n }\n }, {\n key: \"isFunctionKeyPressed\",\n value: function isFunctionKeyPressed(event) {\n var srcEvent = event.srcEvent;\n return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n }\n }, {\n key: \"blockEvents\",\n value: function blockEvents(timeout) {\n var _this2 = this;\n\n var timer = setTimeout(function () {\n if (_this2._eventStartBlocked === timer) {\n _this2._eventStartBlocked = null;\n }\n }, timeout);\n this._eventStartBlocked = timer;\n }\n }, {\n key: \"updateViewport\",\n value: function updateViewport(newMapState, extraProps, interactionState) {\n var oldViewport = this.mapState instanceof MapState ? this.mapState.getViewportProps() : this.mapState;\n\n var newViewport = map_controller_objectSpread(map_controller_objectSpread({}, newMapState.getViewportProps()), extraProps);\n\n var viewStateChanged = Object.keys(newViewport).some(function (key) {\n return oldViewport[key] !== newViewport[key];\n });\n this._state = newMapState.getState();\n\n this._setInteractionState(interactionState);\n\n if (viewStateChanged) {\n this.onViewportChange(newViewport, this._interactionState, oldViewport);\n }\n }\n }, {\n key: \"getMapState\",\n value: function getMapState(overrides) {\n return new MapState(map_controller_objectSpread(map_controller_objectSpread(map_controller_objectSpread({}, this.mapStateProps), this._state), overrides));\n }\n }, {\n key: \"isDragging\",\n value: function isDragging() {\n return this._interactionState.isDragging;\n }\n }, {\n key: \"setOptions\",\n value: function setOptions(options) {\n var onViewportChange = options.onViewportChange,\n onStateChange = options.onStateChange,\n _options$eventManager = options.eventManager,\n eventManager = _options$eventManager === void 0 ? this.eventManager : _options$eventManager,\n _options$isInteractiv = options.isInteractive,\n isInteractive = _options$isInteractiv === void 0 ? true : _options$isInteractiv,\n _options$scrollZoom = options.scrollZoom,\n scrollZoom = _options$scrollZoom === void 0 ? this.scrollZoom : _options$scrollZoom,\n _options$dragPan = options.dragPan,\n dragPan = _options$dragPan === void 0 ? this.dragPan : _options$dragPan,\n _options$dragRotate = options.dragRotate,\n dragRotate = _options$dragRotate === void 0 ? this.dragRotate : _options$dragRotate,\n _options$doubleClickZ = options.doubleClickZoom,\n doubleClickZoom = _options$doubleClickZ === void 0 ? this.doubleClickZoom : _options$doubleClickZ,\n _options$touchZoom = options.touchZoom,\n touchZoom = _options$touchZoom === void 0 ? this.touchZoom : _options$touchZoom,\n _options$touchRotate = options.touchRotate,\n touchRotate = _options$touchRotate === void 0 ? this.touchRotate : _options$touchRotate,\n _options$keyboard = options.keyboard,\n keyboard = _options$keyboard === void 0 ? this.keyboard : _options$keyboard;\n this.onViewportChange = onViewportChange;\n this.onStateChange = onStateChange;\n var prevOptions = this.mapStateProps || {};\n var dimensionChanged = prevOptions.height !== options.height || prevOptions.width !== options.width;\n this.mapStateProps = options;\n\n if (dimensionChanged) {\n this.mapState = prevOptions;\n this.updateViewport(new MapState(options));\n }\n\n this._transitionManager.processViewportChange(options);\n\n if (this.eventManager !== eventManager) {\n this.eventManager = eventManager;\n this._events = {};\n this.toggleEvents(this.events, true);\n }\n\n this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && Boolean(scrollZoom));\n this.toggleEvents(EVENT_TYPES.PAN, isInteractive && Boolean(dragPan || dragRotate));\n this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && Boolean(touchZoom || touchRotate));\n this.toggleEvents(EVENT_TYPES.TRIPLE_PAN, isInteractive && Boolean(touchRotate));\n this.toggleEvents(EVENT_TYPES.DOUBLE_TAP, isInteractive && Boolean(doubleClickZoom));\n this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && Boolean(keyboard));\n this.scrollZoom = scrollZoom;\n this.dragPan = dragPan;\n this.dragRotate = dragRotate;\n this.doubleClickZoom = doubleClickZoom;\n this.touchZoom = touchZoom;\n this.touchRotate = touchRotate;\n this.keyboard = keyboard;\n }\n }, {\n key: \"toggleEvents\",\n value: function toggleEvents(eventNames, enabled) {\n var _this3 = this;\n\n if (this.eventManager) {\n eventNames.forEach(function (eventName) {\n if (_this3._events[eventName] !== enabled) {\n _this3._events[eventName] = enabled;\n\n if (enabled) {\n _this3.eventManager.on(eventName, _this3.handleEvent);\n } else {\n _this3.eventManager.off(eventName, _this3.handleEvent);\n }\n }\n });\n }\n }\n }, {\n key: \"_onPanStart\",\n value: function _onPanStart(event) {\n var pos = this.getCenter(event);\n this._panRotate = this.isFunctionKeyPressed(event) || event.rightButton;\n var newMapState = this._panRotate ? this.mapState.rotateStart({\n pos: pos\n }) : this.mapState.panStart({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onPan\",\n value: function _onPan(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n return this._panRotate ? this._onPanRotate(event) : this._onPanMove(event);\n }\n }, {\n key: \"_onPanEnd\",\n value: function _onPanEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n return this._panRotate ? this._onPanRotateEnd(event) : this._onPanMoveEnd(event);\n }\n }, {\n key: \"_onPanMove\",\n value: function _onPanMove(event) {\n if (!this.dragPan) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var newMapState = this.mapState.pan({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isPanning: true\n });\n return true;\n }\n }, {\n key: \"_onPanMoveEnd\",\n value: function _onPanMoveEnd(event) {\n if (this.dragPan) {\n var _this$dragPan$inertia = this.dragPan.inertia,\n inertia = _this$dragPan$inertia === void 0 ? DEFAULT_INERTIA : _this$dragPan$inertia;\n\n if (inertia && event.velocity) {\n var pos = this.getCenter(event);\n var endPos = [pos[0] + event.velocityX * inertia / 2, pos[1] + event.velocityY * inertia / 2];\n var newControllerState = this.mapState.pan({\n pos: endPos\n }).panEnd();\n this.updateViewport(newControllerState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isPanning: true\n });\n return true;\n }\n }\n\n var newMapState = this.mapState.panEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isPanning: false\n });\n return true;\n }\n }, {\n key: \"_onPanRotate\",\n value: function _onPanRotate(event) {\n if (!this.dragRotate) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var newMapState = this.mapState.rotate({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isRotating: true\n });\n return true;\n }\n }, {\n key: \"_onPanRotateEnd\",\n value: function _onPanRotateEnd(event) {\n if (this.dragRotate) {\n var _this$dragRotate$iner = this.dragRotate.inertia,\n inertia = _this$dragRotate$iner === void 0 ? DEFAULT_INERTIA : _this$dragRotate$iner;\n\n if (inertia && event.velocity) {\n var pos = this.getCenter(event);\n var endPos = [pos[0] + event.velocityX * inertia / 2, pos[1] + event.velocityY * inertia / 2];\n var newControllerState = this.mapState.rotate({\n pos: endPos\n }).rotateEnd();\n this.updateViewport(newControllerState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isRotating: true\n });\n return true;\n }\n }\n\n var newMapState = this.mapState.panEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isRotating: false\n });\n return true;\n }\n }, {\n key: \"_onWheel\",\n value: function _onWheel(event) {\n if (!this.scrollZoom) {\n return false;\n }\n\n var _this$scrollZoom = this.scrollZoom,\n _this$scrollZoom$spee = _this$scrollZoom.speed,\n speed = _this$scrollZoom$spee === void 0 ? 0.01 : _this$scrollZoom$spee,\n _this$scrollZoom$smoo = _this$scrollZoom.smooth,\n smooth = _this$scrollZoom$smoo === void 0 ? false : _this$scrollZoom$smoo;\n event.preventDefault();\n var pos = this.getCenter(event);\n var delta = event.delta;\n var scale = 2 / (1 + Math.exp(-Math.abs(delta * speed)));\n\n if (delta < 0 && scale !== 0) {\n scale = 1 / scale;\n }\n\n var newMapState = this.mapState.zoom({\n pos: pos,\n scale: scale\n });\n this.updateViewport(newMapState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n }),\n transitionDuration: smooth ? 250 : 1\n }), {\n isPanning: true,\n isZooming: true\n });\n return true;\n }\n }, {\n key: \"_onPinchStart\",\n value: function _onPinchStart(event) {\n var pos = this.getCenter(event);\n var newMapState = this.mapState.zoomStart({\n pos: pos\n }).rotateStart({\n pos: pos\n });\n this._startPinchRotation = event.rotation;\n this._lastPinchEvent = event;\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onPinch\",\n value: function _onPinch(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (!this.touchZoom && !this.touchRotate) {\n return false;\n }\n\n var newMapState = this.mapState;\n\n if (this.touchZoom) {\n var scale = event.scale;\n var pos = this.getCenter(event);\n newMapState = newMapState.zoom({\n pos: pos,\n scale: scale\n });\n }\n\n if (this.touchRotate) {\n var rotation = event.rotation;\n newMapState = newMapState.rotate({\n deltaAngleX: this._startPinchRotation - rotation\n });\n }\n\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: Boolean(this.touchZoom),\n isZooming: Boolean(this.touchZoom),\n isRotating: Boolean(this.touchRotate)\n });\n this._lastPinchEvent = event;\n return true;\n }\n }, {\n key: \"_onPinchEnd\",\n value: function _onPinchEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (this.touchZoom) {\n var _this$touchZoom$inert = this.touchZoom.inertia,\n inertia = _this$touchZoom$inert === void 0 ? DEFAULT_INERTIA : _this$touchZoom$inert;\n var _lastPinchEvent = this._lastPinchEvent;\n\n if (inertia && _lastPinchEvent && event.scale !== _lastPinchEvent.scale) {\n var pos = this.getCenter(event);\n\n var _newMapState = this.mapState.rotateEnd();\n\n var z = Math.log2(event.scale);\n\n var velocityZ = (z - Math.log2(_lastPinchEvent.scale)) / (event.deltaTime - _lastPinchEvent.deltaTime);\n\n var endScale = Math.pow(2, z + velocityZ * inertia / 2);\n _newMapState = _newMapState.zoom({\n pos: pos,\n scale: endScale\n }).zoomEnd();\n this.updateViewport(_newMapState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n }),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isPanning: Boolean(this.touchZoom),\n isZooming: Boolean(this.touchZoom),\n isRotating: false\n });\n this.blockEvents(inertia);\n return true;\n }\n }\n\n var newMapState = this.mapState.zoomEnd().rotateEnd();\n this._state.startPinchRotation = 0;\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isPanning: false,\n isZooming: false,\n isRotating: false\n });\n this._startPinchRotation = null;\n this._lastPinchEvent = null;\n return true;\n }\n }, {\n key: \"_onTriplePanStart\",\n value: function _onTriplePanStart(event) {\n var pos = this.getCenter(event);\n var newMapState = this.mapState.rotateStart({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onTriplePan\",\n value: function _onTriplePan(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (!this.touchRotate) {\n return false;\n }\n\n var pos = this.getCenter(event);\n pos[0] -= event.deltaX;\n var newMapState = this.mapState.rotate({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isRotating: true\n });\n return true;\n }\n }, {\n key: \"_onTriplePanEnd\",\n value: function _onTriplePanEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (this.touchRotate) {\n var _this$touchRotate$ine = this.touchRotate.inertia,\n inertia = _this$touchRotate$ine === void 0 ? DEFAULT_INERTIA : _this$touchRotate$ine;\n\n if (inertia && event.velocityY) {\n var pos = this.getCenter(event);\n var endPos = [pos[0], pos[1] += event.velocityY * inertia / 2];\n\n var _newMapState2 = this.mapState.rotate({\n pos: endPos\n });\n\n this.updateViewport(_newMapState2, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isRotating: true\n });\n this.blockEvents(inertia);\n return false;\n }\n }\n\n var newMapState = this.mapState.rotateEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isRotating: false\n });\n return true;\n }\n }, {\n key: \"_onDoubleTap\",\n value: function _onDoubleTap(event) {\n if (!this.doubleClickZoom) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var isZoomOut = this.isFunctionKeyPressed(event);\n var newMapState = this.mapState.zoom({\n pos: pos,\n scale: isZoomOut ? 0.5 : 2\n });\n this.updateViewport(newMapState, Object.assign({}, LINEAR_TRANSITION_PROPS, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n })\n }), {\n isZooming: true\n });\n return true;\n }\n }, {\n key: \"_onKeyDown\",\n value: function _onKeyDown(event) {\n if (!this.keyboard) {\n return false;\n }\n\n var funcKey = this.isFunctionKeyPressed(event);\n var _this$keyboard = this.keyboard,\n _this$keyboard$zoomSp = _this$keyboard.zoomSpeed,\n zoomSpeed = _this$keyboard$zoomSp === void 0 ? 2 : _this$keyboard$zoomSp,\n _this$keyboard$moveSp = _this$keyboard.moveSpeed,\n moveSpeed = _this$keyboard$moveSp === void 0 ? 100 : _this$keyboard$moveSp,\n _this$keyboard$rotate = _this$keyboard.rotateSpeedX,\n rotateSpeedX = _this$keyboard$rotate === void 0 ? 15 : _this$keyboard$rotate,\n _this$keyboard$rotate2 = _this$keyboard.rotateSpeedY,\n rotateSpeedY = _this$keyboard$rotate2 === void 0 ? 10 : _this$keyboard$rotate2;\n var mapStateProps = this.mapStateProps;\n var newMapState;\n\n switch (event.srcEvent.keyCode) {\n case 189:\n if (funcKey) {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom - Math.log2(zoomSpeed) - 1\n });\n } else {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom - Math.log2(zoomSpeed)\n });\n }\n\n break;\n\n case 187:\n if (funcKey) {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom + Math.log2(zoomSpeed) + 1\n });\n } else {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom + Math.log2(zoomSpeed)\n });\n }\n\n break;\n\n case 37:\n if (funcKey) {\n newMapState = this.getMapState({\n bearing: mapStateProps.bearing - rotateSpeedX\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [moveSpeed, 0],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 39:\n if (funcKey) {\n newMapState = this.getMapState({\n bearing: mapStateProps.bearing + rotateSpeedX\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [-moveSpeed, 0],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 38:\n if (funcKey) {\n newMapState = this.getMapState({\n pitch: mapStateProps.pitch + rotateSpeedY\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [0, moveSpeed],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 40:\n if (funcKey) {\n newMapState = this.getMapState({\n pitch: mapStateProps.pitch - rotateSpeedY\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [0, -moveSpeed],\n startPos: [0, 0]\n });\n }\n\n break;\n\n default:\n return false;\n }\n\n return this.updateViewport(newMapState, LINEAR_TRANSITION_PROPS);\n }\n }]);\n\n return MapController;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/interactive-map.js\n\n\n\n\nfunction interactive_map_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction interactive_map_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n interactive_map_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n interactive_map_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\n\n\nvar interactive_map_propTypes = Object.assign({}, static_map.propTypes, {\n maxZoom: prop_types.number,\n minZoom: prop_types.number,\n maxPitch: prop_types.number,\n minPitch: prop_types.number,\n onViewStateChange: prop_types.func,\n onViewportChange: prop_types.func,\n onInteractionStateChange: prop_types.func,\n transitionDuration: prop_types.oneOfType([prop_types.number, prop_types.string]),\n transitionInterpolator: prop_types.object,\n transitionInterruption: prop_types.number,\n transitionEasing: prop_types.func,\n onTransitionStart: prop_types.func,\n onTransitionInterrupt: prop_types.func,\n onTransitionEnd: prop_types.func,\n scrollZoom: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n dragPan: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n dragRotate: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n doubleClickZoom: prop_types.bool,\n touchZoom: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n touchRotate: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n keyboard: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n onHover: prop_types.func,\n onClick: prop_types.func,\n onDblClick: prop_types.func,\n onContextMenu: prop_types.func,\n onMouseDown: prop_types.func,\n onMouseMove: prop_types.func,\n onMouseUp: prop_types.func,\n onTouchStart: prop_types.func,\n onTouchMove: prop_types.func,\n onTouchEnd: prop_types.func,\n onMouseEnter: prop_types.func,\n onMouseLeave: prop_types.func,\n onMouseOut: prop_types.func,\n onWheel: prop_types.func,\n touchAction: prop_types.string,\n eventRecognizerOptions: prop_types.object,\n clickRadius: prop_types.number,\n interactiveLayerIds: prop_types.array,\n getCursor: prop_types.func,\n controller: prop_types.instanceOf(MapController)\n});\n\nvar getDefaultCursor = function getDefaultCursor(_ref) {\n var isDragging = _ref.isDragging,\n isHovering = _ref.isHovering;\n return isDragging ? 'grabbing' : isHovering ? 'pointer' : 'grab';\n};\n\nvar interactive_map_defaultProps = Object.assign({}, static_map.defaultProps, MAPBOX_LIMITS, TransitionManager.defaultProps, {\n onViewStateChange: null,\n onViewportChange: null,\n onClick: null,\n onNativeClick: null,\n onHover: null,\n onContextMenu: function onContextMenu(event) {\n return event.preventDefault();\n },\n scrollZoom: true,\n dragPan: true,\n dragRotate: true,\n doubleClickZoom: true,\n touchZoom: true,\n touchRotate: false,\n keyboard: true,\n touchAction: 'none',\n eventRecognizerOptions: {},\n clickRadius: 0,\n getCursor: getDefaultCursor\n});\n\nfunction normalizeEvent(event) {\n if (event.lngLat || !event.offsetCenter) {\n return event;\n }\n\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n return event;\n }\n\n var pos = [x, y];\n event.point = pos;\n var viewport = this.viewport;\n var location = viewport.unproject(pos, {\n targetZ: viewport.meterOffset[2]\n });\n event.lngLat = [location[0], location[1]];\n return event;\n}\n\nfunction getFeatures(pos) {\n var map = this.map;\n\n if (!map || !pos) {\n return null;\n }\n\n var queryParams = {};\n var size = this.props.clickRadius;\n\n if (this.props.interactiveLayerIds) {\n queryParams.layers = this.props.interactiveLayerIds;\n }\n\n try {\n return map.queryRenderedFeatures(size ? [[pos[0] - size, pos[1] + size], [pos[0] + size, pos[1] - size]] : pos, queryParams);\n } catch (_unused) {\n return null;\n }\n}\n\nfunction onEvent(callbackName, event) {\n var func = this.props[callbackName];\n\n if (func) {\n func(normalizeEvent.call(this, event));\n }\n}\n\nfunction onPointerDown(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchStart' : 'onMouseDown', event);\n}\n\nfunction onPointerUp(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchEnd' : 'onMouseUp', event);\n}\n\nfunction onPointerMove(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchMove' : 'onMouseMove', event);\n\n if (!this.state.isDragging) {\n var _this$props = this.props,\n onHover = _this$props.onHover,\n interactiveLayerIds = _this$props.interactiveLayerIds;\n var features;\n event = normalizeEvent.call(this, event);\n\n if (interactiveLayerIds || onHover) {\n features = getFeatures.call(this, event.point);\n }\n\n var isHovering = Boolean(interactiveLayerIds && features && features.length > 0);\n var isEntering = isHovering && !this.state.isHovering;\n var isExiting = !isHovering && this.state.isHovering;\n\n if (onHover || isEntering) {\n event.features = features;\n\n if (onHover) {\n onHover(event);\n }\n }\n\n if (isEntering) {\n onEvent.call(this, 'onMouseEnter', event);\n }\n\n if (isExiting) {\n onEvent.call(this, 'onMouseLeave', event);\n }\n\n if (isEntering || isExiting) {\n this.setState({\n isHovering: isHovering\n });\n }\n }\n}\n\nfunction onPointerClick(event) {\n var _this$props2 = this.props,\n onClick = _this$props2.onClick,\n onNativeClick = _this$props2.onNativeClick,\n onDblClick = _this$props2.onDblClick,\n doubleClickZoom = _this$props2.doubleClickZoom;\n var callbacks = [];\n var isDoubleClickEnabled = onDblClick || doubleClickZoom;\n\n switch (event.type) {\n case 'anyclick':\n callbacks.push(onNativeClick);\n\n if (!isDoubleClickEnabled) {\n callbacks.push(onClick);\n }\n\n break;\n\n case 'click':\n if (isDoubleClickEnabled) {\n callbacks.push(onClick);\n }\n\n break;\n\n default:\n }\n\n callbacks = callbacks.filter(Boolean);\n\n if (callbacks.length) {\n event = normalizeEvent.call(this, event);\n event.features = getFeatures.call(this, event.point);\n callbacks.forEach(function (cb) {\n return cb(event);\n });\n }\n}\n\nfunction interactive_map_getRefHandles(staticMapRef) {\n return {\n getMap: staticMapRef.current && staticMapRef.current.getMap,\n queryRenderedFeatures: staticMapRef.current && staticMapRef.current.queryRenderedFeatures\n };\n}\n\nvar InteractiveMap = (0,react.forwardRef)(function (props, ref) {\n var parentContext = (0,react.useContext)(map_context);\n var controller = (0,react.useMemo)(function () {\n return props.controller || new MapController();\n }, []);\n var eventManager = (0,react.useMemo)(function () {\n return new EventManager(null, {\n touchAction: props.touchAction,\n recognizerOptions: props.eventRecognizerOptions\n });\n }, []);\n var eventCanvasRef = (0,react.useRef)(null);\n var staticMapRef = (0,react.useRef)(null);\n\n var _thisRef = (0,react.useRef)({\n width: 0,\n height: 0,\n state: {\n isHovering: false,\n isDragging: false\n }\n });\n\n var thisRef = _thisRef.current;\n thisRef.props = props;\n thisRef.map = staticMapRef.current && staticMapRef.current.getMap();\n\n thisRef.setState = function (newState) {\n thisRef.state = interactive_map_objectSpread(interactive_map_objectSpread({}, thisRef.state), newState);\n eventCanvasRef.current.style.cursor = props.getCursor(thisRef.state);\n };\n\n var inRender = true;\n var viewportUpdateRequested;\n var stateUpdateRequested;\n\n var handleViewportChange = function handleViewportChange(viewState, interactionState, oldViewState) {\n if (inRender) {\n viewportUpdateRequested = [viewState, interactionState, oldViewState];\n return;\n }\n\n var _thisRef$props = thisRef.props,\n onViewStateChange = _thisRef$props.onViewStateChange,\n onViewportChange = _thisRef$props.onViewportChange;\n Object.defineProperty(viewState, 'position', {\n get: function get() {\n return [0, 0, getTerrainElevation(thisRef.map, viewState)];\n }\n });\n\n if (onViewStateChange) {\n onViewStateChange({\n viewState: viewState,\n interactionState: interactionState,\n oldViewState: oldViewState\n });\n }\n\n if (onViewportChange) {\n onViewportChange(viewState, interactionState, oldViewState);\n }\n };\n\n (0,react.useImperativeHandle)(ref, function () {\n return interactive_map_getRefHandles(staticMapRef);\n }, []);\n var context = (0,react.useMemo)(function () {\n return interactive_map_objectSpread(interactive_map_objectSpread({}, parentContext), {}, {\n eventManager: eventManager,\n container: parentContext.container || eventCanvasRef.current\n });\n }, [parentContext, eventCanvasRef.current]);\n context.onViewportChange = handleViewportChange;\n context.viewport = parentContext.viewport || getViewport(thisRef);\n thisRef.viewport = context.viewport;\n\n var handleInteractionStateChange = function handleInteractionStateChange(interactionState) {\n var _interactionState$isD = interactionState.isDragging,\n isDragging = _interactionState$isD === void 0 ? false : _interactionState$isD;\n\n if (isDragging !== thisRef.state.isDragging) {\n thisRef.setState({\n isDragging: isDragging\n });\n }\n\n if (inRender) {\n stateUpdateRequested = interactionState;\n return;\n }\n\n var onInteractionStateChange = thisRef.props.onInteractionStateChange;\n\n if (onInteractionStateChange) {\n onInteractionStateChange(interactionState);\n }\n };\n\n var updateControllerOpts = function updateControllerOpts() {\n if (thisRef.width && thisRef.height) {\n controller.setOptions(interactive_map_objectSpread(interactive_map_objectSpread(interactive_map_objectSpread({}, thisRef.props), thisRef.props.viewState), {}, {\n isInteractive: Boolean(thisRef.props.onViewStateChange || thisRef.props.onViewportChange),\n onViewportChange: handleViewportChange,\n onStateChange: handleInteractionStateChange,\n eventManager: eventManager,\n width: thisRef.width,\n height: thisRef.height\n }));\n }\n };\n\n var onResize = function onResize(_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n thisRef.width = width;\n thisRef.height = height;\n updateControllerOpts();\n thisRef.props.onResize({\n width: width,\n height: height\n });\n };\n\n (0,react.useEffect)(function () {\n eventManager.setElement(eventCanvasRef.current);\n eventManager.on({\n pointerdown: onPointerDown.bind(thisRef),\n pointermove: onPointerMove.bind(thisRef),\n pointerup: onPointerUp.bind(thisRef),\n pointerleave: onEvent.bind(thisRef, 'onMouseOut'),\n click: onPointerClick.bind(thisRef),\n anyclick: onPointerClick.bind(thisRef),\n dblclick: onEvent.bind(thisRef, 'onDblClick'),\n wheel: onEvent.bind(thisRef, 'onWheel'),\n contextmenu: onEvent.bind(thisRef, 'onContextMenu')\n });\n return function () {\n eventManager.destroy();\n };\n }, []);\n use_isomorphic_layout_effect(function () {\n if (viewportUpdateRequested) {\n handleViewportChange.apply(void 0, (0,toConsumableArray/* default */.Z)(viewportUpdateRequested));\n }\n\n if (stateUpdateRequested) {\n handleInteractionStateChange(stateUpdateRequested);\n }\n });\n updateControllerOpts();\n var width = props.width,\n height = props.height,\n style = props.style,\n getCursor = props.getCursor;\n var eventCanvasStyle = (0,react.useMemo)(function () {\n return interactive_map_objectSpread(interactive_map_objectSpread({\n position: 'relative'\n }, style), {}, {\n width: width,\n height: height,\n cursor: getCursor(thisRef.state)\n });\n }, [style, width, height, getCursor, thisRef.state]);\n\n if (!viewportUpdateRequested || !thisRef._child) {\n thisRef._child = react.createElement(MapContextProvider, {\n value: context\n }, react.createElement(\"div\", {\n key: \"event-canvas\",\n ref: eventCanvasRef,\n style: eventCanvasStyle\n }, react.createElement(static_map, _extends({}, props, {\n width: \"100%\",\n height: \"100%\",\n style: null,\n onResize: onResize,\n ref: staticMapRef\n }))));\n }\n\n inRender = false;\n return thisRef._child;\n});\nInteractiveMap.supported = static_map.supported;\nInteractiveMap.propTypes = interactive_map_propTypes;\nInteractiveMap.defaultProps = interactive_map_defaultProps;\n/* harmony default export */ var interactive_map = (InteractiveMap);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/deep-equal.js\n\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n } else if (Array.isArray(b)) {\n return false;\n }\n\n if (_typeof(a) === 'object' && _typeof(b) === 'object') {\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (var _i = 0, _aKeys = aKeys; _i < _aKeys.length; _i++) {\n var key = _aKeys[_i];\n\n if (!b.hasOwnProperty(key)) {\n return false;\n }\n\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/source.js\n\n\n\nfunction source_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction source_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n source_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n source_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\nvar sourceCounter = 0;\n\nfunction createSource(map, id, props) {\n if (map.style && map.style._loaded) {\n var options = source_objectSpread({}, props);\n\n delete options.id;\n delete options.children;\n map.addSource(id, options);\n return map.getSource(id);\n }\n\n return null;\n}\n\nfunction updateSource(source, props, prevProps) {\n utils_assert_assert(props.id === prevProps.id, 'source id changed');\n utils_assert_assert(props.type === prevProps.type, 'source type changed');\n var changedKey = '';\n var changedKeyCount = 0;\n\n for (var key in props) {\n if (key !== 'children' && key !== 'id' && !deepEqual(prevProps[key], props[key])) {\n changedKey = key;\n changedKeyCount++;\n }\n }\n\n if (!changedKeyCount) {\n return;\n }\n\n var type = props.type;\n\n if (type === 'geojson') {\n source.setData(props.data);\n } else if (type === 'image') {\n source.updateImage({\n url: props.url,\n coordinates: props.coordinates\n });\n } else if ((type === 'canvas' || type === 'video') && changedKeyCount === 1 && changedKey === 'coordinates') {\n source.setCoordinates(props.coordinates);\n } else if (type === 'vector' && source.setUrl) {\n switch (changedKey) {\n case 'url':\n source.setUrl(props.url);\n break;\n\n case 'tiles':\n source.setTiles(props.tiles);\n break;\n\n default:\n }\n } else {\n console.warn(\"Unable to update prop: \".concat(changedKey));\n }\n}\n\nfunction Source(props) {\n var context = (0,react.useContext)(map_context);\n var propsRef = (0,react.useRef)({\n id: props.id,\n type: props.type\n });\n\n var _useState = (0,react.useState)(0),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setStyleLoaded = _useState2[1];\n\n var id = (0,react.useMemo)(function () {\n return props.id || \"jsx-source-\".concat(sourceCounter++);\n }, []);\n var map = context.map;\n (0,react.useEffect)(function () {\n if (map) {\n var forceUpdate = function forceUpdate() {\n return setStyleLoaded(function (version) {\n return version + 1;\n });\n };\n\n map.on('styledata', forceUpdate);\n return function () {\n map.off('styledata', forceUpdate);\n requestAnimationFrame(function () {\n if (map.style && map.style._loaded && map.getSource(id)) {\n map.removeSource(id);\n }\n });\n };\n }\n\n return undefined;\n }, [map, id]);\n var source = map && map.style && map.getSource(id);\n\n if (source) {\n updateSource(source, props, propsRef.current);\n } else {\n source = createSource(map, id, props);\n }\n\n propsRef.current = props;\n return source && react.Children.map(props.children, function (child) {\n return child && (0,react.cloneElement)(child, {\n source: id\n });\n }) || null;\n}\n\n/* harmony default export */ var source = (Source);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nfunction _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;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/layer.js\n\n\n\n\nfunction layer_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction layer_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n layer_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n layer_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\nvar LAYER_TYPES = ['fill', 'line', 'symbol', 'circle', 'fill-extrusion', 'raster', 'background', 'heatmap', 'hillshade', 'sky'];\nvar layer_propTypes = {\n type: prop_types.oneOf(LAYER_TYPES).isRequired,\n id: prop_types.string,\n source: prop_types.string,\n beforeId: prop_types.string\n};\n\nfunction diffLayerStyles(map, id, props, prevProps) {\n var _props$layout = props.layout,\n layout = _props$layout === void 0 ? {} : _props$layout,\n _props$paint = props.paint,\n paint = _props$paint === void 0 ? {} : _props$paint,\n filter = props.filter,\n minzoom = props.minzoom,\n maxzoom = props.maxzoom,\n beforeId = props.beforeId,\n otherProps = _objectWithoutProperties(props, [\"layout\", \"paint\", \"filter\", \"minzoom\", \"maxzoom\", \"beforeId\"]);\n\n if (beforeId !== prevProps.beforeId) {\n map.moveLayer(id, beforeId);\n }\n\n if (layout !== prevProps.layout) {\n var prevLayout = prevProps.layout || {};\n\n for (var key in layout) {\n if (!deepEqual(layout[key], prevLayout[key])) {\n map.setLayoutProperty(id, key, layout[key]);\n }\n }\n\n for (var _key in prevLayout) {\n if (!layout.hasOwnProperty(_key)) {\n map.setLayoutProperty(id, _key, undefined);\n }\n }\n }\n\n if (paint !== prevProps.paint) {\n var prevPaint = prevProps.paint || {};\n\n for (var _key2 in paint) {\n if (!deepEqual(paint[_key2], prevPaint[_key2])) {\n map.setPaintProperty(id, _key2, paint[_key2]);\n }\n }\n\n for (var _key3 in prevPaint) {\n if (!paint.hasOwnProperty(_key3)) {\n map.setPaintProperty(id, _key3, undefined);\n }\n }\n }\n\n if (!deepEqual(filter, prevProps.filter)) {\n map.setFilter(id, filter);\n }\n\n if (minzoom !== prevProps.minzoom || maxzoom !== prevProps.maxzoom) {\n map.setLayerZoomRange(id, minzoom, maxzoom);\n }\n\n for (var _key4 in otherProps) {\n if (!deepEqual(otherProps[_key4], prevProps[_key4])) {\n map.setLayerProperty(id, _key4, otherProps[_key4]);\n }\n }\n}\n\nfunction createLayer(map, id, props) {\n if (map.style && map.style._loaded) {\n var options = layer_objectSpread(layer_objectSpread({}, props), {}, {\n id: id\n });\n\n delete options.beforeId;\n map.addLayer(options, props.beforeId);\n }\n}\n\nfunction updateLayer(map, id, props, prevProps) {\n utils_assert_assert(props.id === prevProps.id, 'layer id changed');\n utils_assert_assert(props.type === prevProps.type, 'layer type changed');\n\n try {\n diffLayerStyles(map, id, props, prevProps);\n } catch (error) {\n console.warn(error);\n }\n}\n\nvar layerCounter = 0;\n\nfunction Layer(props) {\n var context = (0,react.useContext)(map_context);\n var propsRef = (0,react.useRef)({\n id: props.id,\n type: props.type\n });\n\n var _useState = (0,react.useState)(0),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setStyleLoaded = _useState2[1];\n\n var id = (0,react.useMemo)(function () {\n return props.id || \"jsx-layer-\".concat(layerCounter++);\n }, []);\n var map = context.map;\n (0,react.useEffect)(function () {\n if (map) {\n var forceUpdate = function forceUpdate() {\n return setStyleLoaded(function (version) {\n return version + 1;\n });\n };\n\n map.on('styledata', forceUpdate);\n return function () {\n map.off('styledata', forceUpdate);\n\n if (map.style && map.style._loaded) {\n map.removeLayer(id);\n }\n };\n }\n\n return undefined;\n }, [map]);\n var layer = map && map.style && map.getLayer(id);\n\n if (layer) {\n updateLayer(map, id, props, propsRef.current);\n } else {\n createLayer(map, id, props);\n }\n\n propsRef.current = props;\n return null;\n}\n\nLayer.propTypes = layer_propTypes;\n/* harmony default export */ var components_layer = (Layer);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/use-map-control.js\n\n\n\nvar mapControlDefaultProps = {\n captureScroll: false,\n captureDrag: true,\n captureClick: true,\n captureDoubleClick: true,\n capturePointerMove: false\n};\nvar mapControlPropTypes = {\n captureScroll: prop_types.bool,\n captureDrag: prop_types.bool,\n captureClick: prop_types.bool,\n captureDoubleClick: prop_types.bool,\n capturePointerMove: prop_types.bool\n};\n\nfunction onMount(thisRef) {\n var ref = thisRef.containerRef.current;\n var eventManager = thisRef.context.eventManager;\n\n if (!ref || !eventManager) {\n return undefined;\n }\n\n var events = {\n wheel: function wheel(evt) {\n var props = thisRef.props;\n\n if (props.captureScroll) {\n evt.stopPropagation();\n }\n\n if (props.onScroll) {\n props.onScroll(evt, thisRef);\n }\n },\n panstart: function panstart(evt) {\n var props = thisRef.props;\n\n if (props.captureDrag) {\n evt.stopPropagation();\n }\n\n if (props.onDragStart) {\n props.onDragStart(evt, thisRef);\n }\n },\n anyclick: function anyclick(evt) {\n var props = thisRef.props;\n\n if (props.captureClick) {\n evt.stopPropagation();\n }\n\n if (props.onClick) {\n props.onClick(evt, thisRef);\n }\n },\n click: function click(evt) {\n var props = thisRef.props;\n\n if (props.captureClick) {\n evt.stopPropagation();\n }\n\n if (props.onClick) {\n props.onClick(evt, thisRef);\n }\n },\n dblclick: function dblclick(evt) {\n var props = thisRef.props;\n\n if (props.captureDoubleClick) {\n evt.stopPropagation();\n }\n\n if (props.onDoubleClick) {\n props.onDoubleClick(evt, thisRef);\n }\n },\n pointermove: function pointermove(evt) {\n var props = thisRef.props;\n\n if (props.capturePointerMove) {\n evt.stopPropagation();\n }\n\n if (props.onPointerMove) {\n props.onPointerMove(evt, thisRef);\n }\n }\n };\n eventManager.watch(events, ref);\n return function () {\n eventManager.off(events);\n };\n}\n\nfunction useMapControl() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var context = (0,react.useContext)(map_context);\n var containerRef = (0,react.useRef)(null);\n\n var _thisRef = (0,react.useRef)({\n props: props,\n state: {},\n context: context,\n containerRef: containerRef\n });\n\n var thisRef = _thisRef.current;\n thisRef.props = props;\n thisRef.context = context;\n (0,react.useEffect)(function () {\n return onMount(thisRef);\n }, [context.eventManager]);\n return thisRef;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/base-control.js\n\n\n\n\n\n\n\n\n\nfunction base_control_createSuper(Derived) {\n var hasNativeReflectConstruct = base_control_isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction base_control_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 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\nfunction Control(props) {\n var instance = props.instance;\n\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n instance._context = context;\n instance._containerRef = containerRef;\n return instance._render();\n}\n\nvar BaseControl = function (_PureComponent) {\n _inherits(BaseControl, _PureComponent);\n\n var _super = base_control_createSuper(BaseControl);\n\n function BaseControl() {\n var _this;\n\n _classCallCheck(this, BaseControl);\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 = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"_context\", {});\n\n _defineProperty(_assertThisInitialized(_this), \"_containerRef\", (0,react.createRef)());\n\n _defineProperty(_assertThisInitialized(_this), \"_onScroll\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onDragStart\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onDblClick\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onClick\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onPointerMove\", function (evt) {});\n\n return _this;\n }\n\n _createClass(BaseControl, [{\n key: \"_render\",\n value: function _render() {\n throw new Error('_render() not implemented');\n }\n }, {\n key: \"render\",\n value: function render() {\n return react.createElement(Control, _extends({\n instance: this\n }, this.props, {\n onScroll: this._onScroll,\n onDragStart: this._onDragStart,\n onDblClick: this._onDblClick,\n onClick: this._onClick,\n onPointerMove: this._onPointerMove\n }));\n }\n }]);\n\n return BaseControl;\n}(react.PureComponent);\n\n_defineProperty(BaseControl, \"propTypes\", mapControlPropTypes);\n\n_defineProperty(BaseControl, \"defaultProps\", mapControlDefaultProps);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/draggable-control.js\n\n\n\nfunction draggable_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction draggable_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n draggable_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n draggable_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar draggableControlPropTypes = Object.assign({}, mapControlPropTypes, {\n draggable: prop_types.bool,\n onDrag: prop_types.func,\n onDragEnd: prop_types.func,\n onDragStart: prop_types.func,\n offsetLeft: prop_types.number,\n offsetTop: prop_types.number\n});\nvar draggableControlDefaultProps = Object.assign({}, mapControlDefaultProps, {\n draggable: false,\n offsetLeft: 0,\n offsetTop: 0\n});\n\nfunction getDragEventPosition(event) {\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n return [x, y];\n}\n\nfunction getDragEventOffset(event, container) {\n var _event$center = event.center,\n x = _event$center.x,\n y = _event$center.y;\n\n if (container) {\n var rect = container.getBoundingClientRect();\n return [rect.left - x, rect.top - y];\n }\n\n return null;\n}\n\nfunction getDragLngLat(dragPos, dragOffset, props, context) {\n var x = dragPos[0] + dragOffset[0] - props.offsetLeft;\n var y = dragPos[1] + dragOffset[1] - props.offsetTop;\n return context.viewport.unproject([x, y]);\n}\n\nfunction onDragStart(event, _ref) {\n var props = _ref.props,\n callbacks = _ref.callbacks,\n state = _ref.state,\n context = _ref.context,\n containerRef = _ref.containerRef;\n var draggable = props.draggable;\n\n if (!draggable) {\n return;\n }\n\n event.stopPropagation();\n var dragPos = getDragEventPosition(event);\n var dragOffset = getDragEventOffset(event, containerRef.current);\n state.setDragPos(dragPos);\n state.setDragOffset(dragOffset);\n\n if (callbacks.onDragStart && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDragStart(callbackEvent);\n }\n}\n\nfunction onDrag(event, _ref2) {\n var props = _ref2.props,\n callbacks = _ref2.callbacks,\n state = _ref2.state,\n context = _ref2.context;\n event.stopPropagation();\n var dragPos = getDragEventPosition(event);\n state.setDragPos(dragPos);\n var dragOffset = state.dragOffset;\n\n if (callbacks.onDrag && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDrag(callbackEvent);\n }\n}\n\nfunction onDragEnd(event, _ref3) {\n var props = _ref3.props,\n callbacks = _ref3.callbacks,\n state = _ref3.state,\n context = _ref3.context;\n event.stopPropagation();\n var dragPos = state.dragPos,\n dragOffset = state.dragOffset;\n state.setDragPos(null);\n state.setDragOffset(null);\n\n if (callbacks.onDragEnd && dragPos && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDragEnd(callbackEvent);\n }\n}\n\nfunction onDragCancel(event, _ref4) {\n var state = _ref4.state;\n event.stopPropagation();\n state.setDragPos(null);\n state.setDragOffset(null);\n}\n\nfunction registerEvents(thisRef) {\n var eventManager = thisRef.context.eventManager;\n\n if (!eventManager || !thisRef.state.dragPos) {\n return undefined;\n }\n\n var events = {\n panmove: function panmove(evt) {\n return onDrag(evt, thisRef);\n },\n panend: function panend(evt) {\n return onDragEnd(evt, thisRef);\n },\n pancancel: function pancancel(evt) {\n return onDragCancel(evt, thisRef);\n }\n };\n eventManager.watch(events);\n return function () {\n eventManager.off(events);\n };\n}\n\nfunction useDraggableControl(props) {\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n dragPos = _useState2[0],\n setDragPos = _useState2[1];\n\n var _useState3 = (0,react.useState)(null),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n dragOffset = _useState4[0],\n setDragOffset = _useState4[1];\n\n var thisRef = useMapControl(draggable_control_objectSpread(draggable_control_objectSpread({}, props), {}, {\n onDragStart: onDragStart\n }));\n thisRef.callbacks = props;\n thisRef.state.dragPos = dragPos;\n thisRef.state.setDragPos = setDragPos;\n thisRef.state.dragOffset = dragOffset;\n thisRef.state.setDragOffset = setDragOffset;\n (0,react.useEffect)(function () {\n return registerEvents(thisRef);\n }, [thisRef.context.eventManager, Boolean(dragPos)]);\n return thisRef;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/crisp-pixel.js\nvar pixelRatio = typeof window !== 'undefined' && window.devicePixelRatio || 1;\nvar crispPixel = function crispPixel(size) {\n return Math.round(size * pixelRatio) / pixelRatio;\n};\nvar crispPercentage = function crispPercentage(el, percentage) {\n var dimension = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'x';\n\n if (el === null) {\n return percentage;\n }\n\n var origSize = dimension === 'x' ? el.offsetWidth : el.offsetHeight;\n return crispPixel(percentage / 100 * origSize) / origSize * 100;\n};\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/marker.js\n\n\n\n\n\n\nvar marker_defaultProps = Object.assign({}, draggableControlDefaultProps, {\n className: ''\n});\n\nfunction getPosition(_ref) {\n var props = _ref.props,\n state = _ref.state,\n context = _ref.context;\n var longitude = props.longitude,\n latitude = props.latitude,\n offsetLeft = props.offsetLeft,\n offsetTop = props.offsetTop;\n var dragPos = state.dragPos,\n dragOffset = state.dragOffset;\n var viewport = context.viewport,\n map = context.map;\n\n if (dragPos && dragOffset) {\n return [dragPos[0] + dragOffset[0], dragPos[1] + dragOffset[1]];\n }\n\n var altitude = getTerrainElevation(map, {\n longitude: longitude,\n latitude: latitude\n });\n\n var _viewport$project = viewport.project([longitude, latitude, altitude]),\n _viewport$project2 = slicedToArray_slicedToArray(_viewport$project, 2),\n x = _viewport$project2[0],\n y = _viewport$project2[1];\n\n x += offsetLeft;\n y += offsetTop;\n return [x, y];\n}\n\nfunction Marker(props) {\n var thisRef = useDraggableControl(props);\n var state = thisRef.state,\n containerRef = thisRef.containerRef;\n var children = props.children,\n className = props.className,\n draggable = props.draggable;\n var dragPos = state.dragPos;\n\n var _getPosition = getPosition(thisRef),\n _getPosition2 = slicedToArray_slicedToArray(_getPosition, 2),\n x = _getPosition2[0],\n y = _getPosition2[1];\n\n var transform = \"translate(\".concat(crispPixel(x), \"px, \").concat(crispPixel(y), \"px)\");\n var cursor = draggable ? dragPos ? 'grabbing' : 'grab' : 'auto';\n var control = (0,react.useMemo)(function () {\n var containerStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n transform: transform,\n cursor: cursor\n };\n return react.createElement(\"div\", {\n className: \"mapboxgl-marker \".concat(className),\n ref: thisRef.containerRef,\n style: containerStyle\n }, children);\n }, [children, className]);\n var container = containerRef.current;\n\n if (container) {\n container.style.transform = transform;\n container.style.cursor = cursor;\n }\n\n return control;\n}\n\nMarker.defaultProps = marker_defaultProps;\n/* harmony default export */ var marker = (react.memo(Marker));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/dynamic-position.js\nvar ANCHOR_POSITION = {\n top: {\n x: 0.5,\n y: 0\n },\n 'top-left': {\n x: 0,\n y: 0\n },\n 'top-right': {\n x: 1,\n y: 0\n },\n bottom: {\n x: 0.5,\n y: 1\n },\n 'bottom-left': {\n x: 0,\n y: 1\n },\n 'bottom-right': {\n x: 1,\n y: 1\n },\n left: {\n x: 0,\n y: 0.5\n },\n right: {\n x: 1,\n y: 0.5\n }\n};\nvar ANCHOR_TYPES = Object.keys(ANCHOR_POSITION);\nfunction getDynamicPosition(_ref) {\n var x = _ref.x,\n y = _ref.y,\n width = _ref.width,\n height = _ref.height,\n selfWidth = _ref.selfWidth,\n selfHeight = _ref.selfHeight,\n anchor = _ref.anchor,\n _ref$padding = _ref.padding,\n padding = _ref$padding === void 0 ? 0 : _ref$padding;\n var _ANCHOR_POSITION$anch = ANCHOR_POSITION[anchor],\n anchorX = _ANCHOR_POSITION$anch.x,\n anchorY = _ANCHOR_POSITION$anch.y;\n var top = y - anchorY * selfHeight;\n var bottom = top + selfHeight;\n var cutoffY = Math.max(0, padding - top) + Math.max(0, bottom - height + padding);\n\n if (cutoffY > 0) {\n var bestAnchorY = anchorY;\n var minCutoff = cutoffY;\n\n for (anchorY = 0; anchorY <= 1; anchorY += 0.5) {\n top = y - anchorY * selfHeight;\n bottom = top + selfHeight;\n cutoffY = Math.max(0, padding - top) + Math.max(0, bottom - height + padding);\n\n if (cutoffY < minCutoff) {\n minCutoff = cutoffY;\n bestAnchorY = anchorY;\n }\n }\n\n anchorY = bestAnchorY;\n }\n\n var xStep = 0.5;\n\n if (anchorY === 0.5) {\n anchorX = Math.floor(anchorX);\n xStep = 1;\n }\n\n var left = x - anchorX * selfWidth;\n var right = left + selfWidth;\n var cutoffX = Math.max(0, padding - left) + Math.max(0, right - width + padding);\n\n if (cutoffX > 0) {\n var bestAnchorX = anchorX;\n var _minCutoff = cutoffX;\n\n for (anchorX = 0; anchorX <= 1; anchorX += xStep) {\n left = x - anchorX * selfWidth;\n right = left + selfWidth;\n cutoffX = Math.max(0, padding - left) + Math.max(0, right - width + padding);\n\n if (cutoffX < _minCutoff) {\n _minCutoff = cutoffX;\n bestAnchorX = anchorX;\n }\n }\n\n anchorX = bestAnchorX;\n }\n\n return ANCHOR_TYPES.find(function (positionType) {\n var anchorPosition = ANCHOR_POSITION[positionType];\n return anchorPosition.x === anchorX && anchorPosition.y === anchorY;\n }) || anchor;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/popup.js\n\n\n\nfunction popup_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction popup_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n popup_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n popup_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\nvar popup_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n offsetLeft: 0,\n offsetTop: 0,\n tipSize: 10,\n anchor: 'bottom',\n dynamicPosition: true,\n sortByDepth: false,\n closeButton: true,\n closeOnClick: true,\n onClose: function onClose() {}\n});\n\nfunction popup_getPosition(props, viewport, el, _ref) {\n var _ref2 = slicedToArray_slicedToArray(_ref, 2),\n x = _ref2[0],\n y = _ref2[1];\n\n var anchor = props.anchor,\n dynamicPosition = props.dynamicPosition,\n tipSize = props.tipSize;\n\n if (el) {\n return dynamicPosition ? getDynamicPosition({\n x: x,\n y: y,\n anchor: anchor,\n padding: tipSize,\n width: viewport.width,\n height: viewport.height,\n selfWidth: el.clientWidth,\n selfHeight: el.clientHeight\n }) : anchor;\n }\n\n return anchor;\n}\n\nfunction getContainerStyle(props, viewport, el, _ref3, positionType) {\n var _ref4 = slicedToArray_slicedToArray(_ref3, 3),\n x = _ref4[0],\n y = _ref4[1],\n z = _ref4[2];\n\n var offsetLeft = props.offsetLeft,\n offsetTop = props.offsetTop,\n sortByDepth = props.sortByDepth;\n var anchorPosition = ANCHOR_POSITION[positionType];\n var left = x + offsetLeft;\n var top = y + offsetTop;\n var xPercentage = crispPercentage(el, -anchorPosition.x * 100);\n var yPercentage = crispPercentage(el, -anchorPosition.y * 100, 'y');\n var style = {\n position: 'absolute',\n transform: \"\\n translate(\".concat(xPercentage, \"%, \").concat(yPercentage, \"%)\\n translate(\").concat(crispPixel(left), \"px, \").concat(crispPixel(top), \"px)\\n \"),\n display: undefined,\n zIndex: undefined\n };\n\n if (!sortByDepth) {\n return style;\n }\n\n if (z > 1 || z < -1 || x < 0 || x > viewport.width || y < 0 || y > viewport.height) {\n style.display = 'none';\n } else {\n style.zIndex = Math.floor((1 - z) / 2 * 100000);\n }\n\n return style;\n}\n\nfunction onClick(evt, _ref5) {\n var props = _ref5.props,\n context = _ref5.context;\n\n if (props.closeOnClick || evt.target.className === 'mapboxgl-popup-close-button') {\n props.onClose();\n\n if (context.eventManager) {\n context.eventManager.once('click', function (e) {\n return e.stopPropagation();\n }, evt.target);\n }\n }\n}\n\nfunction Popup(props) {\n var contentRef = (0,react.useRef)(null);\n var thisRef = useMapControl(popup_objectSpread(popup_objectSpread({}, props), {}, {\n onClick: onClick\n }));\n var context = thisRef.context,\n containerRef = thisRef.containerRef;\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setLoaded = _useState2[1];\n\n (0,react.useEffect)(function () {\n setLoaded(true);\n }, [contentRef.current]);\n var viewport = context.viewport,\n map = context.map;\n var className = props.className,\n longitude = props.longitude,\n latitude = props.latitude,\n tipSize = props.tipSize,\n closeButton = props.closeButton,\n children = props.children;\n var altitude = props.altitude;\n\n if (altitude === undefined) {\n altitude = getTerrainElevation(map, {\n longitude: longitude,\n latitude: latitude\n });\n }\n\n var position = viewport.project([longitude, latitude, altitude]);\n var positionType = popup_getPosition(props, viewport, contentRef.current, position);\n var containerStyle = getContainerStyle(props, viewport, containerRef.current, position, positionType);\n var onReactClick = (0,react.useCallback)(function (e) {\n return !context.eventManager && onClick(e, thisRef);\n }, [context.eventManager]);\n return react.createElement(\"div\", {\n className: \"mapboxgl-popup mapboxgl-popup-anchor-\".concat(positionType, \" \").concat(className),\n style: containerStyle,\n ref: containerRef\n }, react.createElement(\"div\", {\n key: \"tip\",\n className: \"mapboxgl-popup-tip\",\n style: {\n borderWidth: tipSize\n }\n }), react.createElement(\"div\", {\n key: \"content\",\n ref: contentRef,\n className: \"mapboxgl-popup-content\",\n onClick: onReactClick\n }, closeButton && react.createElement(\"button\", {\n key: \"close-button\",\n className: \"mapboxgl-popup-close-button\",\n type: \"button\"\n }, \"\\xD7\"), children));\n}\n\nPopup.defaultProps = popup_defaultProps;\n/* harmony default export */ var popup = (react.memo(Popup));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/attribution-control.js\n\n\n\nfunction attribution_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction attribution_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n attribution_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n attribution_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\nvar attribution_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n toggleLabel: 'Toggle Attribution'\n});\n\nfunction setupAttributioncontrol(opts, map, container, attributionContainer) {\n var control = new (maplibre_gl_default()).AttributionControl(opts);\n control._map = map;\n control._container = container;\n control._innerContainer = attributionContainer;\n\n control._updateAttributions();\n\n control._updateEditLink();\n\n map.on('styledata', control._updateData);\n map.on('sourcedata', control._updateData);\n return control;\n}\n\nfunction removeAttributionControl(control) {\n control._map.off('styledata', control._updateData);\n\n control._map.off('sourcedata', control._updateData);\n}\n\nfunction AttributionControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var innerContainerRef = (0,react.useRef)(null);\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n showCompact = _useState2[0],\n setShowCompact = _useState2[1];\n\n (0,react.useEffect)(function () {\n var control;\n\n if (context.map) {\n control = setupAttributioncontrol({\n customAttribution: props.customAttribution\n }, context.map, containerRef.current, innerContainerRef.current);\n }\n\n return function () {\n return control && removeAttributionControl(control);\n };\n }, [context.map]);\n var compact = props.compact === undefined ? context.viewport.width <= 640 : props.compact;\n (0,react.useEffect)(function () {\n if (!compact && showCompact) {\n setShowCompact(false);\n }\n }, [compact]);\n var toggleAttribution = (0,react.useCallback)(function () {\n return setShowCompact(function (value) {\n return !value;\n });\n }, []);\n var style = (0,react.useMemo)(function () {\n return attribution_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: props.className\n }, react.createElement(\"div\", {\n ref: containerRef,\n \"aria-pressed\": showCompact,\n className: \"mapboxgl-ctrl mapboxgl-ctrl-attrib \".concat(compact ? 'mapboxgl-compact' : '', \" \").concat(showCompact ? 'mapboxgl-compact-show' : '')\n }, react.createElement(\"button\", {\n type: \"button\",\n className: \"mapboxgl-ctrl-attrib-button\",\n title: props.toggleLabel,\n onClick: toggleAttribution\n }), react.createElement(\"div\", {\n ref: innerContainerRef,\n className: \"mapboxgl-ctrl-attrib-inner\",\n role: \"list\"\n })));\n}\n\nAttributionControl.defaultProps = attribution_control_defaultProps;\n/* harmony default export */ var attribution_control = (react.memo(AttributionControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/fullscreen-control.js\n\n\n\nfunction fullscreen_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction fullscreen_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n fullscreen_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n fullscreen_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\nvar fullscreen_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n container: null,\n label: 'Toggle fullscreen'\n});\n\nfunction FullscreenControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n isFullscreen = _useState2[0],\n setIsFullscreen = _useState2[1];\n\n var _useState3 = (0,react.useState)(false),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n showButton = _useState4[0],\n setShowButton = _useState4[1];\n\n var _useState5 = (0,react.useState)(null),\n _useState6 = slicedToArray_slicedToArray(_useState5, 2),\n mapboxFullscreenControl = _useState6[0],\n createMapboxFullscreenControl = _useState6[1];\n\n (0,react.useEffect)(function () {\n var control = new (maplibre_gl_default()).FullscreenControl();\n createMapboxFullscreenControl(control);\n setShowButton(control._checkFullscreenSupport());\n\n var onFullscreenChange = function onFullscreenChange() {\n var nextState = !control._fullscreen;\n control._fullscreen = nextState;\n setIsFullscreen(nextState);\n };\n\n document_.addEventListener(control._fullscreenchange, onFullscreenChange);\n return function () {\n document_.removeEventListener(control._fullscreenchange, onFullscreenChange);\n };\n }, []);\n\n var onClickFullscreen = function onClickFullscreen() {\n if (mapboxFullscreenControl) {\n mapboxFullscreenControl._container = props.container || context.container;\n\n mapboxFullscreenControl._onClickFullscreen();\n }\n };\n\n var style = (0,react.useMemo)(function () {\n return fullscreen_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n\n if (!showButton) {\n return null;\n }\n\n var className = props.className,\n label = props.label;\n var type = isFullscreen ? 'shrink' : 'fullscreen';\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, react.createElement(\"button\", {\n key: type,\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-\".concat(type),\n type: \"button\",\n title: label,\n onClick: onClickFullscreen\n }, react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }))));\n}\n\nFullscreenControl.defaultProps = fullscreen_control_defaultProps;\n/* harmony default export */ var fullscreen_control = (react.memo(FullscreenControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/geolocate-utils.js\nvar supported;\nfunction isGeolocationSupported() {\n if (supported !== undefined) {\n return Promise.resolve(supported);\n }\n\n if (window.navigator.permissions !== undefined) {\n return window.navigator.permissions.query({\n name: 'geolocation'\n }).then(function (p) {\n supported = p.state !== 'denied';\n return supported;\n });\n }\n\n supported = Boolean(window.navigator.geolocation);\n return Promise.resolve(supported);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/geolocate-control.js\n\n\n\nfunction geolocate_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction geolocate_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n geolocate_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n geolocate_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\nvar geolocate_control_noop = function noop() {};\n\nvar geolocate_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n label: 'Find My Location',\n disabledLabel: 'Location Not Available',\n auto: false,\n positionOptions: {\n enableHighAccuracy: false,\n timeout: 6000\n },\n fitBoundsOptions: {\n maxZoom: 15\n },\n trackUserLocation: false,\n showUserLocation: true,\n showAccuracyCircle: true,\n onGeolocate: function onGeolocate() {}\n});\n\nfunction geolocate_control_getBounds(position) {\n var center = new (maplibre_gl_default()).LngLat(position.coords.longitude, position.coords.latitude);\n var radius = position.coords.accuracy;\n var bounds = center.toBounds(radius);\n return [[bounds._ne.lng, bounds._ne.lat], [bounds._sw.lng, bounds._sw.lat]];\n}\n\nfunction setupMapboxGeolocateControl(context, props, geolocateButton) {\n var control = new (maplibre_gl_default()).GeolocateControl(props);\n control._container = document_.createElement('div');\n control._map = {\n on: function on() {},\n _getUIString: function _getUIString() {\n return '';\n }\n };\n\n control._setupUI(true);\n\n control._map = context.map;\n control._geolocateButton = geolocateButton;\n var eventManager = context.eventManager;\n\n if (control.options.trackUserLocation && eventManager) {\n eventManager.on('panstart', function () {\n if (control._watchState === 'ACTIVE_LOCK') {\n control._watchState = 'BACKGROUND';\n geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background');\n geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n }\n });\n }\n\n control.on('geolocate', props.onGeolocate);\n return control;\n}\n\nfunction updateCamera(position, _ref) {\n var context = _ref.context,\n props = _ref.props;\n var bounds = geolocate_control_getBounds(position);\n\n var _context$viewport$fit = context.viewport.fitBounds(bounds, props.fitBoundsOptions),\n longitude = _context$viewport$fit.longitude,\n latitude = _context$viewport$fit.latitude,\n zoom = _context$viewport$fit.zoom;\n\n var newViewState = Object.assign({}, context.viewport, {\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n var mapState = new MapState(newViewState);\n var viewState = Object.assign({}, mapState.getViewportProps(), LINEAR_TRANSITION_PROPS);\n var onViewportChange = props.onViewportChange || context.onViewportChange || geolocate_control_noop;\n var onViewStateChange = props.onViewStateChange || context.onViewStateChange || geolocate_control_noop;\n onViewStateChange({\n viewState: viewState\n });\n onViewportChange(viewState);\n}\n\nfunction GeolocateControl(props) {\n var thisRef = useMapControl(props);\n var context = thisRef.context,\n containerRef = thisRef.containerRef;\n var geolocateButtonRef = (0,react.useRef)(null);\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n mapboxGeolocateControl = _useState2[0],\n createMapboxGeolocateControl = _useState2[1];\n\n var _useState3 = (0,react.useState)(false),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n supportsGeolocation = _useState4[0],\n setSupportsGeolocation = _useState4[1];\n\n (0,react.useEffect)(function () {\n var control;\n\n if (context.map) {\n isGeolocationSupported().then(function (result) {\n setSupportsGeolocation(result);\n\n if (geolocateButtonRef.current) {\n control = setupMapboxGeolocateControl(context, props, geolocateButtonRef.current);\n\n control._updateCamera = function (position) {\n return updateCamera(position, thisRef);\n };\n\n createMapboxGeolocateControl(control);\n }\n });\n }\n\n return function () {\n if (control) {\n control._clearWatch();\n }\n };\n }, [context.map]);\n var triggerGeolocate = (0,react.useCallback)(function () {\n if (mapboxGeolocateControl) {\n mapboxGeolocateControl.options = thisRef.props;\n mapboxGeolocateControl.trigger();\n }\n }, [mapboxGeolocateControl]);\n (0,react.useEffect)(function () {\n if (props.auto) {\n triggerGeolocate();\n }\n }, [mapboxGeolocateControl, props.auto]);\n (0,react.useEffect)(function () {\n if (mapboxGeolocateControl) {\n mapboxGeolocateControl._onZoom();\n }\n }, [context.viewport.zoom]);\n var className = props.className,\n label = props.label,\n disabledLabel = props.disabledLabel,\n trackUserLocation = props.trackUserLocation;\n var style = (0,react.useMemo)(function () {\n return geolocate_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n key: \"geolocate-control\",\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, react.createElement(\"button\", {\n key: \"geolocate\",\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-geolocate\",\n ref: geolocateButtonRef,\n disabled: !supportsGeolocation,\n \"aria-pressed\": !trackUserLocation,\n type: \"button\",\n title: supportsGeolocation ? label : disabledLabel,\n \"aria-label\": supportsGeolocation ? label : disabledLabel,\n onClick: triggerGeolocate\n }, react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }))));\n}\n\nGeolocateControl.defaultProps = geolocate_control_defaultProps;\n/* harmony default export */ var geolocate_control = (react.memo(GeolocateControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/version.js\nfunction compareVersions(version1, version2) {\n var v1 = (version1 || '').split('.').map(Number);\n var v2 = (version2 || '').split('.').map(Number);\n\n for (var i = 0; i < 3; i++) {\n var part1 = v1[i] || 0;\n var part2 = v2[i] || 0;\n\n if (part1 < part2) {\n return -1;\n }\n\n if (part1 > part2) {\n return 1;\n }\n }\n\n return 0;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/navigation-control.js\n\n\nfunction navigation_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction navigation_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n navigation_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n navigation_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\nvar navigation_control_noop = function noop() {};\n\nvar navigation_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n showCompass: true,\n showZoom: true,\n zoomInLabel: 'Zoom In',\n zoomOutLabel: 'Zoom Out',\n compassLabel: 'Reset North'\n});\nvar VERSION_LEGACY = 1;\nvar VERSION_1_6 = 2;\n\nfunction getUIVersion(mapboxVersion) {\n return compareVersions(mapboxVersion, '1.6.0') >= 0 ? VERSION_1_6 : VERSION_LEGACY;\n}\n\nfunction updateViewport(context, props, opts) {\n var viewport = context.viewport;\n var mapState = new MapState(Object.assign({}, viewport, opts));\n var viewState = Object.assign({}, mapState.getViewportProps(), LINEAR_TRANSITION_PROPS);\n var onViewportChange = props.onViewportChange || context.onViewportChange || navigation_control_noop;\n var onViewStateChange = props.onViewStateChange || context.onViewStateChange || navigation_control_noop;\n onViewStateChange({\n viewState: viewState\n });\n onViewportChange(viewState);\n}\n\nfunction renderButton(type, label, callback, children) {\n return react.createElement(\"button\", {\n key: type,\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-\".concat(type),\n type: \"button\",\n title: label,\n onClick: callback\n }, children || react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }));\n}\n\nfunction renderCompass(context) {\n var uiVersion = (0,react.useMemo)(function () {\n return context.map ? getUIVersion(context.map.version) : VERSION_1_6;\n }, [context.map]);\n var bearing = context.viewport.bearing;\n var style = {\n transform: \"rotate(\".concat(-bearing, \"deg)\")\n };\n return uiVersion === VERSION_1_6 ? react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\",\n style: style\n }) : react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-compass-arrow\",\n style: style\n });\n}\n\nfunction NavigationControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var onZoomIn = function onZoomIn() {\n updateViewport(context, props, {\n zoom: context.viewport.zoom + 1\n });\n };\n\n var onZoomOut = function onZoomOut() {\n updateViewport(context, props, {\n zoom: context.viewport.zoom - 1\n });\n };\n\n var onResetNorth = function onResetNorth() {\n updateViewport(context, props, {\n bearing: 0,\n pitch: 0\n });\n };\n\n var className = props.className,\n showCompass = props.showCompass,\n showZoom = props.showZoom,\n zoomInLabel = props.zoomInLabel,\n zoomOutLabel = props.zoomOutLabel,\n compassLabel = props.compassLabel;\n var style = (0,react.useMemo)(function () {\n return navigation_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, showZoom && renderButton('zoom-in', zoomInLabel, onZoomIn), showZoom && renderButton('zoom-out', zoomOutLabel, onZoomOut), showCompass && renderButton('compass', compassLabel, onResetNorth, renderCompass(context))));\n}\n\nNavigationControl.defaultProps = navigation_control_defaultProps;\n/* harmony default export */ var navigation_control = (react.memo(NavigationControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/scale-control.js\n\n\n\nfunction scale_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction scale_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n scale_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n scale_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\nvar scale_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n maxWidth: 100,\n unit: 'metric'\n});\n\nfunction ScaleControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n mapboxScaleControl = _useState2[0],\n createMapboxScaleControl = _useState2[1];\n\n (0,react.useEffect)(function () {\n if (context.map) {\n var control = new (maplibre_gl_default()).ScaleControl();\n control._map = context.map;\n control._container = containerRef.current;\n createMapboxScaleControl(control);\n }\n }, [context.map]);\n\n if (mapboxScaleControl) {\n mapboxScaleControl.options = props;\n\n mapboxScaleControl._onMove();\n }\n\n var style = (0,react.useMemo)(function () {\n return scale_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: props.className\n }, react.createElement(\"div\", {\n ref: containerRef,\n className: \"mapboxgl-ctrl mapboxgl-ctrl-scale\"\n }));\n}\n\nScaleControl.defaultProps = scale_control_defaultProps;\n/* harmony default export */ var scale_control = (react.memo(ScaleControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/canvas-overlay.js\n\n\n\n\nvar canvas_overlay_pixelRatio = typeof window !== 'undefined' && window.devicePixelRatio || 1;\nvar canvas_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction CanvasOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n ctx = _useState2[0],\n setDrawingContext = _useState2[1];\n\n (0,react.useEffect)(function () {\n setDrawingContext(containerRef.current.getContext('2d'));\n }, []);\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n if (ctx) {\n ctx.save();\n ctx.scale(canvas_overlay_pixelRatio, canvas_overlay_pixelRatio);\n props.redraw({\n width: viewport.width,\n height: viewport.height,\n ctx: ctx,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n });\n ctx.restore();\n }\n\n return react.createElement(\"canvas\", {\n ref: containerRef,\n width: viewport.width * canvas_overlay_pixelRatio,\n height: viewport.height * canvas_overlay_pixelRatio,\n style: {\n width: \"\".concat(viewport.width, \"px\"),\n height: \"\".concat(viewport.height, \"px\"),\n position: 'absolute',\n left: 0,\n top: 0\n }\n });\n}\n\nCanvasOverlay.defaultProps = canvas_overlay_defaultProps;\n/* harmony default export */ var canvas_overlay = ((/* unused pure expression or super */ null && (CanvasOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/html-overlay.js\n\n\nfunction html_overlay_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction html_overlay_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n html_overlay_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n html_overlay_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar html_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction HTMLOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n var style = html_overlay_objectSpread({\n position: 'absolute',\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height\n }, props.style);\n\n return react.createElement(\"div\", {\n ref: containerRef,\n style: style\n }, props.redraw({\n width: viewport.width,\n height: viewport.height,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n }));\n}\n\nHTMLOverlay.defaultProps = html_overlay_defaultProps;\n/* harmony default export */ var html_overlay = ((/* unused pure expression or super */ null && (HTMLOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/svg-overlay.js\n\n\nfunction svg_overlay_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction svg_overlay_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n svg_overlay_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n svg_overlay_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar svg_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction SVGOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n var style = svg_overlay_objectSpread({\n position: 'absolute',\n left: 0,\n top: 0\n }, props.style);\n\n return react.createElement(\"svg\", {\n width: viewport.width,\n height: viewport.height,\n ref: containerRef,\n style: style\n }, props.redraw({\n width: viewport.width,\n height: viewport.height,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n }));\n}\n\nSVGOverlay.defaultProps = svg_overlay_defaultProps;\n/* harmony default export */ var svg_overlay = ((/* unused pure expression or super */ null && (SVGOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/set-rtl-text-plugin.js\n\nvar setRTLTextPlugin = (maplibre_gl_default()) ? (maplibre_gl_default()).setRTLTextPlugin : function () {};\n/* harmony default export */ var set_rtl_text_plugin = ((/* unused pure expression or super */ null && (setRTLTextPlugin)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/index.js\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;// CONCATENATED MODULE: ./node_modules/@turf/helpers/dist/es/index.js\n/**\n * @module helpers\n */\n\n/**\n * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.\n *\n * @memberof helpers\n * @type {number}\n */\nvar earthRadius = 6371008.8;\n/**\n * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar factors = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: earthRadius / 111325,\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936\n};\n/**\n * Units of measurement factors based on 1 meter.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar unitsFactors = {\n centimeters: 100,\n centimetres: 100,\n degrees: 1 / 111325,\n feet: 3.28084,\n inches: 39.37,\n kilometers: 1 / 1000,\n kilometres: 1 / 1000,\n meters: 1,\n metres: 1,\n miles: 1 / 1609.344,\n millimeters: 1000,\n millimetres: 1000,\n nauticalmiles: 1 / 1852,\n radians: 1 / earthRadius,\n yards: 1.0936133\n};\n/**\n * Area of measurement factors based on 1 square meter.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar areaFactors = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046\n};\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @name feature\n * @param {Geometry} geometry input geometry\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\n\nfunction es_feature(geom, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var feat = {\n type: \"Feature\"\n };\n\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @name geometry\n * @param {string} type Geometry Type\n * @param {Array} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\n\nfunction geometry(type, coordinates, _options) {\n if (_options === void 0) {\n _options = {};\n }\n\n switch (type) {\n case \"Point\":\n return es_point(coordinates).geometry;\n\n case \"LineString\":\n return es_lineString(coordinates).geometry;\n\n case \"Polygon\":\n return polygon(coordinates).geometry;\n\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @name point\n * @param {Array} coordinates longitude, latitude position (each in decimal degrees)\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\n\nfunction es_point(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n var geom = {\n type: \"Point\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @name points\n * @param {Array>} coordinates an array of Points\n * @param {Object} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\n\nfunction points(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return es_point(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @name polygon\n * @param {Array>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\n\nfunction polygon(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {\n var ring = coordinates_1[_i];\n\n if (ring.length < 4) {\n throw new Error(\"Each LinearRing of a Polygon must have 4 or more Positions.\");\n }\n\n for (var j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n\n var geom = {\n type: \"Polygon\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @name polygons\n * @param {Array>>>} coordinates an array of Polygon coordinates\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\n\nfunction polygons(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return polygon(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @name lineString\n * @param {Array>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\n\nfunction es_lineString(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n\n var geom = {\n type: \"LineString\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @name lineStrings\n * @param {Array>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\n\nfunction lineStrings(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return es_lineString(coords, properties);\n }), options);\n}\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @name featureCollection\n * @param {Feature[]} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\n\nfunction featureCollection(features, options) {\n if (options === void 0) {\n options = {};\n }\n\n var fc = {\n type: \"FeatureCollection\"\n };\n\n if (options.id) {\n fc.id = options.id;\n }\n\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n\n fc.features = features;\n return fc;\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiLineString\n * @param {Array>>} coordinates an array of LineStrings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\n\nfunction multiLineString(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiLineString\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPoint\n * @param {Array>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\n\nfunction multiPoint(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiPoint\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPolygon\n * @param {Array>>>} coordinates an array of Polygons\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\n\nfunction multiPolygon(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiPolygon\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name geometryCollection\n * @param {Array} geometries an array of GeoJSON Geometries\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\n\nfunction geometryCollection(geometries, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"GeometryCollection\",\n geometries: geometries\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Round number to precision\n *\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\n\nfunction es_round(num, precision) {\n if (precision === void 0) {\n precision = 0;\n }\n\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name radiansToLength\n * @param {number} radians in radians across the sphere\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\n\nfunction radiansToLength(radians, units) {\n if (units === void 0) {\n units = \"kilometers\";\n }\n\n var factor = factors[units];\n\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n\n return radians * factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name lengthToRadians\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\n\nfunction lengthToRadians(distance, units) {\n if (units === void 0) {\n units = \"kilometers\";\n }\n\n var factor = factors[units];\n\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n\n return distance / factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @name lengthToDegrees\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\n\nfunction lengthToDegrees(distance, units) {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @name bearingToAzimuth\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\n\nfunction bearingToAzimuth(bearing) {\n var angle = bearing % 360;\n\n if (angle < 0) {\n angle += 360;\n }\n\n return angle;\n}\n/**\n * Converts an angle in radians to degrees\n *\n * @name radiansToDegrees\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\n\nfunction radiansToDegrees(radians) {\n var degrees = radians % (2 * Math.PI);\n return degrees * 180 / Math.PI;\n}\n/**\n * Converts an angle in degrees to radians\n *\n * @name degreesToRadians\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\n\nfunction degreesToRadians(degrees) {\n var radians = degrees % 360;\n return radians * Math.PI / 180;\n}\n/**\n * Converts a length to the requested unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @param {number} length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] of the length\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted length\n */\n\nfunction convertLength(length, originalUnit, finalUnit) {\n if (originalUnit === void 0) {\n originalUnit = \"kilometers\";\n }\n\n if (finalUnit === void 0) {\n finalUnit = \"kilometers\";\n }\n\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n/**\n * Converts a area to the requested unit.\n * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares\n * @param {number} area to be converted\n * @param {Units} [originalUnit=\"meters\"] of the distance\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted area\n */\n\nfunction convertArea(area, originalUnit, finalUnit) {\n if (originalUnit === void 0) {\n originalUnit = \"meters\";\n }\n\n if (finalUnit === void 0) {\n finalUnit = \"kilometers\";\n }\n\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n var startFactor = areaFactors[originalUnit];\n\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n var finalFactor = areaFactors[finalUnit];\n\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return area / startFactor * finalFactor;\n}\n/**\n * isNumber\n *\n * @param {*} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\n\nfunction isNumber(num) {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n/**\n * isObject\n *\n * @param {*} input variable to validate\n * @returns {boolean} true/false\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\n\nfunction es_isObject(input) {\n return !!input && input.constructor === Object;\n}\n/**\n * Validate BBox\n *\n * @private\n * @param {Array} bbox BBox to validate\n * @returns {void}\n * @throws Error if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\n\nfunction validateBBox(bbox) {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n\n bbox.forEach(function (num) {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n/**\n * Validate Id\n *\n * @private\n * @param {string|number} id Id to validate\n * @returns {void}\n * @throws Error if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\n\nfunction validateId(id) {\n if (!id) {\n throw new Error(\"id is required\");\n }\n\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@turf/meta/dist/es/index.js\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {Array} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @name coordEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\n\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1; // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection ? geojson.features[featureIndex].geometry : isFeature ? geojson.geometry : geojson;\n isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === \"GeometryCollection\" : false;\n stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection ? geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection; // Handles null Geometry -- Skips this geometry\n\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n wrapShrink = excludeWrapCoord && (geomType === \"Polygon\" || geomType === \"MultiPolygon\") ? 1 : 0;\n\n switch (geomType) {\n case null:\n break;\n\n case \"Point\":\n if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n }\n\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n }\n\n geometryIndex++;\n }\n\n multiFeatureIndex++;\n }\n\n break;\n\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++) {\n if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;\n }\n\n break;\n\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Array} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @name coordReduce\n * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\n\n\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n }, excludeWrapCoord);\n return previousValue;\n}\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {Object} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @name propEach\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\n\n\nfunction propEach(geojson, callback) {\n var i;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n\n break;\n\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {*} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @name propReduce\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\n\n\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;else previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name featureEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\n\n\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name featureReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\n\n\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @name coordAll\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @returns {Array>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\n\n\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @name geomEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\n\n\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1; // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection ? geojson.features[i].geometry : isFeature ? geojson.geometry : geojson;\n featureProperties = isFeatureCollection ? geojson.features[i].properties : isFeature ? geojson.properties : {};\n featureBBox = isFeatureCollection ? geojson.features[i].bbox : isFeature ? geojson.bbox : undefined;\n featureId = isFeatureCollection ? geojson.features[i].id : isFeature ? geojson.id : undefined;\n isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === \"GeometryCollection\" : false;\n stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection ? geometryMaybeCollection.geometries[g] : geometryMaybeCollection; // Handle null Geometry\n\n if (geometry === null) {\n if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n continue;\n }\n\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n {\n if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n break;\n }\n\n case \"GeometryCollection\":\n {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n }\n\n break;\n }\n\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n } // Only increase `featureIndex` per each feature\n\n\n featureIndex++;\n }\n}\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @name geomReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\n\n\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);\n });\n return previousValue;\n}\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name flattenEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\n\n\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (callback(feature(geometry, properties, {\n bbox: bbox,\n id: id\n }), featureIndex, 0) === false) return false;\n return;\n }\n\n var geomType; // Callback for multi-geometry\n\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate\n };\n if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;\n }\n });\n}\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @name flattenReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\n\n\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {\n if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);\n });\n return previousValue;\n}\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\n\n\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0; // Exclude null Geometries\n\n if (!feature.geometry) return; // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return; // Generate 2-vertex line segments\n\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (coordEach(feature, function (currentCoord, coordIndex, featureIndexCoord, multiPartIndexCoord, geometryIndex) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (previousCoords === undefined || featureIndex > previousFeatureIndex || multiPartIndexCoord > previousMultiIndex || geometryIndex > prevGeomIndex) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n\n var currentSegment = lineString([previousCoords, currentCoord], feature.properties);\n if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }) === false) return false;\n });\n}\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\n\n\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n if (started === false && initialValue === undefined) previousValue = currentSegment;else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);\n started = true;\n });\n return previousValue;\n}\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @name lineEach\n * @param {Geometry|Feature} geojson object\n * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\n\n\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false) return false;\n break;\n\n case \"Polygon\":\n for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {\n if (callback(lineString(coords[geometryIndex], feature.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n }\n\n break;\n }\n });\n}\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name lineReduce\n * @param {Geometry|Feature} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\n\n\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);\n });\n return previousValue;\n}\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature>\n */\n\n\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0; // Find FeatureIndex\n\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n\n default:\n throw new Error(\"geojson is invalid\");\n } // Find SegmentIndex\n\n\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);\n\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);\n\n case \"MultiLineString\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);\n\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);\n }\n\n throw new Error(\"geojson is invalid\");\n}\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature>\n */\n\n\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0; // Find FeatureIndex\n\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n\n default:\n throw new Error(\"geojson is invalid\");\n } // Find Coord Index\n\n\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n\n case \"MultiPoint\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n\n case \"MultiLineString\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);\n }\n\n throw new Error(\"geojson is invalid\");\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@turf/bbox/dist/es/index.js\n\n/**\n * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.\n *\n * @name bbox\n * @param {GeoJSON} geojson any GeoJSON object\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\n\nfunction bbox(geojson) {\n var result = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, function (coord) {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nbbox[\"default\"] = bbox;\n/* harmony default export */ var es = (bbox);\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js\nfunction cubicIn(t) {\n return t * t * t;\n}\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n// EXTERNAL MODULE: ./node_modules/react-device-detect/main.js\nvar main = __webpack_require__(1677);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n;// CONCATENATED MODULE: ./src/components/territoryFocusControl.module.scss\n// extracted by mini-css-extract-plugin\nvar territoryFocusButton = \"territoryFocusControl-module--territoryFocusButton--3wWoV\";\nvar territoryFocusContainer = \"territoryFocusControl-module--territoryFocusContainer--3N0XM\";\n;// CONCATENATED MODULE: ./src/components/territoryFocusControl.tsx\nvar TerritoryFocusControl=function TerritoryFocusControl(_ref){var onClickTerritoryFocusButton=_ref.onClickTerritoryFocusButton;var intl=(0,gatsby_plugin_intl.useIntl)();var _useMapControl=useMapControl({// @ts-ignore // Types have not caught up yet, see https://github.com/visgl/react-map-gl/issues/1492\nonClick:onClickTerritoryFocusButton}),containerRef=_useMapControl.containerRef;var territories=[{short:intl.formatMessage({id:'map.territoryFocus.lower48.short',defaultMessage:'48',description:'The abbreviated name indicating the bounds of the Lower 48 states'}),long:intl.formatMessage({id:'map.territoryFocus.lower48.long',defaultMessage:'Lower 48',description:'The longer name indicating the bounds of the Lower 48 states'})},{short:intl.formatMessage({id:'map.territoryFocus.alaska.short',defaultMessage:'AK',description:'The abbreviated indicating the bounds of Alaska'}),long:intl.formatMessage({id:'map.territoryFocus.alaska.long',defaultMessage:'Alaska',description:'The full name indicating the bounds of Alaska'})},{short:intl.formatMessage({id:'map.territoryFocus.hawaii.short',defaultMessage:'HI',description:'The abbreviated name indicating the bounds of Hawaii'}),long:intl.formatMessage({id:'map.territoryFocus.hawaii.long',defaultMessage:'Hawaii',description:'The longer name indicating the bounds of Hawaii'})},{short:intl.formatMessage({id:'map.territoryFocus.puerto_rico.short',defaultMessage:'PR',description:'The abbreviated name indicating the bounds of Puerto Rico'}),long:intl.formatMessage({id:'map.territoryFocus.puerto_rico.long',defaultMessage:'Puerto Rico',description:'The full name indicating the bounds of Puerto Rico'})}];return/*#__PURE__*/react.createElement(\"div\",{ref:containerRef,className:territoryFocusContainer},territories.map(function(territory){return/*#__PURE__*/react.createElement(\"button\",{id:territory.short,key:territory.short,onClick:onClickTerritoryFocusButton,className:territoryFocusButton,\"aria-label\":intl.formatMessage({id:'map.territoryFocus.focusOn',defaultMessage:'Focus on {territory}',description:'Focus on the bounds of a specific territory'},{territory:territory.long})},territory.short);}));};/* harmony default export */ var territoryFocusControl = (TerritoryFocusControl);\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/lightbulb_outline.svg\n/* harmony default export */ var lightbulb_outline = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxnPjxnPjxwYXRoIGQ9Ik05LDIxYzAsMC41NSwwLjQ1LDEsMSwxaDRjMC41NSwwLDEtMC40NSwxLTF2LTFIOVYyMXogTTEyLDJDOC4xNCwyLDUsNS4xNCw1LDljMCwyLjM4LDEuMTksNC40NywzLDUuNzRWMTcgYzAsMC41NSwwLjQ1LDEsMSwxaDZjMC41NSwwLDEtMC40NSwxLTF2LTIuMjZjMS44MS0xLjI3LDMtMy4zNiwzLTUuNzRDMTksNS4xNCwxNS44NiwyLDEyLDJ6IE0xNCwxMy43VjE2aC00di0yLjMgQzguNDgsMTIuNjMsNywxMS41Myw3LDljMC0yLjc2LDIuMjQtNSw1LTVzNSwyLjI0LDUsNUMxNywxMS40OSwxNS40OSwxMi42NSwxNCwxMy43eiIvPjwvZz48L2c+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./src/components/mapIntroduction.module.scss\n// extracted by mini-css-extract-plugin\nvar mapIntroContainer = \"mapIntroduction-module--mapIntroContainer--1K8du\";\nvar mapIntroHeader = \"mapIntroduction-module--mapIntroHeader--32LBs\";\nvar mapIntroText = \"mapIntroduction-module--mapIntroText--Tib8L\";\nvar mapIntroLightbulb = \"mapIntroduction-module--mapIntroLightbulb--3LBx0\";\nvar didYouKnowBox = \"mapIntroduction-module--didYouKnowBox--3ztEy\";\nvar didYouKnow = \"mapIntroduction-module--didYouKnow--3_v_i\";\nvar didYouKnowText = \"mapIntroduction-module--didYouKnowText--3sgHs\";\n;// CONCATENATED MODULE: ./src/components/mapIntroduction.tsx\n// @ts-ignore\nvar MapIntroduction=function MapIntroduction(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({mapIntroHeader:{id:'mapIntro.mapIntroHeader',defaultMessage:'Zoom and select a census block group to view data',description:'introductory text of ways to use the map'},didYouKnow:{id:'mapIntro.didYouKnow',defaultMessage:' Did you know?',description:'text prompting a cite paragraph'},censusBlockGroupDefinition:{id:'mapIntro.censusBlockGroupDefinition',defaultMessage:'A census block group is generally between 600 and 3,000 people. '+'It is the smallest geographical unit for which the U.S. Census '+'Bureau publishes sample data.',description:'cites the definition and helpful information about census groups'}});return/*#__PURE__*/react.createElement(\"aside\",{className:mapIntroContainer},/*#__PURE__*/react.createElement(\"header\",{className:mapIntroHeader},intl.formatMessage(messages.mapIntroHeader)),/*#__PURE__*/react.createElement(\"div\",{className:mapIntroText},/*#__PURE__*/react.createElement(\"img\",{className:mapIntroLightbulb,src:lightbulb_outline}),/*#__PURE__*/react.createElement(\"div\",{className:didYouKnowBox},/*#__PURE__*/react.createElement(\"div\",{className:didYouKnow},intl.formatMessage(messages.didYouKnow)),/*#__PURE__*/react.createElement(\"cite\",{className:didYouKnowText},intl.formatMessage(messages.censusBlockGroupDefinition)))));};/* harmony default export */ var mapIntroduction = (MapIntroduction);\n;// CONCATENATED MODULE: ./src/components/AreaDetail/areaDetail.module.scss\n// extracted by mini-css-extract-plugin\nvar areaDetailContainer = \"areaDetail-module--areaDetailContainer--YFThR\";\nvar topRow = \"areaDetail-module--topRow--mrsfo\";\nvar cumulativeIndexScore = \"areaDetail-module--cumulativeIndexScore--1MjN-\";\nvar areaDetail_module_categorization = \"areaDetail-module--categorization--hB9K8\";\nvar topRowTitle = \"areaDetail-module--topRowTitle--umx39\";\nvar censusLabel = \"areaDetail-module--censusLabel--3SC-c\";\nvar topRowSubTitle = \"areaDetail-module--topRowSubTitle--3je7r\";\nvar areaDetail_module_score = \"areaDetail-module--score--3bk9b\";\nvar scoreSuperscript = \"areaDetail-module--scoreSuperscript--3VIYX\";\nvar priority = \"areaDetail-module--priority--36uI7\";\nvar prioritized = \"areaDetail-module--prioritized--1XdWQ\";\nvar threshold = \"areaDetail-module--threshold--1Y2Xo\";\nvar nonPrioritized = \"areaDetail-module--nonPrioritized--1bTJl\";\nvar prioritization = \"areaDetail-module--prioritization--2NmrB\";\nvar censusRow = \"areaDetail-module--censusRow--169O8\";\nvar censusText = \"areaDetail-module--censusText--3j1xg\";\nvar indicatorDescription = \"areaDetail-module--indicatorDescription--2xFDY\";\nvar divider = \"areaDetail-module--divider--3yw9U\";\nvar indicatorBox = \"areaDetail-module--indicatorBox--2wAUP\";\nvar indicatorTitle = \"areaDetail-module--indicatorTitle--3Ij_h\";\nvar indicatorValue = \"areaDetail-module--indicatorValue--3EtVQ\";\n;// CONCATENATED MODULE: ./src/data/constants.tsx\n// URLS\nvar DOWNLOAD_ZIP_URL='https://justice40-data.s3.amazonaws.com/data-pipeline/data/score/downloadable/Screening+Tool+Data.zip';// This is the URL for the origin S3 bucket:\n// export const ORIGIN_BASE_URL = 'https://justice40-data.s3.amazonaws.com';\n// This is the URL for the CDN that delivers the tile data\nvar FEATURE_TILE_BASE_URL='https://d3jqyw10j8e7p9.cloudfront.net';var FEATURE_TILE_PATH='data-pipeline/data/score/tiles';// This is the URL for the CDN that delivers the application\n// const APP_BASE_URL = 'https://d2zjid6n5ja2pt.cloudfront.net';\nvar XYZ_SUFFIX='{z}/{x}/{y}.pbf';var featureURLForTilesetName=function featureURLForTilesetName(tilesetName){return FEATURE_TILE_BASE_URL+\"/\"+FEATURE_TILE_PATH+\"/\"+tilesetName+\"/\"+XYZ_SUFFIX;};var FEATURE_TILE_HIGH_ZOOM_URL=featureURLForTilesetName('high');var FEATURE_TILE_LOW_ZOOM_URL=featureURLForTilesetName('low');// Performance markers\nvar PERFORMANCE_MARKER_MAP_IDLE='MAP_IDLE';// Properties\nvar SCORE_PROPERTY_HIGH='Score E (percentile)';var SCORE_PROPERTY_LOW='E_SCORE';var GEOID_PROPERTY='GEOID10';var HIGH_SCORE_SOURCE_NAME='score-high';var HIGH_SCORE_LAYER_NAME='score-high-layer';var LOW_SCORE_SOURCE_NAME='score-low';var LOW_SCORE_LAYER_NAME='score-low-layer';var SELECTED_PROPERTY='selected';var CURRENTLY_SELECTED_FEATURE_HIGHLIGHT_LAYER_NAME='currently-selected-feature-highlight-layer';var BLOCK_GROUP_BOUNDARY_LAYER_NAME='block-group-boundary-layer';// Properties\nvar POVERTY_PROPERTY_PERCENTILE='Poverty (Less than 200% of federal poverty line) (percentile)';var HOUSING_BURDEN_PROPERTY_PERCENTILE='Housing burden (percent) (percentile)';var LINGUISTIC_ISOLATION_PROPERTY_PERCENTILE='Linguistic isolation (percent) (percentile)';var UNEMPLOYMENT_PROPERTY_PERCENTILE='Unemployed civilians (percent) (percentile)';var TOTAL_POPULATION='Total population';var EDUCATION_PROPERTY_PERCENTILE=\"Percent individuals age 25 or over with less than high school degree (percentile)\";var COUNTY_NAME='County Name';var STATE_NAME='State Name';// The name of the layer within the tiles that contains the score\nvar SCORE_SOURCE_LAYER='blocks';// Zoom\nvar GLOBAL_MIN_ZOOM=3;var GLOBAL_MAX_ZOOM=22;var GLOBAL_MIN_ZOOM_LOW=3;var GLOBAL_MAX_ZOOM_LOW=7;var GLOBAL_MIN_ZOOM_HIGHLIGHT=8;var GLOBAL_MAX_ZOOM_HIGHLIGHT=22;var GLOBAL_MIN_ZOOM_HIGH=7;var GLOBAL_MAX_ZOOM_HIGH=11;// Bounds\nvar GLOBAL_MAX_BOUNDS=(/* unused pure expression or super */ null && ([[-180.118306,5.499550],[-65.0,83.162102]]));var LOWER_48_BOUNDS=[[-124.7844079,24.7433195],[-66.9513812,49.3457868]];var ALASKA_BOUNDS=[[-183.856888,50.875311],[-140.932617,71.958797]];var HAWAII_BOUNDS=[[-168.118306,18.748115],[-154.757881,22.378413]];var PUERTO_RICO_BOUNDS=[[-67.945404,17.88328],[-65.220703,18.515683]];var GUAM_BOUNDS=(/* unused pure expression or super */ null && ([[-215.389709,13.225909],[-215.040894,13.663335]]));var MARIANA_ISLAND_BOUNDS=(/* unused pure expression or super */ null && ([[-215.313449,14.007801],[-213.742404,19.750326]]));var AMERICAN_SAMOA_BOUNDS=(/* unused pure expression or super */ null && ([[-171.089874,-14.548699],[-168.1433,-11.046934]]));var DEFAULT_CENTER=[32.4687126,-86.502136];// Opacity\nvar DEFAULT_LAYER_OPACITY=0.6;// Colors\nvar DEFAULT_OUTLINE_COLOR='#4EA5CF';var MIN_COLOR='#FFFFFF';var MED_COLOR='#D1DAE6';var MAX_COLOR='#768FB3';var BORDER_HIGHLIGHT_COLOR='#00BDE3';var CURRENTLY_SELECTED_FEATURE_LAYER_OPACITY=0.5;// Widths\nvar HIGHLIGHT_BORDER_WIDTH=5.0;var CURRENTLY_SELECTED_FEATURE_LAYER_WIDTH=0.8;// Score boundaries\nvar SCORE_BOUNDARY_LOW=0.0;var SCORE_BOUNDARY_THRESHOLD=0.6;var SCORE_BOUNDARY_PRIORITIZED=0.75;// Explore the Tool:\nvar EXPLORE_TOOL_PAGE_TEXT=(0,lib/* defineMessages */.vU)({PRIORITY_LABEL:{id:'legend.info.priority.label',defaultMessage:'Prioritized community',description:'the label of the prioritized community legend'},THRESHOLD_LABEL:{id:'legend.info.threshold.label',defaultMessage:'Threshold community',description:'the label of the threshold community legend'},LEGEND_LABEL:{id:'legend.colorkey.label',defaultMessage:'COLOR KEY',description:'the label of the key in the legend'}});var isMobile=main/* isMobile */.tq;\n;// CONCATENATED MODULE: ./src/components/AreaDetail/index.tsx\n// External Libs:\n// Components:\n// Styles and constants\nvar readablePercent=function readablePercent(percent){return\"\"+(percent*100).toFixed(1);};var getCategorization=function getCategorization(percentile){var categorization;var categoryCircleStyle;if(percentile>=SCORE_BOUNDARY_PRIORITIZED){categorization='Prioritized';categoryCircleStyle=prioritized;}else if(SCORE_BOUNDARY_THRESHOLD<=percentile&&percentile',SCORE_PROPERTY_LOW,SCORE_BOUNDARY_THRESHOLD]],'paint':makePaint({field:SCORE_PROPERTY_LOW,minRamp:SCORE_BOUNDARY_LOW,medRamp:SCORE_BOUNDARY_THRESHOLD,maxRamp:SCORE_BOUNDARY_PRIORITIZED}),'minzoom':GLOBAL_MIN_ZOOM_LOW,'maxzoom':GLOBAL_MAX_ZOOM_LOW},{// We put labels last to ensure prominence\n'id':'labels-only-layer','type':'raster','source':'labels','minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM}]};};\n;// CONCATENATED MODULE: ./src/components/J40Map.module.scss\n// extracted by mini-css-extract-plugin\nvar mapAndInfoPanelContainer = \"J40Map-module--mapAndInfoPanelContainer--q-ody\";\nvar j40Popup = \"J40Map-module--j40Popup--3yJGr\";\nvar navigationControl = \"J40Map-module--navigationControl--2Aybf\";\nvar fullscreenControl = \"J40Map-module--fullscreenControl--1UBKe\";\nvar geolocateControl = \"J40Map-module--geolocateControl--3KVAk\";\nvar J40Map_module_mapInfoPanel = \"J40Map-module--mapInfoPanel--F3jR4\";\n;// CONCATENATED MODULE: ./src/components/J40Map.tsx\n/* eslint-disable no-unused-vars */ // External Libs:\n// Contexts:\n// Components:\n// Styles and constants\n;;var J40Map=function J40Map(_ref){var location=_ref.location;// Hash portion of URL is of the form #zoom/lat/lng\nvar _location$hash$slice$=location.hash.slice(1).split('/'),zoom=_location$hash$slice$[0],lat=_location$hash$slice$[1],lng=_location$hash$slice$[2];var _useState=(0,react.useState)({latitude:lat&&parseFloat(lat)||DEFAULT_CENTER[0],longitude:lng&&parseFloat(lng)||DEFAULT_CENTER[1],zoom:zoom&&parseFloat(zoom)||GLOBAL_MIN_ZOOM}),viewport=_useState[0],setViewport=_useState[1];var _useState2=(0,react.useState)(),selectedFeature=_useState2[0],setSelectedFeature=_useState2[1];var _useState3=(0,react.useState)(),detailViewData=_useState3[0],setDetailViewData=_useState3[1];var _useState4=(0,react.useState)(false),transitionInProgress=_useState4[0],setTransitionInProgress=_useState4[1];var _useState5=(0,react.useState)(false),geolocationInProgress=_useState5[0],setGeolocationInProgress=_useState5[1];var _useState6=(0,react.useState)(false),isMobileMapState=_useState6[0],setIsMobileMapState=_useState6[1];var mapRef=(0,react.useRef)(null);var flags=(0,FlagContext/* useFlags */.Vb)();var selectedFeatureId=selectedFeature&&selectedFeature.id||'';var filter=(0,react.useMemo)(function(){return['in',GEOID_PROPERTY,selectedFeatureId];},[selectedFeature]);var onClick=function onClick(event){var feature=event.features&&event.features[0];if(feature){var _bbox=es(feature),minLng=_bbox[0],minLat=_bbox[1],maxLng=_bbox[2],maxLat=_bbox[3];var newViewPort=new WebMercatorViewport({height:viewport.height,width:viewport.width});var _newViewPort$fitBound=newViewPort.fitBounds([[minLng,minLat],[maxLng,maxLat]],{padding:40}),longitude=_newViewPort$fitBound.longitude,latitude=_newViewPort$fitBound.latitude,_zoom=_newViewPort$fitBound.zoom;if(feature.id!==selectedFeatureId){setSelectedFeature(feature);}else{setSelectedFeature(undefined);}var popupInfo={longitude:longitude,latitude:latitude,zoom:_zoom,properties:feature.properties};goToPlace([[minLng,minLat],[maxLng,maxLat]]);setDetailViewData(popupInfo);}};var onLoad=function onLoad(){if(typeof window!=='undefined'&&window.Cypress&&mapRef.current){window.underlyingMap=mapRef.current.getMap();}if(main/* isMobile */.tq)setIsMobileMapState(true);};var goToPlace=function goToPlace(bounds){var _WebMercatorViewport$=new WebMercatorViewport({height:viewport.height,width:viewport.width}).fitBounds(bounds,{padding:20,offset:[0,-100]}),longitude=_WebMercatorViewport$.longitude,latitude=_WebMercatorViewport$.latitude,zoom=_WebMercatorViewport$.zoom;setViewport(Object.assign({},viewport,{longitude:longitude,latitude:latitude,zoom:zoom,transitionDuration:1000,transitionInterpolator:new ViewportFlyToInterpolator(),transitionEasing:cubicInOut}));};var onClickTerritoryFocusButton=function onClickTerritoryFocusButton(event){event.stopPropagation();var buttonID=event.target&&event.target.id;switch(buttonID){case'48':goToPlace(LOWER_48_BOUNDS);break;case'AK':goToPlace(ALASKA_BOUNDS);break;case'HI':goToPlace(HAWAII_BOUNDS);break;case'PR':goToPlace(PUERTO_RICO_BOUNDS);break;default:break;}};var onTransitionStart=function onTransitionStart(){setTransitionInProgress(true);};var onTransitionEnd=function onTransitionEnd(){setTransitionInProgress(false);};var onGeolocate=function onGeolocate(){setGeolocationInProgress(false);};var onClickGeolocate=function onClickGeolocate(){setGeolocationInProgress(true);};return/*#__PURE__*/react.createElement(\"div\",{className:mapAndInfoPanelContainer},/*#__PURE__*/react.createElement(interactive_map,Object.assign({},viewport,{mapStyle:makeMapStyle(flags),minZoom:GLOBAL_MIN_ZOOM,maxZoom:GLOBAL_MAX_ZOOM,mapOptions:{hash:true},width:\"100%\",height:isMobileMapState?'44vh':'100%',dragRotate:false,touchRotate:false,interactiveLayerIds:[HIGH_SCORE_LAYER_NAME],onViewportChange:setViewport,onClick:onClick,onLoad:onLoad,onTransitionStart:onTransitionStart,onTransitionEnd:onTransitionEnd,ref:mapRef,\"data-cy\":'reactMapGL'}),/*#__PURE__*/react.createElement(source,{id:HIGH_SCORE_SOURCE_NAME,type:\"vector\",promoteId:GEOID_PROPERTY,tiles:[FEATURE_TILE_HIGH_ZOOM_URL],maxzoom:GLOBAL_MIN_ZOOM_HIGH,minzoom:GLOBAL_MAX_ZOOM_HIGH},/*#__PURE__*/react.createElement(components_layer,{id:CURRENTLY_SELECTED_FEATURE_HIGHLIGHT_LAYER_NAME,\"source-layer\":SCORE_SOURCE_LAYER,type:\"line\",paint:{'line-color':DEFAULT_OUTLINE_COLOR,'line-width':CURRENTLY_SELECTED_FEATURE_LAYER_WIDTH,'line-opacity':CURRENTLY_SELECTED_FEATURE_LAYER_OPACITY},minzoom:GLOBAL_MIN_ZOOM_HIGHLIGHT,maxzoom:GLOBAL_MAX_ZOOM_HIGHLIGHT}),/*#__PURE__*/react.createElement(components_layer,{id:BLOCK_GROUP_BOUNDARY_LAYER_NAME,type:\"line\",\"source-layer\":SCORE_SOURCE_LAYER,paint:{'line-color':BORDER_HIGHLIGHT_COLOR,'line-width':HIGHLIGHT_BORDER_WIDTH},filter:filter,minzoom:GLOBAL_MIN_ZOOM_HIGH})),'fs'in flags&&detailViewData&&!transitionInProgress&&/*#__PURE__*/react.createElement(popup,{className:j40Popup,tipSize:5,anchor:\"top\",longitude:detailViewData.longitude,latitude:detailViewData.latitude,closeOnClick:true,onClose:setDetailViewData,captureScroll:true},/*#__PURE__*/react.createElement(components_AreaDetail,{properties:detailViewData.properties})),/*#__PURE__*/react.createElement(navigation_control,{showCompass:false,className:navigationControl}),'gl'in flags?/*#__PURE__*/react.createElement(geolocate_control,{className:geolocateControl,positionOptions:{enableHighAccuracy:true},onGeolocate:onGeolocate// @ts-ignore // Types have not caught up yet, see https://github.com/visgl/react-map-gl/issues/1492\n,onClick:onClickGeolocate}):'',geolocationInProgress?/*#__PURE__*/react.createElement(\"div\",null,\"Geolocation in progress...\"):'',/*#__PURE__*/react.createElement(territoryFocusControl,{onClickTerritoryFocusButton:onClickTerritoryFocusButton}),'fs'in flags?/*#__PURE__*/react.createElement(fullscreen_control,{className:fullscreenControl}):''),/*#__PURE__*/react.createElement(mapInfoPanel,{className:J40Map_module_mapInfoPanel,featureProperties:detailViewData===null||detailViewData===void 0?void 0:detailViewData.properties,selectedFeatureId:selectedFeature===null||selectedFeature===void 0?void 0:selectedFeature.id}));};/* harmony default export */ var components_J40Map = (J40Map);\n;// CONCATENATED MODULE: ./src/components/MapWrapper/mapWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar mapCaptionTextLink = \"mapWrapper-module--mapCaptionTextLink--23b2n\";\n;// CONCATENATED MODULE: ./src/components/MapWrapper/index.tsx\nvar MapWrapper=function MapWrapper(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({downloadLinkText:{id:'mapwrapper.download.link',defaultMessage:'Download the draft list of prioritized communities (pre-decisional) and datasets used',description:'download link for datasets'},downloadContents:{id:'mapwrapper.download.contents',defaultMessage:'ZIP file will contain one .xlsx, one .csv and one .pdf (30 MB).',description:'download link contents'}});return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:false,showLimitedDataAlert:true}),/*#__PURE__*/react.createElement(components_J40Map,{location:location}),/*#__PURE__*/react.createElement(\"div\",{className:mapCaptionTextLink},/*#__PURE__*/react.createElement(\"a\",{href:DOWNLOAD_ZIP_URL},intl.formatMessage(messages.downloadLinkText))),/*#__PURE__*/react.createElement(\"div\",null,intl.formatMessage(messages.downloadContents)));};/* harmony default export */ var components_MapWrapper = (MapWrapper);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar react_uswds_lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/components/MapLegend/mapLegend.module.scss\n// extracted by mini-css-extract-plugin\nvar legendContainer = \"mapLegend-module--legendContainer--2FaKH\";\nvar legendTooltipText = \"mapLegend-module--legendTooltipText--3wq6f\";\nvar legendHeader = \"mapLegend-module--legendHeader--2GZK6\";\nvar swatchContainer = \"mapLegend-module--swatchContainer--1vU2J\";\nvar legendItem = \"mapLegend-module--legendItem--2VxVZ\";\nvar infoIconWrapper = \"mapLegend-module--infoIconWrapper--2_1Kg\";\nvar infoIcon = \"mapLegend-module--infoIcon--3MRe8\";\nvar colorSwatch = \"mapLegend-module--colorSwatch--_SQwT\";\nvar mapLegend_module_prioritized = \"mapLegend-module--prioritized--2vkQG\";\nvar mapLegend_module_threshold = \"mapLegend-module--threshold--2-1Kq\";\nvar mapLegend_module_nonPrioritized = \"mapLegend-module--nonPrioritized--XbGzN\";\nvar legendTooltipTheme = \"mapLegend-module--legendTooltipTheme--3PGDy\";\nvar placeTop = \"mapLegend-module--place-top--2t_ed\";\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/info_outline.svg\n/* harmony default export */ var info_outline = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHBhdGggZD0iTTAsMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTExLDdoMnYyaC0yVjd6IE0xMSwxMWgydjZoLTJWMTF6IE0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMnM0LjQ4LDEwLDEwLDEwczEwLTQuNDgsMTAtMTBTMTcuNTIsMiwxMiwyeiBNMTIsMjAgYy00LjQxLDAtOC0zLjU5LTgtOHMzLjU5LTgsOC04czgsMy41OSw4LDhTMTYuNDEsMjAsMTIsMjB6Ii8+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./src/components/MapLegend/index.tsx\nvar _excluded=[\"className\",\"children\"];// @ts-ignore\n// Todo VS: This information will be used in the re-design of the tool-tip\n// const getToolTipContent = (type:string) => {\n// const intl = useIntl();\n// const messages = defineMessages({\n// priorityHeader: {\n// id: 'tooltip.info.priority.header',\n// defaultMessage: constants.PRIORITIZED_COMMUNITY,\n// description: 'the header of the prioritized community tooltip',\n// },\n// thresholdHeader: {\n// id: 'tooltip.info.threshold.header',\n// defaultMessage: constants.THRESHOLD_COMMUNITY,\n// description: 'the header of the threshold community tooltip',\n// },\n// priorityText: {\n// id: 'tooltip.info.priority.text',\n// defaultMessage: 'A prioritized community is one that has a cumulative index score of Xth ' +\n// 'percentile and above. 40% of the benefits from investments outlined by the ' +\n// 'Justice40 Initiative should go to prioritized communities.',\n// description: 'the text of the prioritized community tooltip',\n// },\n// thresholdText: {\n// id: 'tooltip.info.threshold.text',\n// defaultMessage: 'Communities with a cumulative index score between Y - X.99th percentile are ' +\n// 'considered threshold communities. While these communities are currently not considered a ' +\n// 'prioritized community, this may change based on updates to the scoring method.',\n// description: 'the text of the threshold community tooltip',\n// },\n// });\n// return (type === 'prioritized') ?\n// (\n//
\n//

{intl.formatMessage(messages.priorityHeader)}

\n//

{intl.formatMessage(messages.priorityText)}

\n//
\n// ) :\n// (\n//
\n//

{intl.formatMessage(messages.thresholdHeader)}

\n//

{intl.formatMessage(messages.thresholdText)}

\n//
\n// );\n// };\nvar MapLegend=function MapLegend(){var intl=(0,gatsby_plugin_intl.useIntl)();// Type definitions required for @trussworks tooltip. This type defines the div that wraps the icon.\n// This allows to pass children and other attributes.\nvar IconWrapper=/*#__PURE__*/react.forwardRef(function(_ref,ref){var className=_ref.className,children=_ref.children,tooltipProps=_objectWithoutPropertiesLoose(_ref,_excluded);return/*#__PURE__*/react.createElement(\"div\",Object.assign({ref:ref,className:infoIconWrapper},tooltipProps),children);});IconWrapper.displayName='custom info wrapper';return/*#__PURE__*/react.createElement(\"div\",{className:legendContainer},/*#__PURE__*/react.createElement(\"h3\",{className:legendHeader},intl.formatMessage(EXPLORE_TOOL_PAGE_TEXT.LEGEND_LABEL)),/*#__PURE__*/react.createElement(\"div\",{className:swatchContainer},/*#__PURE__*/react.createElement(\"div\",{className:legendItem},/*#__PURE__*/react.createElement(\"div\",{className:colorSwatch,id:mapLegend_module_prioritized}),/*#__PURE__*/react.createElement(\"span\",null,intl.formatMessage(EXPLORE_TOOL_PAGE_TEXT.PRIORITY_LABEL)),/*#__PURE__*/react.createElement(react_uswds_lib.Tooltip,{label:\"\\n Communities that have cumulative \\n index score of Xth percentile\\n and above\\n \",position:\"left\",asCustom:IconWrapper},/*#__PURE__*/react.createElement(\"img\",{className:infoIcon,src:info_outline}))),/*#__PURE__*/react.createElement(\"div\",{className:legendItem},/*#__PURE__*/react.createElement(\"div\",{className:colorSwatch,id:mapLegend_module_threshold}),/*#__PURE__*/react.createElement(\"span\",null,intl.formatMessage(EXPLORE_TOOL_PAGE_TEXT.THRESHOLD_LABEL)),/*#__PURE__*/react.createElement(react_uswds_lib.Tooltip,{label:\"\\n Communities with a cumulative \\n index score between Y - X.99th\\n percentile\\n \",position:\"left\",asCustom:IconWrapper},/*#__PURE__*/react.createElement(\"img\",{className:infoIcon,src:info_outline})))));};/* harmony default export */ var components_MapLegend = (MapLegend);\n;// CONCATENATED MODULE: ./src/pages/cejst.module.scss\n// extracted by mini-css-extract-plugin\nvar explorePageHeader = \"cejst-module--explorePageHeader--2TwDz\";\nvar explorePageSubHeader = \"cejst-module--explorePageSubHeader--SF-1J\";\nvar explorePageHeaderText = \"cejst-module--explorePageHeaderText--RSpUL\";\n;// CONCATENATED MODULE: ./src/pages/cejst.tsx\nvar CEJSTPage=function CEJSTPage(_ref){var location=_ref.location;// We temporarily removed MapControls, which would enable you to `setFeatures` also, for now\n// We will bring back later when we have interactive controls.\nreturn/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-main-content'},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(\"h1\",{className:explorePageHeader},\"Explore the tool\"),/*#__PURE__*/react.createElement(\"div\",{className:explorePageSubHeader},/*#__PURE__*/react.createElement(\"div\",{className:explorePageHeaderText},/*#__PURE__*/react.createElement(\"p\",null,\"Zoom into the map to see which communities the tool has currently identified as prioritized (the top 25% of communities) or on the threshold. Learn more about the formula and datasets that were used to prioritize these communities on the\",\" \",/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology'},\"Data & methodology\"),\" \",\"page.\")),/*#__PURE__*/react.createElement(components_MapLegend,null))))),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(components_MapWrapper,{location:location})))),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(components_HowYouCanHelp,null))))));};/* harmony default export */ var cejst = (CEJSTPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0hvd1lvdUNhbkhlbHAvaG93WW91Q2FuSGVscC5tb2R1bGUuc2Nzcz8yOWZiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSG93WW91Q2FuSGVscC9pbmRleC50c3g/Zjk3NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzP2MzMWQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanM/YWRlMyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcz8wZDIxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzPzA5ZjAiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzPzNkOGMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcz8zODM1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrLmpzP2Q0ZWMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanM/YmVlMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcz9iOTNlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjNC5qcz84OWJiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9tYXRoLXV0aWxzLmpzP2Q5MDYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQ0LmpzPzQ1ODkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzPzFhNzEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzPzg5MDIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL2Fzc2VydC5qcz9hYTdhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS93ZWItbWVyY2F0b3ItdXRpbHMuanM/NzM1MiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AbWF0aC5nbC93ZWItbWVyY2F0b3IvZGlzdC9lc20vZml0LWJvdW5kcy5qcz84MTdlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9nZXQtYm91bmRzLmpzPzQwZjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL3dlYi1tZXJjYXRvci12aWV3cG9ydC5qcz8xYWQ2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9ub3JtYWxpemUtdmlld3BvcnQtcHJvcHMuanM/YzNkOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AbWF0aC5nbC93ZWItbWVyY2F0b3IvZGlzdC9lc20vZmx5LXRvLXZpZXdwb3J0LmpzPzNjMjgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL2luZGV4LmpzP2U1YjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdC9tb2R1bGUuanM/ZTI0NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwvZGlzdC9SZXNpemVPYnNlcnZlci5lcy5qcz82ZmVhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9nbG9iYWxzLmpzP2U3YWUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3N0eWxlLXV0aWxzLmpzP2UyZGEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL21hcGJveC9tYXBib3guanM/OWM3ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWF0aC11dGlscy5qcz9mOTFhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9hc3NlcnQuanM/ODA0NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWFwLXN0YXRlLmpzPzRmYjEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL21hcC1jb25zdHJhaW50cy5qcz8yMWNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL21hcC1jb250ZXh0LmpzP2M2N2EiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QuanM/NGY3MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdGVycmFpbi5qcz8xMDFiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3N0YXRpYy1tYXAuanM/NjhkMCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLWludGVycG9sYXRvci5qcz80YWQ0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcz8yNTdlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzPzI2MmUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcz85OWRlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzPzdlODQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3RyYW5zaXRpb24vdHJhbnNpdGlvbi11dGlscy5qcz84ZDM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy90cmFuc2l0aW9uL3ZpZXdwb3J0LWZseS10by1pbnRlcnBvbGF0b3IuanM/NDg3MiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi9saW5lYXItaW50ZXJwb2xhdG9yLmpzPzRiMGUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3RyYW5zaXRpb24vaW5kZXguanM/MmJiOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi1tYW5hZ2VyLmpzP2MzMzQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9oYW1tZXItb3ZlcnJpZGVzLmpzPzNjNzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9oYW1tZXIuYnJvd3Nlci5qcz9iNjk4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL21qb2xuaXIuanMvZGlzdC9lc20vY29uc3RhbnRzLmpzP2Y0MjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9nbG9iYWxzLmpzP2UxNDEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMvd2hlZWwtaW5wdXQuanM/MDUzZSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL2lucHV0cy9tb3ZlLWlucHV0LmpzP2JiNDAiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMva2V5LWlucHV0LmpzPzQzMmEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMvY29udGV4dG1lbnUtaW5wdXQuanM/NWVkMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL3V0aWxzL2V2ZW50LXV0aWxzLmpzPzI1NjIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9ldmVudC1yZWdpc3RyYXIuanM/NDc1MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL2V2ZW50LW1hbmFnZXIuanM/ZDE3MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWFwLWNvbnRyb2xsZXIuanM/MmM1MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9pbnRlcmFjdGl2ZS1tYXAuanM/ODZkYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanM/NTNjYSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvZGVlcC1lcXVhbC5qcz82NTAyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3NvdXJjZS5qcz82ZWU0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanM/Y2NiNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcz8xNWZkIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL2xheWVyLmpzPzlmZjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sLmpzPzgzYjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvYmFzZS1jb250cm9sLmpzP2MzNTciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvZHJhZ2dhYmxlLWNvbnRyb2wuanM/MmY3NCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvY3Jpc3AtcGl4ZWwuanM/ODhhZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9tYXJrZXIuanM/MDA4ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvZHluYW1pYy1wb3NpdGlvbi5qcz9hZDM5Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3BvcHVwLmpzPzk5MzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvYXR0cmlidXRpb24tY29udHJvbC5qcz8yMzEyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL2Z1bGxzY3JlZW4tY29udHJvbC5qcz8xMDM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9nZW9sb2NhdGUtdXRpbHMuanM/ZDM2YiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9nZW9sb2NhdGUtY29udHJvbC5qcz9hYzMwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy92ZXJzaW9uLmpzP2IyNzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1jb250cm9sLmpzP2ExYzUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvc2NhbGUtY29udHJvbC5qcz9lNzIwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9vdmVybGF5cy9jYW52YXMtb3ZlcmxheS5qcz84NTMzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9vdmVybGF5cy9odG1sLW92ZXJsYXkuanM/Y2Q3ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vb3ZlcmxheXMvc3ZnLW92ZXJsYXkuanM/OGU1MCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvc2V0LXJ0bC10ZXh0LXBsdWdpbi5qcz8wMGNmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9pbmRleC5qcz9jMWIzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2hlbHBlcnMvZGlzdC9lcy9pbmRleC5qcz8yOTI1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL21ldGEvZGlzdC9lcy9pbmRleC5qcz80ZTU4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2Jib3gvZGlzdC9lcy9pbmRleC5qcz9jZTFjIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzP2U0MmQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy90ZXJyaXRvcnlGb2N1c0NvbnRyb2wubW9kdWxlLnNjc3M/MDAwYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL3RlcnJpdG9yeUZvY3VzQ29udHJvbC50c3g/MTRlNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvbGlnaHRidWxiX291dGxpbmUuc3ZnPzg0YWYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9tYXBJbnRyb2R1Y3Rpb24ubW9kdWxlLnNjc3M/YWE4NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL21hcEludHJvZHVjdGlvbi50c3g/MmJkMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FyZWFEZXRhaWwvYXJlYURldGFpbC5tb2R1bGUuc2Nzcz80YzM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2RhdGEvY29uc3RhbnRzLnRzeD9iZTVhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvQXJlYURldGFpbC9pbmRleC50c3g/MDk5NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL21hcEluZm9QYW5lbC50c3g/ODg0MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL21hcFN0eWxlLnRzeD85ZDk2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSjQwTWFwLm1vZHVsZS5zY3NzP2I3ZGIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBNYXAudHN4P2FmNzciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBXcmFwcGVyL21hcFdyYXBwZXIubW9kdWxlLnNjc3M/MDJhOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL01hcFdyYXBwZXIvaW5kZXgudHN4P2JkYjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBMZWdlbmQvbWFwTGVnZW5kLm1vZHVsZS5zY3NzPzdlMzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2luZm9fb3V0bGluZS5zdmc/MDczOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL01hcExlZ2VuZC9pbmRleC50c3g/MjhmZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9jZWpzdC5tb2R1bGUuc2Nzcz82MWUzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL3BhZ2VzL2NlanN0LnRzeD9lMWRmIl0sIm5hbWVzIjpbIkhvd1lvdUNhbkhlbHAiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJ5b3VDYW5IZWxwSGVhZGVyIiwiaWQiLCJkZWZhdWx0TWVzc2FnZSIsImRlc2NyaXB0aW9uIiwieW91Q2FuSGVscEluZm9UZXh0IiwieW91Q2FuSGVscEluZm9MaW5rVGV4dCIsInlvdUNhbkhlbHBEYXRhTWV0aFByZWZpeFRleHQiLCJ5b3VDYW5IZWxwRGF0YU1ldGhMaW5rVGV4dCIsInlvdUNhbkhlbHBEYXRhTWV0aFN1ZmZpeFRleHQiLCJ5b3VDYW5IZWxwU2hhcmluZ1ByZWZpeFRleHQiLCJ5b3VDYW5IZWxwU2hhcmluZ0xpbmtUZXh0Iiwic3R5bGVzIiwiZm9ybWF0TWVzc2FnZSIsIlRlcnJpdG9yeUZvY3VzQ29udHJvbCIsIm9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbiIsInVzZU1hcENvbnRyb2wiLCJvbkNsaWNrIiwiY29udGFpbmVyUmVmIiwidGVycml0b3JpZXMiLCJzaG9ydCIsImxvbmciLCJtYXAiLCJ0ZXJyaXRvcnkiLCJNYXBJbnRyb2R1Y3Rpb24iLCJtYXBJbnRyb0hlYWRlciIsImRpZFlvdUtub3ciLCJjZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbiIsImxpZ2h0YnVsYkljb24iLCJET1dOTE9BRF9aSVBfVVJMIiwiRkVBVFVSRV9USUxFX0JBU0VfVVJMIiwiRkVBVFVSRV9USUxFX1BBVEgiLCJYWVpfU1VGRklYIiwiZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lIiwidGlsZXNldE5hbWUiLCJGRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTCIsIkZFQVRVUkVfVElMRV9MT1dfWk9PTV9VUkwiLCJQRVJGT1JNQU5DRV9NQVJLRVJfTUFQX0lETEUiLCJTQ09SRV9QUk9QRVJUWV9ISUdIIiwiU0NPUkVfUFJPUEVSVFlfTE9XIiwiR0VPSURfUFJPUEVSVFkiLCJISUdIX1NDT1JFX1NPVVJDRV9OQU1FIiwiSElHSF9TQ09SRV9MQVlFUl9OQU1FIiwiTE9XX1NDT1JFX1NPVVJDRV9OQU1FIiwiTE9XX1NDT1JFX0xBWUVSX05BTUUiLCJTRUxFQ1RFRF9QUk9QRVJUWSIsIkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0hJR0hMSUdIVF9MQVlFUl9OQU1FIiwiQkxPQ0tfR1JPVVBfQk9VTkRBUllfTEFZRVJfTkFNRSIsIlBPVkVSVFlfUFJPUEVSVFlfUEVSQ0VOVElMRSIsIkhPVVNJTkdfQlVSREVOX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJMSU5HVUlTVElDX0lTT0xBVElPTl9QUk9QRVJUWV9QRVJDRU5USUxFIiwiVU5FTVBMT1lNRU5UX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJUT1RBTF9QT1BVTEFUSU9OIiwiRURVQ0FUSU9OX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJDT1VOVFlfTkFNRSIsIlNUQVRFX05BTUUiLCJTQ09SRV9TT1VSQ0VfTEFZRVIiLCJHTE9CQUxfTUlOX1pPT00iLCJHTE9CQUxfTUFYX1pPT00iLCJHTE9CQUxfTUlOX1pPT01fTE9XIiwiR0xPQkFMX01BWF9aT09NX0xPVyIsIkdMT0JBTF9NSU5fWk9PTV9ISUdITElHSFQiLCJHTE9CQUxfTUFYX1pPT01fSElHSExJR0hUIiwiR0xPQkFMX01JTl9aT09NX0hJR0giLCJHTE9CQUxfTUFYX1pPT01fSElHSCIsIkdMT0JBTF9NQVhfQk9VTkRTIiwiTE9XRVJfNDhfQk9VTkRTIiwiQUxBU0tBX0JPVU5EUyIsIkhBV0FJSV9CT1VORFMiLCJQVUVSVE9fUklDT19CT1VORFMiLCJHVUFNX0JPVU5EUyIsIk1BUklBTkFfSVNMQU5EX0JPVU5EUyIsIkFNRVJJQ0FOX1NBTU9BX0JPVU5EUyIsIkRFRkFVTFRfQ0VOVEVSIiwiREVGQVVMVF9MQVlFUl9PUEFDSVRZIiwiREVGQVVMVF9PVVRMSU5FX0NPTE9SIiwiTUlOX0NPTE9SIiwiTUVEX0NPTE9SIiwiTUFYX0NPTE9SIiwiQk9SREVSX0hJR0hMSUdIVF9DT0xPUiIsIkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX09QQUNJVFkiLCJISUdITElHSFRfQk9SREVSX1dJRFRIIiwiQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfV0lEVEgiLCJTQ09SRV9CT1VOREFSWV9MT1ciLCJTQ09SRV9CT1VOREFSWV9USFJFU0hPTEQiLCJTQ09SRV9CT1VOREFSWV9QUklPUklUSVpFRCIsIkVYUExPUkVfVE9PTF9QQUdFX1RFWFQiLCJQUklPUklUWV9MQUJFTCIsIlRIUkVTSE9MRF9MQUJFTCIsIkxFR0VORF9MQUJFTCIsImlzTW9iaWxlIiwiaXNNb2JpbGVSZWFjdERldmljZURldGVjdCIsInJlYWRhYmxlUGVyY2VudCIsInBlcmNlbnQiLCJ0b0ZpeGVkIiwiZ2V0Q2F0ZWdvcml6YXRpb24iLCJwZXJjZW50aWxlIiwiY2F0ZWdvcml6YXRpb24iLCJjYXRlZ29yeUNpcmNsZVN0eWxlIiwiY29uc3RhbnRzIiwiQXJlYURldGFpbCIsInByb3BlcnRpZXMiLCJjdW11bGF0aXZlSW5kZXhTY29yZSIsImNlbnN1c0Jsb2NrR3JvdXAiLCJjb3VudHkiLCJzdGF0ZSIsInBvcHVsYXRpb24iLCJpbmRpY2F0b3JDb2x1bW5IZWFkZXIiLCJwZXJjZW50aWxlQ29sdW1uSGVhZGVyIiwicG92ZXJ0eSIsImVkdWNhdGlvbiIsImxpbmd1aXN0aWNJc29sYXRpb24iLCJ1bmVtcGxveW1lbnQiLCJob3VzZUJ1cmRlbiIsInNjb3JlIiwiYmxvY2tHcm91cCIsImNvdW50eU5hbWUiLCJzdGF0ZU5hbWUiLCJwb3ZlcnR5SW5mbyIsImxhYmVsIiwidmFsdWUiLCJlZHVJbmZvIiwibGluSXNvSW5mbyIsInVtZW1wbG95SW5mbyIsImluZGljYXRvcnMiLCJ0b0xvY2FsZVN0cmluZyIsImluZGljYXRvciIsImluZGV4IiwiTWFwSW5mb1BhbmVsIiwiY2xhc3NOYW1lIiwiZmVhdHVyZVByb3BlcnRpZXMiLCJzZWxlY3RlZEZlYXR1cmVJZCIsImhleFRvSFNMQSIsImhleCIsImFscGhhIiwiY2hyb21hIiwiY3NzIiwibWFrZVBhaW50IiwiZmllbGQiLCJtaW5SYW1wIiwibWVkUmFtcCIsIm1heFJhbXAiLCJwYWludERlc2NyaXB0b3IiLCJpbWFnZVN1ZmZpeCIsIm1ha2VNYXBTdHlsZSIsImZsYWdDb250YWluZXIiLCJKNDBNYXAiLCJsb2NhdGlvbiIsImhhc2giLCJzbGljZSIsInNwbGl0Iiwiem9vbSIsImxhdCIsImxuZyIsInVzZVN0YXRlIiwibGF0aXR1ZGUiLCJwYXJzZUZsb2F0IiwibG9uZ2l0dWRlIiwidmlld3BvcnQiLCJzZXRWaWV3cG9ydCIsInNlbGVjdGVkRmVhdHVyZSIsInNldFNlbGVjdGVkRmVhdHVyZSIsImRldGFpbFZpZXdEYXRhIiwic2V0RGV0YWlsVmlld0RhdGEiLCJ0cmFuc2l0aW9uSW5Qcm9ncmVzcyIsInNldFRyYW5zaXRpb25JblByb2dyZXNzIiwiZ2VvbG9jYXRpb25JblByb2dyZXNzIiwic2V0R2VvbG9jYXRpb25JblByb2dyZXNzIiwiaXNNb2JpbGVNYXBTdGF0ZSIsInNldElzTW9iaWxlTWFwU3RhdGUiLCJtYXBSZWYiLCJ1c2VSZWYiLCJmbGFncyIsInVzZUZsYWdzIiwiZmlsdGVyIiwidXNlTWVtbyIsImV2ZW50IiwiZmVhdHVyZSIsImZlYXR1cmVzIiwiYmJveCIsIm1pbkxuZyIsIm1pbkxhdCIsIm1heExuZyIsIm1heExhdCIsIm5ld1ZpZXdQb3J0IiwiV2ViTWVyY2F0b3JWaWV3cG9ydCIsImhlaWdodCIsIndpZHRoIiwiZml0Qm91bmRzIiwicGFkZGluZyIsInVuZGVmaW5lZCIsInBvcHVwSW5mbyIsImdvVG9QbGFjZSIsIm9uTG9hZCIsIndpbmRvdyIsIkN5cHJlc3MiLCJjdXJyZW50IiwidW5kZXJseWluZ01hcCIsImdldE1hcCIsImJvdW5kcyIsIm9mZnNldCIsInRyYW5zaXRpb25EdXJhdGlvbiIsInRyYW5zaXRpb25JbnRlcnBvbGF0b3IiLCJGbHlUb0ludGVycG9sYXRvciIsInRyYW5zaXRpb25FYXNpbmciLCJkMyIsInN0b3BQcm9wYWdhdGlvbiIsImJ1dHRvbklEIiwidGFyZ2V0Iiwib25UcmFuc2l0aW9uU3RhcnQiLCJvblRyYW5zaXRpb25FbmQiLCJvbkdlb2xvY2F0ZSIsIm9uQ2xpY2tHZW9sb2NhdGUiLCJlbmFibGVIaWdoQWNjdXJhY3kiLCJNYXBXcmFwcGVyIiwiZG93bmxvYWRMaW5rVGV4dCIsImRvd25sb2FkQ29udGVudHMiLCJNYXBMZWdlbmQiLCJJY29uV3JhcHBlciIsIlJlYWN0IiwicmVmIiwiY2hpbGRyZW4iLCJ0b29sdGlwUHJvcHMiLCJkaXNwbGF5TmFtZSIsImluZm9JY29uIiwiQ0VKU1RQYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Rjs7QUNFUCxHQUFNQSxjQUFhLENBQUcsUUFBaEJBLGNBQWdCLEVBQU0sQ0FDMUIsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUNBLEdBQU1DLFNBQVEsQ0FBR0MsOEJBQWMsQ0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPLFNBQVMsUUFBRztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsT0FBTztBQUNwQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxRQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPLFNBQVMsZ0JBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLE9BQWdCLHFFQUFxRSxPQUFnQixxRUFBcUUsT0FBZ0IscUVBQXFFLE9BQWdCLHFFQUFxRSxPQUFnQixxRUFBcUUsT0FBZ0IscUVBQXFFLE9BQWdCLHFFQUFxRSxPQUFnQixxRUFBcUUsT0FBZ0IscUVBQXFFLE9BQWdCLHVFQUF1RSxPQUFnQix5RUFBeUUsT0FBZ0IseUVBQXlFLE9BQWdCLHlFQUF5RSxPQUFnQix5RUFBeUUsT0FBZ0IseUVBQXlFLE9BQWdCO0FBQy96QztBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU8sSUFBSSxRQUFHLEdBQUcsNkRBQVE7QUFDekI7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTyxJQUFJLFFBQUcsR0FBRyw2REFBUSxHOztBQ3R4RGlCO0FBQ0Y7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsV0FBTTtBQUN0QixnQkFBZ0IsVUFBbUI7O0FBRW5DLE1BQU0sVUFBbUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsVUFBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxlQUFVO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFNBQUk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxRQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsUUFBRztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxhQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsU0FBSTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsVUFBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFFBQUc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxRQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxVQUFLO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsVUFBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxnQkFBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPLFNBQVMsYUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPLFNBQVMsb0JBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLE9BQU87QUFDcEI7O0FBRU8sU0FBUyxrQkFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsWUFBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsY0FBUztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsT0FBTztBQUNwQjs7QUFFTyxTQUFTLFFBQUc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsVUFBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFNBQUk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxXQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGtCQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLE9BQU87QUFDcEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxTQUFJO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsT0FBTztBQUNwQjs7QUFFTyxTQUFTLFFBQUc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPLFNBQVMsZ0JBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPLElBQUksUUFBRyxHQUFHLDJEQUFNO0FBQ3ZCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU8sSUFBSSxRQUFHLEdBQUcsYUFBUTtBQUN6QjtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPLElBQUksUUFBRyxHQUFHLDZEQUFRO0FBQ3pCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU8sSUFBSSxRQUFHLEdBQUcsMkRBQU07QUFDdkI7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTyxJQUFJLFNBQUksR0FBRyw2REFBUTtBQUMxQjtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPLElBQUksWUFBTyxHQUFHLG9FQUFlO0FBQ3BDO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU8sSUFBSSxXQUFNLEdBQUcsa0VBQWE7QUFDakM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7O0FBRU8sSUFBSSxZQUFPO0FBQ2xCLFlBQVksV0FBTTtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQyxHOztBQ2huQnlDO0FBQ0Y7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsV0FBTTtBQUN0QixnQkFBZ0IsVUFBbUI7O0FBRW5DLE1BQU0sVUFBbUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxVQUFLO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLE9BQU87QUFDcEI7O0FBRU8sU0FBUyxXQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxlQUFVO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsU0FBSTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFFBQUc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFFBQUc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFdBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsU0FBSTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxVQUFLO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxRQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxRQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFVBQUs7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFVBQUs7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxnQkFBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLE9BQU87QUFDcEI7O0FBRU8sU0FBUyxhQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsT0FBTztBQUNwQjs7QUFFTyxTQUFTLG9CQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPLFNBQVMsa0JBQWE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxZQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPLFNBQVMsUUFBRztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsVUFBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFNBQUk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxXQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsa0JBQWE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxrQkFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU8sU0FBUyxrQkFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFlBQU87QUFDdkI7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFlBQU87QUFDdkI7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFlBQU87QUFDdkI7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQSxjQUFjOztBQUVkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLE9BQU87QUFDcEI7O0FBRU8sU0FBUyxVQUFLO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFHO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPLFNBQVMsU0FBSTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsT0FBTztBQUNwQjs7QUFFTyxTQUFTLFFBQUc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPLFNBQVMsZ0JBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPLFNBQVMsV0FBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTyxJQUFJLFFBQUcsR0FBRyw2REFBUTtBQUN6QjtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPLElBQUksUUFBRyxHQUFHLGFBQVE7QUFDekI7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTyxJQUFJLFFBQUcsR0FBRywyREFBTTtBQUN2QjtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPLElBQUksU0FBSSxHQUFHLDZEQUFRO0FBQzFCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU8sSUFBSSxZQUFPLEdBQUcsb0VBQWU7QUFDcEM7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTyxJQUFJLFFBQUcsR0FBRywyREFBTTtBQUN2QjtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPLElBQUksV0FBTSxHQUFHLGtFQUFhO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBOztBQUVPLElBQUksWUFBTztBQUNsQixZQUFZLFdBQU07QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDLEc7O0FDbnhCYyxTQUFTLGFBQU07QUFDOUI7QUFDQTtBQUNBO0FBQ0EsQzs7QUNKMEk7QUFDekU7QUFDMUI7QUFDQTtBQUNBO0FBQ1Q7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNQO0FBQ0E7QUFDTztBQUNQLFNBQVMsSUFBSTtBQUNiO0FBQ087QUFDUCxjQUFjLDJCQUFjO0FBQzVCO0FBQ0E7O0FBRUEsRUFBRSxhQUFNO0FBQ1IsRUFBRSxhQUFNO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxjQUFjLDJCQUFjO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxhQUFNO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixFQUFFLFNBQWM7QUFDaEIsRUFBRSxPQUFZO0FBQ2QsRUFBRSxPQUFZO0FBQ2Q7QUFDQSxFQUFFLFVBQVU7O0FBRVo7QUFDQSxJQUFJLFNBQWMsU0FBUyxXQUFXO0FBQ3RDOztBQUVBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixXQUFnQjtBQUN6QztBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUCxjQUFjLDJCQUFjO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsYUFBTTtBQUNSLFNBQVMsZUFBZTtBQUN4QjtBQUNPO0FBQ1A7O0FBRUEsY0FBYywyQkFBYztBQUM1QjtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxhQUFNOztBQUVSO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTs7QUFFQSxlQUFlLGVBQWU7QUFDOUIsZUFBZSxlQUFlO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUztBQUNsQixDOztBQ3ZOMEk7QUFDaEY7QUFDNUI7QUFDTTtBQUNyQixTQUFTLG9CQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLDJCQUFjO0FBQzlCLGlCQUFpQiwyQkFBYztBQUMvQjtBQUNBO0FBQ0Esa0JBQWtCLDJCQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxJQUFJLGFBQU07QUFDVjs7QUFFQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGFBQU07QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsSUFBSTtBQUNuRCxFQUFFLGFBQU07QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7QUM5RHFEO0FBQ2Q7QUFDUTtBQUMvQyxJQUFJLDZCQUFrQjtBQUNQO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCw2QkFBa0I7QUFDeEUsOENBQThDLDZCQUFrQjs7QUFFaEU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLGVBQWU7QUFDOUIsZUFBZSxlQUFlO0FBQzlCO0FBQ0E7QUFDQSxjQUFjLFNBQVM7QUFDdkIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQSxDOztBQ3hDa0o7QUFDUjtBQUNFO0FBQ047QUFDNUY7QUFDOEs7QUFDbEw7QUFDRDtBQUNFO0FBQ0E7QUFDQTs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDLGFBQWEsY0FBYztBQUMzQixLQUFLO0FBQ0wsYUFBYSxjQUFjO0FBQzNCLEtBQUs7QUFDTCxpQkFBaUIsY0FBYztBQUMvQjs7QUFFQSxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBLEtBQUs7QUFDTCxpQkFBaUIsYUFBYTtBQUM5Qjs7QUFFQTtBQUNBLE1BQU0sUUFBUSxpQkFBaUIsUUFBUTtBQUN2Qzs7QUFFQSw0QkFBNEIsbUJBQW1CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxzQkFBc0IsYUFBYTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVU7QUFDMUIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sYUFBYTtBQUNuQjtBQUNBLGNBQWMsVUFBVTtBQUN4QixNQUFNLFVBQVU7QUFDaEIsTUFBTSxTQUFjO0FBQ3BCLE1BQU0sYUFBYTtBQUNuQixxQkFBcUIsTUFBVyxDQUFDLFVBQVU7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpRkFBaUYsV0FBVyxzREFBc0QsV0FBVztBQUM3SjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0Esd0ZBQXdGO0FBQ3hGO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsYUFBYTs7QUFFL0IsbUJBQW1CLDJCQUFjO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLDJCQUFjO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGFBQWE7O0FBRS9CO0FBQ0EsbUNBQW1DLDJCQUFjO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsMkJBQTJCLGFBQWE7QUFDeEMsNEJBQTRCLDJCQUFjO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSwyQkFBMkIsYUFBYTtBQUN4Qyw0QkFBNEIsMkJBQWM7QUFDMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGFBQWE7QUFDdEMsdUJBQXVCLGFBQWE7QUFDcEMsc0JBQXNCLFFBQVEsaUJBQWlCLFdBQVc7QUFDMUQsc0JBQXNCLFFBQVE7QUFDOUIsYUFBYSxhQUFhO0FBQzFCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLG9CQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxvQ0FBa0I7QUFDeEQ7QUFDQSxPQUFPO0FBQ1Asc0NBQXNDLG9DQUFrQjtBQUN4RDtBQUNBLE9BQU87QUFDUCx1Q0FBdUMsb0NBQWtCO0FBQ3pEO0FBQ0EsT0FBTztBQUNQLHVDQUF1QyxvQ0FBa0I7QUFDekQ7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7OztBQ3BTeUQ7QUFDakI7QUFDekM7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLEdBQUc7QUFDbkI7O0FBRUE7QUFDQSxjQUFjLEdBQUc7QUFDakI7O0FBRUEseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksSUFBSTtBQUNoQix1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7QUNsRUEsd0RBQXdELGlGQUFpRixXQUFXLHdIQUF3SCxnQkFBZ0IsV0FBVyx5QkFBeUIsU0FBUyx3QkFBd0IsNEJBQTRCLGNBQWMsU0FBUyw4QkFBOEIsRUFBRSxxQkFBcUIsVUFBVSxFQUFFLFNBQVMsRUFBRSw4SkFBOEosRUFBRSxrREFBa0QsU0FBUyxrQkFBa0IsaUJBQWlCLEVBQUUsbUJBQW1CLHNCQUFzQiw4QkFBOEIsYUFBYSxFQUFFLHNCQUFzQixlQUFlLFdBQVcsRUFBRSxtQkFBbUIsTUFBTSx5REFBeUQsRUFBRSxVQUFVLHVCQUF1QixFQUFFLEVBQUUsR0FBRzs7QUFFcCtCLGlEQUFpRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNELGtIQUFrSDs7QUFFOVosc0NBQXNDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLGtCQUFrQixFQUFFLGFBQWE7O0FBRWpKO0FBQzBEO0FBQ3ZEO0FBQ3ZDLElBQUksdUJBQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsdUJBQU87QUFDbEI7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QiwrQkFBK0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQUk7QUFDNUI7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkMsdUJBQXVCLFVBQVU7QUFDakMsRUFBRSxRQUFRO0FBQ1Ysa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBLGNBQWMsV0FBVztBQUN6QixzQkFBc0IsYUFBYTtBQUNuQyxvQkFBb0IsYUFBYTtBQUNqQyxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBLFdBQVcsV0FBVzs7QUFFdEIseUJBQXlCLHVCQUFPOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOztBQzNIa0Q7QUFDdUI7QUFDckI7QUFDQTtBQUMyQjtBQUNBOzs7QUNMUjs7O0FDQXZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGFBQWEsRUFBRTtBQUNmLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLGlCQUFpQixFQUFFO0FBQ25CLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsRUFBRTtBQUNuQixpQkFBaUIsRUFBRTtBQUNuQixtQkFBbUI7QUFDbkI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixFQUFFO0FBQ25CLG1CQUFtQjtBQUNuQjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsRUFBRTtBQUNuQixtQkFBbUI7QUFDbkI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCLGlCQUFpQixFQUFFO0FBQ25CLG1CQUFtQjtBQUNuQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLGdCQUFnQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7OztBQUdBLGlIQUFpSDs7QUFFakg7QUFDQSxhQUFhLHFCQUFNLG9CQUFvQixxQkFBTTtBQUM3QyxXQUFXLHFCQUFNO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUMsR0FBRzs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7QUFHRCx1QkFBdUI7QUFDdkI7O0FBRUEsNkZBQTZGOztBQUU3RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0JBQWtCO0FBQy9CLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtCQUFrQjtBQUMvQixlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOzs7QUFHQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QixlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCOzs7QUFHQTtBQUNBLDJDQUEyQyxnQkFBZ0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RjtBQUN2Rjs7QUFFQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLFVBQVU7QUFDckIsYUFBYTtBQUNiOzs7QUFHQTtBQUNBOztBQUVBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9CQUFvQjtBQUMvQixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMseUJBQXlCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1CQUFtQjtBQUM5QjtBQUNBLGFBQWE7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsYUFBYTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQSxhQUFhLHlCQUF5QjtBQUN0QztBQUNBLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHVCQUF1QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxHQUFHOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQsc0RBQWUsS0FBSyxFOztBQ3ZsQ3BCLHVEQUF1RCxxQkFBTTtBQUM3RCxxQkFBcUIscUJBQU0sbUJBQW1CLHFCQUFNO0FBQ3BEOzs7QUNGd0U7O0FBRXhFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0EsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUyxxQ0FBMEI7QUFDbkM7O0FBRUE7QUFDQSxrQ0FBa0Msc0NBQTJCO0FBQzdEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsc0NBQTJCO0FBQ3BDO0FBQ0Esb0NBQW9DLDRCQUFpQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxzRkFBc0YsNEJBQWlCO0FBQ3ZHOztBQUVBLFNBQVMsNEJBQWlCO0FBQzFCOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLHFDQUEwQjtBQUM1Qzs7QUFFQTtBQUNBLHVCQUF1QiwrQkFBK0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQSwyREFBMkQ7QUFDM0Q7O0FBRUEsdUJBQXVCLHFDQUEwQjtBQUNqRDs7QUFFQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNILHVDQUF1QyxZQUFZO0FBQ25EO0FBQ0EsR0FBRztBQUNILEM7O0FDbEx3RTtBQUNOO0FBQ007QUFDaEM7QUFDSTtBQUNVOztBQUV0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxpQkFBZ0I7QUFDN0IsTUFBTSxpQkFBZ0I7QUFDdEIsd0JBQXdCLGlCQUFnQjtBQUN4QyxnQkFBZ0IsaUJBQWdCO0FBQ2hDLHNCQUFzQixlQUFjO0FBQ3BDLHlCQUF5QixlQUFjO0FBQ3ZDLGFBQWEsZUFBYztBQUMzQixvQkFBb0IsZUFBYztBQUNsQyxjQUFjLGlCQUFnQjtBQUM5QixZQUFZLG9CQUFtQixFQUFFLGlCQUFnQixFQUFFLGlCQUFnQjtBQUNuRSx1QkFBdUIsZUFBYztBQUNyQyxXQUFXLGVBQWM7QUFDekIsZUFBZSxlQUFjO0FBQzdCLFVBQVUsZUFBYztBQUN4QixXQUFXLGVBQWM7QUFDekIsU0FBUyxpQkFBZ0I7QUFDekIsVUFBVSxpQkFBZ0I7QUFDMUIsYUFBYSxpQkFBZ0I7QUFDN0IsYUFBYSxpQkFBZ0I7QUFDN0IsWUFBWSxpQkFBZ0I7QUFDNUIsUUFBUSxpQkFBZ0I7QUFDeEIsV0FBVyxpQkFBZ0I7QUFDM0IsU0FBUyxpQkFBZ0I7QUFDekIsWUFBWSxpQkFBZ0I7QUFDNUI7QUFDQTtBQUNBLGFBQWEsY0FBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsSUFBVyxzQkFBc0IsSUFBVztBQUM3RTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLHlCQUF3QjtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTs7QUFFbkIsSUFBSSxlQUFlOztBQUVuQixJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixjQUFjO0FBQ3pDO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixjQUFjO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBEQUEwRDs7QUFFMUQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDOztBQUVoQyw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7QUFDakM7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixTQUFRO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsdUJBQXNCO0FBQ2hEO0FBQ0E7QUFDQSxRQUFRLDBCQUF5QjtBQUNqQzs7QUFFQTtBQUNBLHFCQUFxQix1QkFBc0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsVUFBVSwwQkFBeUI7QUFDbkM7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQsZUFBZTs7QUFFZixlQUFlOztBQUVmLGVBQWU7O0FBRWYsZUFBZTs7Ozs7Ozs7O0FDN2FmLElBQUksa0JBQU87O0FBRVg7QUFDQTtBQUNBOztBQUVPLFNBQVMsaUJBQU07QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixjQUFjO0FBQ2pDLFdBQVcsaUJBQU07QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNEJBQTRCLGtCQUFPO0FBQ25DO0FBQ087QUFDUDtBQUNBO0FBQ08sU0FBUyxxQkFBSTtBQUNwQjtBQUNBO0FBQ0EsYUFBYSxxQkFBSTtBQUNqQixLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDOztBQ3RDZSxTQUFTLG1CQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEM7O0FDSndFO0FBQ0Y7QUFDRTtBQUNOOztBQUVsRSxTQUFTLGlCQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLHNCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLGlCQUFPO0FBQ2IsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsTUFBTSxpQkFBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFd0Y7QUFDbkQ7QUFDUDtBQUN2QjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CLElBQUksbUJBQU07QUFDVixJQUFJLG1CQUFNO0FBQ1YsSUFBSSxtQkFBTTtBQUNWLElBQUksbUJBQU07QUFDVixJQUFJLG1CQUFNO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLG1DQUFtQywyQkFBYztBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHdEQUF3RCxzQkFBYSxDQUFDLHNCQUFhLEdBQUcsbURBQW1EO0FBQ3pJO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxtQkFBTTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLG1CQUFNOztBQUVaO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVAsK0JBQStCLG1CQUFtQixpQkFBaUI7QUFDbkU7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxtQ0FBbUMsMkJBQWM7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixLQUFLO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixLQUFLO0FBQ3pCLDJCQUEyQixzQkFBc0I7QUFDakQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsS0FBSztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7Ozs7QUNsWTJDOztBQUU1QztBQUNBO0FBQ0E7O0FBRU87QUFDUCx3RkFBd0YsYUFBYTs7QUFFckc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7O0FDdkJ3RTtBQUNGOztBQUV0RSxTQUFTLG1CQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLHdCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLG1CQUFPO0FBQ2IsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsTUFBTSxtQkFBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFK0I7QUFDNkI7QUFDNUQsaUJBQWlCLHVCQUFhO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTTs7QUFFUDtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGtCQUFRO0FBQzFCLG1CQUFtQiwyQkFBYztBQUNqQztBQUNBOztBQUVBLGdCQUFnQixvQkFBVTtBQUMxQixVQUFVLHdCQUFhLENBQUMsd0JBQWE7QUFDckM7QUFDQSxHQUFHLGNBQWM7QUFDakI7QUFDQSxHQUFHO0FBQ0gsU0FBUyxtQkFBbUI7QUFDNUI7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxnREFBZSxVQUFVLEU7O0FDdEUwQjtBQUNuRCxnRUFBZ0UscUJBQWUsR0FBRyxlQUFTO0FBQzNGLGlFQUFlLHlCQUF5QixFOztBQ0ZqQztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQzs7QUNUc0U7QUFDRTs7QUFFeEUsU0FBUyxrQkFBTztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUyx1QkFBYTtBQUN0QixpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0EsTUFBTSxrQkFBTztBQUNiLFFBQVEsZUFBZTtBQUN2QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLE1BQU0sa0JBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRStCO0FBQ29FO0FBQ3ZDO0FBQ047QUFDaEI7QUFDRztBQUM2QjtBQUNuQjtBQUNZO0FBQ2U7QUFDdkI7QUFDdkQ7QUFDQTs7QUFFQSxTQUFTLGVBQUk7O0FBRU47QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsdUJBQWEsQ0FBQyx1QkFBYSxDQUFDLHVCQUFhLEdBQUcsOEJBQThCO0FBQ2hHO0FBQ0E7QUFDQSxHQUFHOztBQUVILGtDQUFrQyxtQkFBbUI7QUFDckQsYUFBYSxtQkFBbUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksdUJBQVksbUJBQW1CLEVBQUUsbUJBQW1CO0FBQ3hEO0FBQ0E7QUFDQSxZQUFZLGVBQUk7QUFDaEI7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxtQkFBbUI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBLEdBQUcscUJBQXFCLG1CQUFtQjtBQUMzQztBQUNBLEdBQUcsdURBQXVELG1CQUFtQjtBQUM3RTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQixvQkFBVTtBQUMxQixrQkFBa0Isa0JBQVE7QUFDMUIsbUJBQW1CLDJCQUFjO0FBQ2pDO0FBQ0E7O0FBRUEsbUJBQW1CLGtCQUFRO0FBQzNCO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsbUJBQW1CLDJCQUFjO0FBQ2pDO0FBQ0E7O0FBRUEsa0JBQWtCLGdCQUFNO0FBQ3hCLGtCQUFrQixnQkFBTTtBQUN4QixxQkFBcUIsZ0JBQU07QUFDM0IsbUJBQW1CLGdCQUFNO0FBQ3pCLGdCQUFnQixvQkFBVSxDQUFDLFdBQVU7QUFDckMsRUFBRSw0QkFBeUI7QUFDM0I7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixNQUFNLENBQUMsdUJBQWEsQ0FBQyx1QkFBYSxDQUFDLHVCQUFhLEdBQUcsbUJBQW1CO0FBQzNGLGdCQUFnQix1QkFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLGlCQUFjO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRSw0QkFBeUI7QUFDM0I7QUFDQSxpQ0FBaUMsdUJBQWEsQ0FBQyx1QkFBYSxHQUFHO0FBQy9EO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSw2QkFBbUI7QUFDckI7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLHFCQUFXO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCx3QkFBd0IsbUJBQW1CLENBQUMsa0JBQWtCO0FBQzlELFdBQVcsdUJBQWEsQ0FBQyx1QkFBYSxHQUFHLGNBQWM7QUFDdkQsZ0RBQWdELHVCQUFhO0FBQzdEO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHLEVBQUUsbUJBQW1CO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSCxpQ0FBaUMsMEJBQTBCO0FBQzNELGlDQUFpQztBQUNqQztBQUNBLEdBQUc7QUFDSCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUUsbUJBQW1CO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxnRUFBZ0UsbUJBQW1CO0FBQ3RGLENBQUM7O0FBRUQ7QUFDQSxTQUFTLHVCQUFRLElBQUksK0JBQWtCO0FBQ3ZDOztBQUVBLHlCQUF5Qix1QkFBWTtBQUNyQywrQ0FBZSxTQUFTLEU7O0FDdFBnRDtBQUNOO0FBQ007O0FBRXhFLFNBQVMsaURBQTBCO0FBQ25DOztBQUVBO0FBQ0Esa0NBQWtDLGtEQUEyQjtBQUM3RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLGtEQUEyQjtBQUNwQztBQUNBLG9DQUFvQyx3Q0FBaUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLHdDQUFpQjtBQUN2Rzs7QUFFQSxTQUFTLHdDQUFpQjtBQUMxQjs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRXVDO0FBQ1I7O0FBRS9CO0FBQ0E7QUFDQSxJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTtBQUNuQjs7QUFFQSxFQUFFLFlBQVk7QUFDZDtBQUNBO0FBQ0Esc0JBQXNCLGlEQUEwQjtBQUNoRDs7QUFFQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQ7O0FBRUEsZUFBZSxpQkFBTTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNLG1CQUFNO0FBQ1o7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7OztBQ3JJYztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7QUNOaUQ7QUFDbEM7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGtCQUFrQixpQ0FBYztBQUNoQyxDOzs7O0FDZG9EO0FBQ1c7QUFDaEQ7QUFDZixlQUFlLGNBQU87QUFDdEI7QUFDQTs7QUFFQSxTQUFTLHNCQUFxQjtBQUM5QixDOztBQ1JlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxvQkFBRztBQUNuQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQzs7QUN0QndFO0FBQ047QUFDb0I7QUFDMUI7QUFDa0M7QUFDdEI7QUFDQTs7QUFFeEUsU0FBUyxzREFBMEI7QUFDbkM7O0FBRUE7QUFDQSxrQ0FBa0MsdURBQTJCO0FBQzdEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsdURBQTJCO0FBQ3BDO0FBQ0Esb0NBQW9DLDZDQUFpQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxzRkFBc0YsNkNBQWlCO0FBQ3ZHOztBQUVBLFNBQVMsNkNBQWlCO0FBQzFCOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7O0FBRUE7QUFDQSxzQkFBc0IsZUFBZTs7QUFFckM7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxXQUFXLDBCQUEwQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFK0I7QUFDZ0M7QUFDYTtBQUNKO0FBQ25DO0FBQ3JDLElBQUksc0RBQXlCO0FBQzdCO0FBQ0E7QUFDQSxJQUFJLHlDQUFZO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsU0FBUzs7QUFFWDs7QUFFQTtBQUNBOztBQUVBOztBQUVBLElBQUksZUFBZTs7QUFFbkI7O0FBRUEsSUFBSSxlQUFlLENBQUMsc0JBQXNCLHNCQUFzQixzREFBeUI7O0FBRXpGLGtDQUFrQyxFQUFFLHlDQUFZO0FBQ2hEO0FBQ0E7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLHNEQUEwQjtBQUNoRDs7QUFFQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtQkFBTSxDQUFDLE9BQU8sZ0JBQWdCLE9BQU87QUFDL0M7QUFDQSxrQ0FBa0MseUJBQXlCO0FBQzNEO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsdUJBQXVCLHNEQUEwQjtBQUNqRDs7QUFFQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxtQ0FBbUMseUJBQXlCO0FBQzVEO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EscUJBQXFCLGFBQWE7O0FBRWxDLHVCQUF1QixzREFBMEI7QUFDakQ7O0FBRUE7QUFDQSw0QkFBNEIsaUNBQWlDO0FBQzdEO0FBQ0EsMEJBQTBCLHFCQUFJO0FBQzlCO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsZ0JBQWdCO0FBQzdDOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQyxDQUFDLHNCQUFzQjs7OztBQ3pPOEM7QUFDRTtBQUNOO0FBQ047QUFDa0M7QUFDdEI7O0FBRXhFLFNBQVMsNkNBQTBCO0FBQ25DOztBQUVBO0FBQ0Esa0NBQWtDLDhDQUEyQjtBQUM3RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLDhDQUEyQjtBQUNwQztBQUNBLG9DQUFvQyxvQ0FBaUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLG9DQUFpQjtBQUN2Rzs7QUFFQSxTQUFTLG9DQUFpQjtBQUMxQjs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUywrQkFBWTtBQUNyQixrQ0FBa0MsNENBQXlCOztBQUUzRDtBQUNBLGdCQUFnQixlQUFlO0FBQy9COztBQUVBO0FBQ0Esc0JBQXNCLGVBQWU7O0FBRXJDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsV0FBVywwQkFBMEI7QUFDckM7QUFDQTs7QUFFQSxTQUFTLDRDQUF5QjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUU0RDtBQUM3QjtBQUNnQztBQUNTO0FBQ25DO0FBQ3JDLElBQUksNkNBQXlCOztBQUU3QjtBQUNBLEVBQUUsU0FBUzs7QUFFWCxlQUFlLCtCQUFZOztBQUUzQjtBQUNBOztBQUVBOztBQUVBLElBQUksZUFBZTs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEMsNkNBQXlCOztBQUV2RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxFQUFFLFlBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLG1CQUFtQjtBQUNsRDtBQUNBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQSxTQUFTO0FBQ1Q7O0FBRUEsc0JBQXNCLDZDQUEwQjtBQUNoRDs7QUFFQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtQkFBTSxDQUFDLE9BQU8sZ0JBQWdCLE9BQU87QUFDL0M7QUFDQSxrQ0FBa0MseUJBQXlCO0FBQzNEO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLDZDQUEwQjtBQUNqRDs7QUFFQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQSwwQkFBMEIscUJBQUk7QUFDOUI7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxtQkFBbUIsaUJBQWlCO0FBQzVFO0FBQ0EsZUFBZSxxQkFBSTtBQUNuQixTQUFTO0FBQ1QscUNBQXFDLDJCQUFjO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQyxDQUFDLHNCQUFzQjs7OztBQ2xPc0Q7QUFDUTs7O0FDRGQ7QUFDTjtBQUNNO0FBQzFDO0FBQ29CO0FBQ2Y7O0FBRW5DLElBQUksdUJBQUk7O0FBRUQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsOEJBQThCLGtCQUFrQjtBQUNoRDtBQUNBLHFCQUFxQix1QkFBSTtBQUN6Qix5QkFBeUIsdUJBQUk7QUFDN0IsbUJBQW1CLHVCQUFJO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTs7QUFFbkIsSUFBSSxlQUFlO0FBQ25COztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLHFEQUFxRCx1QkFBSTtBQUN6RCwrQ0FBK0MsdUJBQUk7QUFDbkQ7QUFDQTs7QUFFQSxFQUFFLFlBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUM7QUFDekMsdUNBQXVDOztBQUV2QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsTUFBTSxtQkFBTTs7QUFFWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIsUUFBUSxpQkFBaUI7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVELGVBQWU7Ozs7Ozs7QUMzT2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDOztBQy9EZ0M7QUFDaUQ7QUFDakYsd0JBQXdCLENBQUMsb0NBQTBCO0FBQ25ELGlCQUFpQixDQUFDLDZCQUFtQjtBQUM5QixjQUFjLDBCQUFnQjtBQUNyQyxtREFBZSxrQkFBUSxFOztBQ0xhO0FBQzdCLGtCQUFrQixjQUFNLEtBQUssa0JBQVU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUkscUJBQWE7QUFDbEI7QUFDQSxDQUFDLElBQUksb0JBQVk7QUFDakI7QUFDQSxDQUFDLElBQUksb0JBQVk7QUFDakI7QUFDQSxDQUFDLElBQUksa0JBQVU7QUFDZjtBQUNBO0FBQ0EsQ0FBQyxJQUFJLG9CQUFZO0FBQ2pCO0FBQ0EsQ0FBQyxJQUFJLGtCQUFVO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxJQUFJLGtCQUFVO0FBQ2Y7QUFDQTtBQUNBLENBQUMsSUFBSSxrQkFBVTtBQUNmO0FBQ0EsQ0FBQztBQUNNO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEU7O0FDekdPO0FBQ1AsSUFBSSxlQUFPLDRDQUE0QyxxQkFBTTtBQUM3RCxJQUFJLGVBQU8sVUFBVSxxQkFBTSxtQkFBbUIscUJBQU07QUFDcEQsSUFBSSxpQkFBUztBQUMwRDtBQUN2RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFLGVBQU87QUFDVCxFQUFFLGVBQU87QUFDVCxDQUFDOzs7O0FDakIySTtBQUNOO0FBQ3JGO0FBQ3NCO0FBQ3ZFLGNBQWMsaUJBQWlCO0FBQy9CLG1CQUFtQiw4QkFBOEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLElBQUksZUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGdCQUFnQjtBQUNoRjtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsVUFBVSwwQkFBaUI7QUFDM0IsMkNBQTJDLDBDQUFpQztBQUM1RSxtQkFBbUIsZ0NBQXVCO0FBQzFDOztBQUVBLGdDQUFnQyx5Q0FBZ0M7QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7OztBQ2xHMkk7QUFDTjtBQUNyRjtBQUNqRCxtQkFBbUIsOEJBQThCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxFQUFFLFlBQVk7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7Ozs7QUN2SjJJO0FBQ047QUFDckY7QUFDakQsaUJBQWlCLDRCQUE0QjtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOzs7O0FDakYySTtBQUNOO0FBQ3RJLElBQUksNEJBQVU7O0FBRWQ7QUFDQTtBQUNBOztBQUVBLElBQUksZUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLEVBQUUsWUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx3QkFBd0IsNEJBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLDRCQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7OztBQ3BERDtBQUNBO0FBQ0E7QUFDQSxJQUFJLHdCQUFZO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxrQkFBa0Isd0JBQVk7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7QUM3RTRJO0FBQ047QUFDdEU7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUksZUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsWUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVDQUF1QyxRQUFRO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsNkJBQTZCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixTQUFTLFlBQVksU0FBUyxpQkFBaUI7QUFDNUU7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOzs7O0FDckx5STtBQUNFO0FBQ047O0FBRXRJLFNBQVMsdUNBQTBCLHFCQUFxQixpRkFBaUYsV0FBVywrQkFBK0Isd0NBQTJCLDhEQUE4RCxnQkFBZ0IsV0FBVyx5QkFBeUIsU0FBUyx3QkFBd0IsNEJBQTRCLGNBQWMsU0FBUyw4QkFBOEIsRUFBRSxxQkFBcUIsVUFBVSxFQUFFLFNBQVMsRUFBRSw4SkFBOEosRUFBRSxrREFBa0QsU0FBUyxrQkFBa0IsaUJBQWlCLEVBQUUsbUJBQW1CLHNCQUFzQiw4QkFBOEIsYUFBYSxFQUFFLHNCQUFzQixlQUFlLFdBQVcsRUFBRSxtQkFBbUIsTUFBTSx5REFBeUQsRUFBRSxVQUFVLHVCQUF1QixFQUFFLEVBQUUsR0FBRzs7QUFFcCtCLFNBQVMsd0NBQTJCLGFBQWEsZ0JBQWdCLG1DQUFtQyw4QkFBaUIsWUFBWSx3REFBd0QsNkRBQTZELHNEQUFzRCxxRkFBcUYsOEJBQWlCLFlBQVk7O0FBRTlaLFNBQVMsOEJBQWlCLFlBQVksdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sa0JBQWtCLEVBQUUsYUFBYTs7QUFFNUk7QUFDSztBQUNGO0FBQ0Y7QUFDZ0I7QUFDTDtBQUMyRztBQUNoSyxJQUFJLDZCQUFlO0FBQ25CO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLGVBQWU7O0FBRW5CLG1DQUFtQyxFQUFFLDZCQUFlO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsV0FBVztBQUN2RCxPQUFPOztBQUVQO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3Qzs7QUFFQTtBQUNBLFlBQVkseUJBQXlCO0FBQ3JDO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixVQUFVO0FBQ3RDO0FBQ0EsT0FBTztBQUNQLDJCQUEyQixTQUFTO0FBQ3BDO0FBQ0EsT0FBTztBQUNQLDBCQUEwQixRQUFRO0FBQ2xDO0FBQ0E7QUFDQSxPQUFPO0FBQ1Asa0NBQWtDLGdCQUFnQjtBQUNsRDtBQUNBLE9BQU87O0FBRVAsc0JBQXNCLHVDQUEwQjtBQUNoRDs7QUFFQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQsNEJBQTRCLDJCQUFjO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGtDQUFrQyx1QkFBdUI7O0FBRXpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7O0FBRUE7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBLHdDQUF3QyxvQkFBb0I7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLHFCQUFxQjtBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHlCQUF5Qix1Q0FBMEI7QUFDbkQ7O0FBRUE7QUFDQSw4QkFBOEIsaUNBQWlDO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7Ozs7OztBQ3pTdUU7QUFDTjtBQUNNOztBQUV4RSxTQUFTLHNCQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLDJCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLHNCQUFPO0FBQ2IsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsTUFBTSxzQkFBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFbUM7QUFDZTtBQUMwQjtBQUM1RTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCw4QkFBOEIsa0JBQWtCO0FBQ2hELDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxlQUFlOztBQUVuQixJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTs7QUFFbkIsSUFBSSxlQUFlOztBQUVuQixJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTs7QUFFbkIsSUFBSSxlQUFlOztBQUVuQixJQUFJLGVBQWU7O0FBRW5CLElBQUksZUFBZTs7QUFFbkIsSUFBSSxlQUFlO0FBQ25CO0FBQ0EsS0FBSzs7QUFFTCxJQUFJLGVBQWUsb0JBQW9COztBQUV2QyxJQUFJLGVBQWU7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxJQUFJLGVBQWU7QUFDbkI7QUFDQSxLQUFLOztBQUVMO0FBQ0Esa0NBQWtDLGlCQUFpQjtBQUNuRDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBLEVBQUUsWUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsaURBQWlELFFBQVE7O0FBRXpELHdCQUF3QiwyQkFBYSxDQUFDLDJCQUFhLEdBQUc7O0FBRXREO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGlCQUFpQixRQUFRLENBQUMsMkJBQWEsQ0FBQywyQkFBYSxDQUFDLDJCQUFhLEdBQUc7QUFDdEU7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUTtBQUN4Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsa0RBQWtELDJCQUFhLENBQUMsMkJBQWEsR0FBRyw4QkFBOEI7QUFDOUc7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsa0RBQWtELDJCQUFhLENBQUMsMkJBQWEsR0FBRyw4QkFBOEI7QUFDOUc7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdUNBQXVDLDJCQUFhLENBQUMsMkJBQWEsR0FBRyw4QkFBOEI7QUFDbkcsb0NBQW9DLGtCQUFrQjtBQUN0RDtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsNENBQTRDLDJCQUFhLENBQUMsMkJBQWEsR0FBRyw4QkFBOEI7QUFDeEcsd0NBQXdDLGtCQUFrQjtBQUMxRDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7O0FBRVgsNkNBQTZDLDJCQUFhLENBQUMsMkJBQWEsR0FBRyw4QkFBOEI7QUFDekc7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHVEQUF1RDtBQUN2RCxvQ0FBb0Msa0JBQWtCO0FBQ3REO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOzs7O0FDL3ZCeUQ7QUFDb0I7QUFDTjs7QUFFeEUsU0FBUyx1QkFBTztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUyw0QkFBYTtBQUN0QixpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0EsTUFBTSx1QkFBTztBQUNiLFFBQVEsZUFBZTtBQUN2QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLE1BQU0sdUJBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRStCO0FBQ2lFO0FBQ3hEO0FBQ2M7QUFDSDtBQUNTO0FBQ0c7QUFDckI7QUFDVTtBQUMwQjtBQUN2QjtBQUN2RCxJQUFJLHlCQUFTLG1CQUFtQixFQUFFLG9CQUFtQjtBQUNyRCxXQUFXLGlCQUFnQjtBQUMzQixXQUFXLGlCQUFnQjtBQUMzQixZQUFZLGlCQUFnQjtBQUM1QixZQUFZLGlCQUFnQjtBQUM1QixxQkFBcUIsZUFBYztBQUNuQyxvQkFBb0IsZUFBYztBQUNsQyw0QkFBNEIsZUFBYztBQUMxQyxzQkFBc0Isb0JBQW1CLEVBQUUsaUJBQWdCLEVBQUUsaUJBQWdCO0FBQzdFLDBCQUEwQixpQkFBZ0I7QUFDMUMsMEJBQTBCLGlCQUFnQjtBQUMxQyxvQkFBb0IsZUFBYztBQUNsQyxxQkFBcUIsZUFBYztBQUNuQyx5QkFBeUIsZUFBYztBQUN2QyxtQkFBbUIsZUFBYztBQUNqQyxjQUFjLG9CQUFtQixFQUFFLGVBQWMsRUFBRSxpQkFBZ0I7QUFDbkUsV0FBVyxvQkFBbUIsRUFBRSxlQUFjLEVBQUUsaUJBQWdCO0FBQ2hFLGNBQWMsb0JBQW1CLEVBQUUsZUFBYyxFQUFFLGlCQUFnQjtBQUNuRSxtQkFBbUIsZUFBYztBQUNqQyxhQUFhLG9CQUFtQixFQUFFLGVBQWMsRUFBRSxpQkFBZ0I7QUFDbEUsZUFBZSxvQkFBbUIsRUFBRSxlQUFjLEVBQUUsaUJBQWdCO0FBQ3BFLFlBQVksb0JBQW1CLEVBQUUsZUFBYyxFQUFFLGlCQUFnQjtBQUNqRSxXQUFXLGVBQWM7QUFDekIsV0FBVyxlQUFjO0FBQ3pCLGNBQWMsZUFBYztBQUM1QixpQkFBaUIsZUFBYztBQUMvQixlQUFlLGVBQWM7QUFDN0IsZUFBZSxlQUFjO0FBQzdCLGFBQWEsZUFBYztBQUMzQixnQkFBZ0IsZUFBYztBQUM5QixlQUFlLGVBQWM7QUFDN0IsY0FBYyxlQUFjO0FBQzVCLGdCQUFnQixlQUFjO0FBQzlCLGdCQUFnQixlQUFjO0FBQzlCLGNBQWMsZUFBYztBQUM1QixXQUFXLGVBQWM7QUFDekIsZUFBZSxpQkFBZ0I7QUFDL0IsMEJBQTBCLGlCQUFnQjtBQUMxQyxlQUFlLGlCQUFnQjtBQUMvQix1QkFBdUIsZ0JBQWU7QUFDdEMsYUFBYSxlQUFjO0FBQzNCLGNBQWMscUJBQW9CLENBQUMsYUFBYTtBQUNoRCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSw0QkFBWSxtQkFBbUIsRUFBRSx1QkFBc0IsRUFBRSxhQUFhLEVBQUUsOEJBQThCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsU0FBUyw2QkFBYTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixvQkFBVTtBQUMvQixzQkFBc0Isb0JBQVUsQ0FBQyxXQUFVO0FBQzNDLG1CQUFtQixpQkFBTztBQUMxQixtQ0FBbUMsYUFBYTtBQUNoRCxHQUFHO0FBQ0gscUJBQXFCLGlCQUFPO0FBQzVCLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCx1QkFBdUIsZ0JBQU07QUFDN0IscUJBQXFCLGdCQUFNOztBQUUzQixpQkFBaUIsZ0JBQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsNEJBQWEsQ0FBQyw0QkFBYSxHQUFHO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSw2QkFBbUI7QUFDckIsV0FBVyw2QkFBYTtBQUN4QixHQUFHO0FBQ0gsZ0JBQWdCLGlCQUFPO0FBQ3ZCLFdBQVcsNEJBQWEsQ0FBQyw0QkFBYSxHQUFHLG9CQUFvQjtBQUM3RDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLCtDQUErQyxXQUFXO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qiw0QkFBYSxDQUFDLDRCQUFhLENBQUMsNEJBQWEsR0FBRyw4Q0FBOEM7QUFDdEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBLEVBQUUsbUJBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFLDRCQUF5QjtBQUMzQjtBQUNBLHlDQUF5QyxvQ0FBa0I7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUJBQU87QUFDaEMsV0FBVyw0QkFBYSxDQUFDLDRCQUFhO0FBQ3RDO0FBQ0EsS0FBSyxZQUFZO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0EscUJBQXFCLG1CQUFtQixDQUFDLGtCQUFrQjtBQUMzRDtBQUNBLEtBQUssRUFBRSxtQkFBbUI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFLG1CQUFtQixDQUFDLFVBQVMsRUFBRSxRQUFRLEdBQUc7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDJCQUEyQixvQkFBbUI7QUFDOUMsMkJBQTJCLHlCQUFTO0FBQ3BDLDhCQUE4Qiw0QkFBWTtBQUMxQyxvREFBZSxjQUFjLEU7O0FDemNkO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOztBQ2R3RDtBQUN6QztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSxNQUFNLE9BQU8sb0JBQW9CLE9BQU87QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLG9CQUFvQjtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEM7O0FDbERzRTtBQUNFOztBQUV4RSxTQUFTLGNBQU87QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVMsbUJBQWE7QUFDdEIsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBLE1BQU0sY0FBTztBQUNiLFFBQVEsZUFBZTtBQUN2QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLE1BQU0sY0FBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFK0I7QUFDMEM7QUFDcEM7QUFDRTtBQUNGO0FBQ087QUFDNUM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixtQkFBYSxHQUFHOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFLG1CQUFNO0FBQ1IsRUFBRSxtQkFBTTtBQUNSO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixvQkFBVSxDQUFDLFdBQVU7QUFDckMsaUJBQWlCLGdCQUFNO0FBQ3ZCO0FBQ0E7QUFDQSxHQUFHOztBQUVILGtCQUFrQixrQkFBUTtBQUMxQixtQkFBbUIsMkJBQWM7QUFDakM7O0FBRUEsV0FBVyxpQkFBTztBQUNsQjtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsbUJBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckMsb0JBQW9CLHNCQUFZO0FBQ2hDO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQSwyQ0FBZSxNQUFNLEU7O0FDM0pOO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOztBQ2I2RTtBQUM5RDtBQUNmO0FBQ0EsZUFBZSw2QkFBNEI7QUFDM0M7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLDZCQUE2QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOztBQ2xCc0U7QUFDRTtBQUNrQjs7QUFFMUYsU0FBUyxhQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLGtCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLGFBQU87QUFDYixRQUFRLGVBQWU7QUFDdkIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxNQUFNLGFBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRXlFO0FBQ2pDO0FBQ0Q7QUFDRjtBQUNPO0FBQzVDO0FBQ0EsSUFBSSxlQUFTO0FBQ2IsUUFBUSxnQkFBZTtBQUN2QixNQUFNLGlCQUFnQjtBQUN0QixVQUFVLGlCQUFnQjtBQUMxQixZQUFZLGlCQUFnQjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHdCQUF3Qjs7QUFFM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTyxTQUFTO0FBQ2hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWEsQ0FBQyxrQkFBYSxHQUFHLFlBQVk7QUFDNUQ7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSxtQkFBTTtBQUNSLEVBQUUsbUJBQU07O0FBRVI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxnQkFBZ0Isb0JBQVUsQ0FBQyxXQUFVO0FBQ3JDLGlCQUFpQixnQkFBTTtBQUN2QjtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxrQkFBa0Isa0JBQVE7QUFDMUIsbUJBQW1CLDJCQUFjO0FBQ2pDOztBQUVBLFdBQVcsaUJBQU87QUFDbEI7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLG1CQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZUFBUztBQUMzQixxREFBZSxLQUFLLEU7O0FDekxrQztBQUNkO0FBQ0Q7QUFDaEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlCQUFpQixlQUFjO0FBQy9CLGVBQWUsZUFBYztBQUM3QixnQkFBZ0IsZUFBYztBQUM5QixzQkFBc0IsZUFBYztBQUNwQyxzQkFBc0IsZUFBYztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0EsZ0JBQWdCLG9CQUFVLENBQUMsV0FBVTtBQUNyQyxxQkFBcUIsZ0JBQU07O0FBRTNCLGlCQUFpQixnQkFBTTtBQUN2QjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxFQUFFLG1CQUFTO0FBQ1g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDOztBQ3ZIMEQ7QUFDYztBQUNOO0FBQ29CO0FBQzFCO0FBQ2tDO0FBQ3RCO0FBQ0E7O0FBRXhFLFNBQVMsd0JBQVk7QUFDckIsa0NBQWtDLHFDQUF5Qjs7QUFFM0Q7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjs7QUFFQTtBQUNBLHNCQUFzQixlQUFlOztBQUVyQztBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLFdBQVcsMEJBQTBCO0FBQ3JDO0FBQ0E7O0FBRUEsU0FBUyxxQ0FBeUI7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFK0I7QUFDa0I7QUFDOEM7O0FBRS9GO0FBQ0E7O0FBRUEsdUJBQXVCLGFBQWE7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsU0FBUzs7QUFFWCxlQUFlLHdCQUFZOztBQUUzQjtBQUNBOztBQUVBLElBQUksZUFBZTs7QUFFbkIsdUVBQXVFLGFBQWE7QUFDcEY7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLGVBQWUsQ0FBQyxzQkFBc0IsdUJBQXVCOztBQUVqRSxJQUFJLGVBQWUsQ0FBQyxzQkFBc0IsMEJBQTBCLG1CQUFTOztBQUU3RSxJQUFJLGVBQWUsQ0FBQyxzQkFBc0IsdUNBQXVDOztBQUVqRixJQUFJLGVBQWUsQ0FBQyxzQkFBc0IsMENBQTBDOztBQUVwRixJQUFJLGVBQWUsQ0FBQyxzQkFBc0IseUNBQXlDOztBQUVuRixJQUFJLGVBQWUsQ0FBQyxzQkFBc0Isc0NBQXNDOztBQUVoRixJQUFJLGVBQWUsQ0FBQyxzQkFBc0IsNENBQTRDOztBQUV0RjtBQUNBOztBQUVBLEVBQUUsWUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxhQUFhLG1CQUFtQixVQUFVLFFBQVE7QUFDbEQ7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDLENBQUMsbUJBQWE7O0FBRWYsZUFBZSwyQkFBMkIsbUJBQW1COztBQUU3RCxlQUFlLDhCQUE4QixzQkFBc0I7Ozs7QUNuSEs7QUFDRjs7QUFFdEUsU0FBUyx5QkFBTztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUyw4QkFBYTtBQUN0QixpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0EsTUFBTSx5QkFBTztBQUNiLFFBQVEsZUFBZTtBQUN2QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLE1BQU0seUJBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRXdDO0FBQ0k7QUFDbUQ7QUFDeEYsZ0RBQWdELEVBQUUsbUJBQW1CO0FBQzVFLGFBQWEsZUFBYztBQUMzQixVQUFVLGVBQWM7QUFDeEIsYUFBYSxlQUFjO0FBQzNCLGVBQWUsZUFBYztBQUM3QixjQUFjLGlCQUFnQjtBQUM5QixhQUFhLGlCQUFnQjtBQUM3QixDQUFDO0FBQ00sbURBQW1ELEVBQUUsc0JBQXNCO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmLGtCQUFrQixrQkFBUTtBQUMxQixtQkFBbUIsMkJBQWM7QUFDakM7QUFDQTs7QUFFQSxtQkFBbUIsa0JBQVE7QUFDM0IsbUJBQW1CLDJCQUFjO0FBQ2pDO0FBQ0E7O0FBRUEsZ0JBQWdCLGFBQWEsQ0FBQyw4QkFBYSxDQUFDLDhCQUFhLEdBQUcsWUFBWTtBQUN4RTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxtQkFBUztBQUNYO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQzs7QUNsTUE7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRTs7QUNic0U7QUFDdkM7QUFDQztBQUNtRjtBQUNqRTtBQUNLO0FBQ3ZELElBQUksbUJBQVksbUJBQW1CLEVBQUUsNEJBQTRCO0FBQ2pFO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixtQkFBbUI7QUFDcEM7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSwyQkFBMkIsMkJBQWM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLDJCQUFjO0FBQ3BDO0FBQ0E7O0FBRUEsc0NBQXNDLFVBQVUsb0JBQW9CLFVBQVU7QUFDOUU7QUFDQSxnQkFBZ0IsaUJBQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1CQUFtQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0JBQXNCLG1CQUFZO0FBQ2xDLDJDQUFlLFVBQVUsUUFBUSxFOztBQ25GMUI7QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOztBQ3ZHd0U7QUFDRjs7QUFFdEUsU0FBUyxhQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLGtCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLGFBQU87QUFDYixRQUFRLGVBQWU7QUFDdkIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxNQUFNLGFBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRStCO0FBQ2tDO0FBQzhCO0FBQ2Y7QUFDekI7QUFDWTtBQUNuRSxJQUFJLGtCQUFZLG1CQUFtQixFQUFFLHNCQUFzQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsU0FBUyxpQkFBVztBQUNwQixjQUFjLDJCQUFjO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGtCQUFrQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLDJCQUFjO0FBQzVCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsZUFBZTtBQUN0QztBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkMsb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTtBQUNBLGtIQUFrSCxVQUFVLHVCQUF1QixVQUFVO0FBQzdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixnQkFBTTtBQUN6QixnQkFBZ0IsYUFBYSxDQUFDLGtCQUFhLENBQUMsa0JBQWEsR0FBRyxZQUFZO0FBQ3hFO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsa0JBQWtCLGtCQUFRO0FBQzFCLG1CQUFtQiwyQkFBYztBQUNqQzs7QUFFQSxFQUFFLG1CQUFTO0FBQ1g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxtQkFBbUI7QUFDbEM7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLHFCQUFxQixpQkFBVztBQUNoQztBQUNBLHFCQUFxQixxQkFBVztBQUNoQztBQUNBLEdBQUc7QUFDSCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUUsbUJBQW1CO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUcsbUJBQW1CO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxpQkFBaUIsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxxQkFBcUIsa0JBQVk7QUFDakMsMENBQWUsVUFBVSxPQUFPLEU7O0FDL0x3QztBQUNGOztBQUV0RSxTQUFTLDJCQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLGdDQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLDJCQUFPO0FBQ2IsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsTUFBTSwyQkFBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFK0I7QUFDMkM7QUFDakM7QUFDc0Q7QUFDL0YsSUFBSSxnQ0FBWSxtQkFBbUIsRUFBRSxzQkFBc0I7QUFDM0Q7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSxvQkFBb0IsMENBQTJCO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQztBQUNBOztBQUVBLDBCQUEwQixnQkFBTTs7QUFFaEMsa0JBQWtCLGtCQUFRO0FBQzFCLG1CQUFtQiwyQkFBYztBQUNqQztBQUNBOztBQUVBLEVBQUUsbUJBQVM7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxtQkFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCwwQkFBMEIscUJBQVc7QUFDckM7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsY0FBYyxpQkFBTztBQUNyQixXQUFXLGdDQUFhO0FBQ3hCO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUUsbUJBQW1CO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLG1CQUFtQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsa0NBQWtDLGdDQUFZO0FBQzlDLHdEQUFlLFVBQVUsb0JBQW9CLEU7O0FDaEkyQjtBQUNGOztBQUV0RSxTQUFTLDBCQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLCtCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLDBCQUFPO0FBQ2IsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsTUFBTSwwQkFBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFNEM7QUFDYjtBQUNzQjtBQUNaO0FBQ3NEO0FBQy9GLElBQUksK0JBQVksbUJBQW1CLEVBQUUsc0JBQXNCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQztBQUNBOztBQUVBLGtCQUFrQixrQkFBUTtBQUMxQixtQkFBbUIsMkJBQWM7QUFDakM7QUFDQTs7QUFFQSxtQkFBbUIsa0JBQVE7QUFDM0IsbUJBQW1CLDJCQUFjO0FBQ2pDO0FBQ0E7O0FBRUEsbUJBQW1CLGtCQUFRO0FBQzNCLG1CQUFtQiwyQkFBYztBQUNqQztBQUNBOztBQUVBLEVBQUUsbUJBQVM7QUFDWCxzQkFBc0IseUNBQTBCO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLDBCQUF5QjtBQUM3QjtBQUNBLE1BQU0sNkJBQTRCO0FBQ2xDO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsaUJBQU87QUFDckIsV0FBVywrQkFBYTtBQUN4QjtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGlDQUFpQywrQkFBWTtBQUM3Qyx1REFBZSxVQUFVLG1CQUFtQixFOztBQzdINUM7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsQzs7QUNqQndFO0FBQ0Y7O0FBRXRFLFNBQVMseUJBQU87QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVMsOEJBQWE7QUFDdEIsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBLE1BQU0seUJBQU87QUFDYixRQUFRLGVBQWU7QUFDdkIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxNQUFNLHlCQUFPO0FBQ2I7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUUrQjtBQUMyQztBQUM5QjtBQUNIO0FBQ0M7QUFDd0I7QUFDQTtBQUM2Qjs7QUFFL0YsSUFBSSxzQkFBSTs7QUFFUixJQUFJLDhCQUFZLG1CQUFtQixFQUFFLHNCQUFzQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxTQUFTLDJCQUFTO0FBQ2xCLG1CQUFtQiw4QkFBZTtBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQix3Q0FBeUI7QUFDN0MsdUJBQXVCLHVCQUFzQjtBQUM3QztBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkJBQVM7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gscUJBQXFCLFFBQVE7QUFDN0Isa0NBQWtDLCtCQUErQix1QkFBdUI7QUFDeEYsK0VBQStFLHNCQUFJO0FBQ25GLGtGQUFrRixzQkFBSTtBQUN0RjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QjtBQUNBO0FBQ0EsMkJBQTJCLGdCQUFNOztBQUVqQyxrQkFBa0Isa0JBQVE7QUFDMUIsbUJBQW1CLDJCQUFjO0FBQ2pDO0FBQ0E7O0FBRUEsbUJBQW1CLGtCQUFRO0FBQzNCLG1CQUFtQiwyQkFBYztBQUNqQztBQUNBOztBQUVBLEVBQUUsbUJBQVM7QUFDWDs7QUFFQTtBQUNBLE1BQU0sc0JBQXNCO0FBQzVCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCx5QkFBeUIscUJBQVc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRSxtQkFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFLG1CQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxpQkFBTztBQUNyQixXQUFXLDhCQUFhO0FBQ3hCO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUUsbUJBQW1CO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRSxtQkFBbUI7QUFDeEI7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxnQ0FBZ0MsOEJBQVk7QUFDNUMsc0RBQWUsVUFBVSxrQkFBa0IsRTs7QUMxTnBDO0FBQ1A7QUFDQTs7QUFFQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7O0FDbEJ3RTs7QUFFeEUsU0FBUywwQkFBTztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUywrQkFBYTtBQUN0QixpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0EsTUFBTSwwQkFBTztBQUNiLFFBQVEsZUFBZTtBQUN2QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLE1BQU0sMEJBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRStCO0FBQ0M7QUFDVTtBQUN3QjtBQUNmO0FBQzRDOztBQUUvRixJQUFJLHVCQUFJOztBQUVSLElBQUksK0JBQVksbUJBQW1CLEVBQUUsc0JBQXNCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0EsU0FBUyxlQUFlO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUSxpQkFBaUI7QUFDOUMsa0NBQWtDLCtCQUErQix1QkFBdUI7QUFDeEYsK0VBQStFLHVCQUFJO0FBQ25GLGtGQUFrRix1QkFBSTtBQUN0RjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxjQUFjLG1CQUFtQjtBQUNwQztBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0Esa0JBQWtCLGlCQUFPO0FBQ3pCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLG1CQUFtQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQSxHQUFHLElBQUksbUJBQW1CO0FBQzFCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxpQkFBTztBQUNyQixXQUFXLCtCQUFhO0FBQ3hCO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0EsR0FBRyxFQUFFLG1CQUFtQjtBQUN4QjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGlDQUFpQywrQkFBWTtBQUM3Qyx1REFBZSxVQUFVLG1CQUFtQixFOztBQ3BKNEI7QUFDRjs7QUFFdEUsU0FBUyxxQkFBTztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUywwQkFBYTtBQUN0QixpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0EsTUFBTSxxQkFBTztBQUNiLFFBQVEsZUFBZTtBQUN2QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLE1BQU0scUJBQU87QUFDYjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRStCO0FBQ3NCO0FBQ1o7QUFDc0Q7QUFDL0YsSUFBSSwwQkFBWSxtQkFBbUIsRUFBRSxzQkFBc0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBLHVCQUF1QixhQUFhO0FBQ3BDO0FBQ0E7O0FBRUEsa0JBQWtCLGtCQUFRO0FBQzFCLG1CQUFtQiwyQkFBYztBQUNqQztBQUNBOztBQUVBLEVBQUUsbUJBQVM7QUFDWDtBQUNBLHdCQUF3QixvQ0FBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxjQUFjLGlCQUFPO0FBQ3JCLFdBQVcsMEJBQWE7QUFDeEI7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILFNBQVMsbUJBQW1CO0FBQzVCO0FBQ0E7QUFDQSxHQUFHLEVBQUUsbUJBQW1CO0FBQ3hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsNEJBQTRCLDBCQUFZO0FBQ3hDLGtEQUFlLFVBQVUsY0FBYyxFOztBQ3ZGK0I7QUFDdkM7QUFDYTtBQUN1QztBQUNuRixJQUFJLHlCQUFVO0FBQ2QsSUFBSSwyQkFBWTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQztBQUNBOztBQUVBLGtCQUFrQixrQkFBUTtBQUMxQixtQkFBbUIsMkJBQWM7QUFDakM7QUFDQTs7QUFFQSxFQUFFLG1CQUFTO0FBQ1g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyx5QkFBVSxFQUFFLHlCQUFVO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsU0FBUyxtQkFBbUI7QUFDNUI7QUFDQSw0QkFBNEIseUJBQVU7QUFDdEMsOEJBQThCLHlCQUFVO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLDZCQUE2QiwyQkFBWTtBQUN6QyxtREFBZSw2REFBYSxJOztBQzFENEM7O0FBRXhFLFNBQVMsb0JBQU87QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVMseUJBQWE7QUFDdEIsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBLE1BQU0sb0JBQU87QUFDYixRQUFRLGVBQWU7QUFDdkIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxNQUFNLG9CQUFPO0FBQ2I7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUUrQjtBQUNvRDtBQUNuRixJQUFJLHlCQUFZO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixhQUFhO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxjQUFjLHlCQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILFNBQVMsbUJBQW1CO0FBQzVCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSwyQkFBMkIseUJBQVk7QUFDdkMsaURBQWUsMkRBQVcsSTs7QUMzRThDOztBQUV4RSxTQUFTLG1CQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLHdCQUFhO0FBQ3RCLGlCQUFpQixzQkFBc0I7QUFDdkM7O0FBRUE7QUFDQSxNQUFNLG1CQUFPO0FBQ2IsUUFBUSxlQUFlO0FBQ3ZCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsTUFBTSxtQkFBTztBQUNiO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFK0I7QUFDb0Q7QUFDbkYsSUFBSSx3QkFBWTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUEsY0FBYyx3QkFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILFNBQVMsbUJBQW1CO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsMEJBQTBCLHdCQUFZO0FBQ3RDLGdEQUFlLDBEQUFVLEk7O0FDM0VTO0FBQ2xDLHVCQUF1Qix1QkFBUSxHQUFHLHdDQUF5QjtBQUMzRCx3REFBZSxnRUFBZ0IsSTs7QUNGd0I7QUFDa0I7QUFDVjtBQUNQO0FBQ0Y7QUFDYTtBQUNYO0FBQ0Y7QUFDMkI7QUFDRjtBQUNGO0FBQ0U7QUFDVjtBQUNBO0FBQ0o7QUFDRjtBQUNBO0FBQ2lFO0FBQzlEO0FBQ0Y7QUFDVTtBQUNUO0FBQ1E7OztBQ3RCekU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSxlQUFlLGNBQWM7QUFDaEU7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU8sZUFBZTtBQUNqQyxXQUFXLE9BQU8sWUFBWTtBQUM5QixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxTQUFTLFVBQU87QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZUFBZTtBQUNyQztBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTyxZQUFZO0FBQzlCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBSzs7QUFFbEI7QUFDQSxhQUFhLGFBQVU7O0FBRXZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWSxFQUFFLGNBQWM7QUFDMUM7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLE9BQU8sZUFBZTtBQUNqQyxXQUFXLE9BQU8sWUFBWTtBQUM5QixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVMsUUFBSztBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFPO0FBQ2hCO0FBQ0E7QUFDQSxjQUFjLFlBQVksRUFBRSx3QkFBd0I7QUFDcEQ7QUFDQTtBQUNBLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsT0FBTyxlQUFlO0FBQ2pDLFdBQVcsT0FBTyxZQUFZO0FBQzlCLFdBQVcsY0FBYztBQUN6QjtBQUNBLFdBQVcsY0FBYztBQUN6QixhQUFhLHlCQUF5QjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQUs7QUFDaEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxjQUFjLGNBQWMsRUFBRSxjQUFjO0FBQzVDO0FBQ0E7QUFDQSxXQUFXLDRCQUE0QjtBQUN2QyxXQUFXLE9BQU8sZUFBZTtBQUNqQyxXQUFXLE9BQU8sWUFBWTtBQUM5QixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsaUJBQWlCO0FBQzlCO0FBQ0EscUZBQXFGLGdCQUFnQjtBQUNyRztBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLDJCQUEyQjtBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGtDQUFrQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQU87QUFDaEI7QUFDQTtBQUNBLGNBQWMsY0FBYyxFQUFFLHdCQUF3QjtBQUN0RDtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxPQUFPLGVBQWU7QUFDakMsV0FBVyxPQUFPLFlBQVk7QUFDOUIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsY0FBYztBQUN6QixhQUFhLDJCQUEyQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGNBQWMsaUJBQWlCLEVBQUUsY0FBYztBQUMvQztBQUNBO0FBQ0EsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxPQUFPLGVBQWU7QUFDakMsV0FBVyxPQUFPLFlBQVk7QUFDOUIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsY0FBYztBQUN6QixhQUFhLG9CQUFvQjtBQUNqQztBQUNBLG9GQUFvRixlQUFlO0FBQ25HLG9GQUFvRixlQUFlO0FBQ25HO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVMsYUFBVTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFPO0FBQ2hCO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQixFQUFFLHdCQUF3QjtBQUN6RDtBQUNBO0FBQ0EsV0FBVyw0QkFBNEI7QUFDdkMsV0FBVyxPQUFPLGVBQWU7QUFDakMsV0FBVyxPQUFPLFlBQVk7QUFDOUIsV0FBVyxjQUFjO0FBQ3pCO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsOEJBQThCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLGFBQVU7QUFDckIsR0FBRztBQUNIO0FBQ0E7QUFDQSxzQkFBc0IsdUJBQXVCLGdCQUFnQix3QkFBd0I7QUFDckY7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLE9BQU8sWUFBWTtBQUM5QixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0Esa0RBQWtELG1CQUFtQjtBQUNyRSxrREFBa0QsbUJBQW1CO0FBQ3JFLGtEQUFrRCxtQkFBbUI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYywrQkFBK0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsV0FBVyw0QkFBNEI7QUFDdkMsV0FBVyxPQUFPLGVBQWU7QUFDakMsV0FBVyxPQUFPLFlBQVk7QUFDOUIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsY0FBYztBQUN6QixhQUFhLHlCQUF5QjtBQUN0QyxZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsVUFBTztBQUNoQjtBQUNBO0FBQ0EsY0FBYywwQkFBMEI7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxPQUFPLGVBQWU7QUFDakMsV0FBVyxPQUFPLFlBQVk7QUFDOUIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsY0FBYztBQUN6QixhQUFhLG9CQUFvQjtBQUNqQyxZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsVUFBTztBQUNoQjtBQUNBO0FBQ0EsY0FBYyw0QkFBNEI7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxPQUFPLGVBQWU7QUFDakMsV0FBVyxPQUFPLFlBQVk7QUFDOUIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsY0FBYztBQUN6QixhQUFhLHNCQUFzQjtBQUNuQyxZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFPO0FBQ2hCO0FBQ0E7QUFDQSxjQUFjLGtDQUFrQztBQUNoRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQixXQUFXLE9BQU8sZUFBZTtBQUNqQyxXQUFXLE9BQU8sWUFBWTtBQUM5QixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsNEJBQTRCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFPO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sU0FBUyxRQUFLO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDQSxhQUFhLE9BQU87QUFDcEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBLGFBQWEsT0FBTztBQUNwQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE1BQU07QUFDakIsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsT0FBTztBQUNwQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQixhQUFhLE9BQU87QUFDcEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVMsV0FBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDOztBQzF6QnFFO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsU0FBUztBQUNwQixXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ0E7QUFDQSwyQkFBMkIsYUFBYTtBQUN4QywyQkFBMkIsaUJBQWlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsbUJBQW1CO0FBQzlDO0FBQ0E7QUFDQSxnSEFBZ0g7O0FBRWhIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEMsdUJBQXVCLG1DQUFtQztBQUMxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDOztBQUVBLHVCQUF1QixzQkFBc0I7QUFDN0MseUJBQXlCLHNDQUFzQztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLGdDQUFnQztBQUNyRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsT0FBTztBQUNsQjtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLFdBQVcsUUFBUTtBQUNuQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0EsMkJBQTJCLGFBQWE7QUFDeEMsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVywwQkFBMEI7QUFDckMsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0EsNkJBQTZCLFdBQVc7QUFDeEMsNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDZCQUE2QjtBQUM5QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsT0FBTztBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDBCQUEwQjtBQUNyQyxXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsYUFBYSxFQUFFO0FBQ2Y7QUFDQTtBQUNBLDZCQUE2QixXQUFXO0FBQ3hDLDZCQUE2QixlQUFlO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEY7QUFDNUYsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQTtBQUNBLDJCQUEyQixXQUFXO0FBQ3RDLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxtQkFBbUIsNkJBQTZCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQSwyQkFBMkIsYUFBYTtBQUN4QywyQkFBMkIsaUJBQWlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSx5RkFBeUY7QUFDekYsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLGFBQWEscUJBQXFCO0FBQ2xDO0FBQ0E7QUFDQSwyQkFBMkIsV0FBVztBQUN0QywyQkFBMkIsZUFBZTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0EsNkJBQTZCLFdBQVc7QUFDeEMsNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxXQUFXO0FBQzFCLHdHQUF3Rzs7QUFFeEc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCLGdDQUFnQztBQUN2RDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLGNBQWM7QUFDekIsV0FBVyxjQUFjO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQSw2QkFBNkIsV0FBVztBQUN4Qyw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGO0FBQzFGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQSw2QkFBNkIsV0FBVztBQUN4Qyw4Q0FBOEMsZUFBZTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsaURBQWlEO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsU0FBUztBQUNwQixXQUFXLEVBQUU7QUFDYixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0EsNkJBQTZCLFdBQVc7QUFDeEMsOENBQThDLGVBQWU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0Esb0hBQW9IO0FBQ3BILEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QixrQ0FBa0M7O0FBRWxDO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQ0FBbUM7QUFDOUMsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdGQUF3RjtBQUN4RjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrRUFBa0U7QUFDN0UsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DLCtCQUErQjtBQUNsRTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrRUFBa0U7QUFDN0UsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxzRkFBc0Y7QUFDdEYsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1DQUFtQztBQUM5QyxXQUFXLE9BQU8sWUFBWTtBQUM5QixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPLHVCQUF1QjtBQUN6QyxXQUFXLEtBQUssaUJBQWlCO0FBQ2pDLFdBQVcsY0FBYyxlQUFlO0FBQ3hDLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MscUJBQXFCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3Q0FBd0M7QUFDeEU7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUNBQW1DO0FBQzlDLFdBQVcsT0FBTyxZQUFZO0FBQzlCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU8sdUJBQXVCO0FBQ3pDLFdBQVcsS0FBSyxpQkFBaUI7QUFDakMsV0FBVyxjQUFjLGVBQWU7QUFDeEMsYUFBYSxlQUFlO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIscUJBQXFCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixzQ0FBc0M7QUFDcEU7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7QUMzb0N1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxTQUFTO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBZSxJQUFJLEU7O0FDdkNaO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQSxDOzs7Ozs7QUNSQTtBQUNPO0FBQ0EsNkY7O0FDT1AsR0FBTWtCLHNCQUFxQixDQUFHLFFBQXhCQSxzQkFBd0IsTUFBNEQsSUFBMURDLDRCQUEwRCxNQUExREEsMkJBQTBELENBQ3hGLEdBQU1sQixLQUFJLENBQUdDLDhCQUFPLEVBQXBCLENBRUEsbUJBQXVCa0IsYUFBYSxDQUFDLENBQ25DO0FBQ0FDLE9BQU8sQ0FBRUYsMkJBRjBCLENBQUQsQ0FBcEMsQ0FBT0csWUFBUCxnQkFBT0EsWUFBUCxDQUtBLEdBQU1DLFlBQVcsQ0FBRyxDQUNsQixDQUNFQyxLQUFLLENBQUV2QixJQUFJLENBQUNnQixhQUFMLENBQ0gsQ0FDRVgsRUFBRSxDQUFFLGtDQUROLENBRUVDLGNBQWMsQ0FBRSxJQUZsQixDQUdFQyxXQUFXLENBQUUsbUVBSGYsQ0FERyxDQURULENBUUVpQixJQUFJLENBQUV4QixJQUFJLENBQUNnQixhQUFMLENBQ0YsQ0FDRVgsRUFBRSxDQUFFLGlDQUROLENBRUVDLGNBQWMsQ0FBRSxVQUZsQixDQUdFQyxXQUFXLENBQUUsOERBSGYsQ0FERSxDQVJSLENBRGtCLENBaUJsQixDQUNFZ0IsS0FBSyxDQUFFdkIsSUFBSSxDQUFDZ0IsYUFBTCxDQUNILENBQ0VYLEVBQUUsQ0FBRSxpQ0FETixDQUVFQyxjQUFjLENBQUUsSUFGbEIsQ0FHRUMsV0FBVyxDQUFFLGlEQUhmLENBREcsQ0FEVCxDQVFFaUIsSUFBSSxDQUFFeEIsSUFBSSxDQUFDZ0IsYUFBTCxDQUNGLENBQ0VYLEVBQUUsQ0FBRSxnQ0FETixDQUVFQyxjQUFjLENBQUUsUUFGbEIsQ0FHRUMsV0FBVyxDQUFFLCtDQUhmLENBREUsQ0FSUixDQWpCa0IsQ0FpQ2xCLENBQ0VnQixLQUFLLENBQUV2QixJQUFJLENBQUNnQixhQUFMLENBQ0gsQ0FDRVgsRUFBRSxDQUFFLGlDQUROLENBRUVDLGNBQWMsQ0FBRSxJQUZsQixDQUdFQyxXQUFXLENBQUUsc0RBSGYsQ0FERyxDQURULENBUUVpQixJQUFJLENBQUV4QixJQUFJLENBQUNnQixhQUFMLENBQ0YsQ0FDRVgsRUFBRSxDQUFFLGdDQUROLENBRUVDLGNBQWMsQ0FBRSxRQUZsQixDQUdFQyxXQUFXLENBQUUsaURBSGYsQ0FERSxDQVJSLENBakNrQixDQWlEbEIsQ0FDRWdCLEtBQUssQ0FBRXZCLElBQUksQ0FBQ2dCLGFBQUwsQ0FDSCxDQUNFWCxFQUFFLENBQUUsc0NBRE4sQ0FFRUMsY0FBYyxDQUFFLElBRmxCLENBR0VDLFdBQVcsQ0FBRSwyREFIZixDQURHLENBRFQsQ0FRRWlCLElBQUksQ0FBRXhCLElBQUksQ0FBQ2dCLGFBQUwsQ0FDRixDQUNFWCxFQUFFLENBQUUscUNBRE4sQ0FFRUMsY0FBYyxDQUFFLGFBRmxCLENBR0VDLFdBQVcsQ0FBRSxvREFIZixDQURFLENBUlIsQ0FqRGtCLENBQXBCLENBbUVBLG1CQUNFLDJCQUFLLEdBQUcsQ0FBRWMsWUFBVixDQUF3QixTQUFTLENBQUVOLHVCQUFuQyxFQUNHTyxXQUFXLENBQUNHLEdBQVosQ0FBZ0IsU0FBQ0MsU0FBRCxxQkFDZiw4QkFDRSxFQUFFLENBQUVBLFNBQVMsQ0FBQ0gsS0FEaEIsQ0FFRSxHQUFHLENBQUVHLFNBQVMsQ0FBQ0gsS0FGakIsQ0FHRSxPQUFPLENBQUVMLDJCQUhYLENBSUUsU0FBUyxDQUFFSCxvQkFKYixDQUtFLGFBQVlmLElBQUksQ0FBQ2dCLGFBQUwsQ0FDUixDQUNFWCxFQUFFLENBQUUsNEJBRE4sQ0FFRUMsY0FBYyxDQUFFLHNCQUZsQixDQUdFQyxXQUFXLENBQUUsNkNBSGYsQ0FEUSxDQU1SLENBQ0VtQixTQUFTLENBQUVBLFNBQVMsQ0FBQ0YsSUFEdkIsQ0FOUSxDQUxkLEVBZUdFLFNBQVMsQ0FBQ0gsS0FmYixDQURlLEVBQWhCLENBREgsQ0FERixDQXVCRCxDQWxHRCxDQW9HQSwwREFBZU4scUJBQWYsRTs7QUM3R0Esc0RBQWUsb0JBQW9CLHdxQjs7QUNBbkM7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRTs7QUNIUDtBQUlBLEdBQU1VLGdCQUFlLENBQUcsUUFBbEJBLGdCQUFrQixFQUFNLENBQzVCLEdBQU0zQixLQUFJLENBQUdDLDhCQUFPLEVBQXBCLENBQ0EsR0FBTUMsU0FBUSxDQUFHQyw4QkFBYyxDQUFDLENBQzlCeUIsY0FBYyxDQUFFLENBQ2R2QixFQUFFLENBQUUseUJBRFUsQ0FFZEMsY0FBYyxDQUFFLG1EQUZGLENBR2RDLFdBQVcsQ0FBRSwwQ0FIQyxDQURjLENBTTlCc0IsVUFBVSxDQUFFLENBQ1Z4QixFQUFFLENBQUUscUJBRE0sQ0FFVkMsY0FBYyxDQUFFLGdCQUZOLENBR1ZDLFdBQVcsQ0FBRSxpQ0FISCxDQU5rQixDQVc5QnVCLDBCQUEwQixDQUFFLENBQzFCekIsRUFBRSxDQUFFLHFDQURzQixDQUUxQkMsY0FBYyxDQUFFLG1FQUNoQixpRUFEZ0IsQ0FFaEIsK0JBSjBCLENBSzFCQyxXQUFXLENBQUUsa0VBTGEsQ0FYRSxDQUFELENBQS9CLENBb0JBLG1CQUNFLDZCQUFPLFNBQVMsQ0FBRVEsaUJBQWxCLGVBQ0UsOEJBQVEsU0FBUyxDQUFFQSxjQUFuQixFQUEyQ2YsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDMEIsY0FBNUIsQ0FBM0MsQ0FERixjQUVFLDJCQUFLLFNBQVMsQ0FBRWIsWUFBaEIsZUFDRSwyQkFBSyxTQUFTLENBQUVBLGlCQUFoQixDQUEwQyxHQUFHLENBQUVnQixpQkFBL0MsRUFERixjQUVFLDJCQUFLLFNBQVMsQ0FBRWhCLGFBQWhCLGVBQ0UsMkJBQUssU0FBUyxDQUFFQSxVQUFoQixFQUFvQ2YsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDMkIsVUFBNUIsQ0FBcEMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRWQsY0FBakIsRUFBeUNmLElBQUksQ0FBQ2dCLGFBQUwsQ0FBbUJkLFFBQVEsQ0FBQzRCLDBCQUE1QixDQUF6QyxDQUZGLENBRkYsQ0FGRixDQURGLENBWUQsQ0FsQ0QsQ0FvQ0Esb0RBQWVILGVBQWYsRTs7QUM1Q0E7QUFDTztBQUNBO0FBQ0E7QUFDQSxJQUFJLGdDQUFjO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLElBQUksdUJBQUs7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRTs7QUNqQlA7QUFDTyxHQUFNSyxpQkFBZ0IsQ0FBRyx1R0FBekIsQ0FFUDtBQUNBO0FBRUE7QUFDTyxHQUFNQyxzQkFBcUIsQ0FBRyx1Q0FBOUIsQ0FDUCxHQUFNQyxrQkFBaUIsQ0FBRyxnQ0FBMUIsQ0FFQTtBQUNBO0FBQ0EsR0FBTUMsV0FBVSxDQUFHLGlCQUFuQixDQUVPLEdBQU1DLHlCQUF3QixDQUFHLFFBQTNCQSx5QkFBMkIsQ0FBQ0MsV0FBRCxDQUFtQyxDQUN6RSxNQUFVSixzQkFBVixLQUFtQ0MsaUJBQW5DLEtBQXdERyxXQUF4RCxLQUF1RUYsVUFBdkUsQ0FDRCxDQUZNLENBR0EsR0FBTUcsMkJBQTBCLENBQUdGLHdCQUF3QixDQUFDLE1BQUQsQ0FBM0QsQ0FDQSxHQUFNRywwQkFBeUIsQ0FBR0gsd0JBQXdCLENBQUMsS0FBRCxDQUExRCxDQUdQO0FBQ08sR0FBTUksNEJBQTJCLENBQUcsVUFBcEMsQ0FFUDtBQUNPLEdBQU1DLG9CQUFtQixDQUFHLHNCQUE1QixDQUNBLEdBQU1DLG1CQUFrQixDQUFHLFNBQTNCLENBQ0EsR0FBTUMsZUFBYyxDQUFHLFNBQXZCLENBQ0EsR0FBTUMsdUJBQXNCLENBQUcsWUFBL0IsQ0FDQSxHQUFNQyxzQkFBcUIsQ0FBRyxrQkFBOUIsQ0FDQSxHQUFNQyxzQkFBcUIsQ0FBRyxXQUE5QixDQUNBLEdBQU1DLHFCQUFvQixDQUFHLGlCQUE3QixDQUNBLEdBQU1DLGtCQUFpQixDQUFHLFVBQTFCLENBQ0EsR0FBTUMsZ0RBQStDLENBQUcsNENBQXhELENBQ0EsR0FBTUMsZ0NBQStCLENBQUcsNEJBQXhDLENBR1A7QUFDTyxHQUFNQyw0QkFBMkIsQ0FBRywrREFBcEMsQ0FDQSxHQUFNQyxtQ0FBa0MsQ0FBRyx1Q0FBM0MsQ0FDQSxHQUFNQyx5Q0FBd0MsQ0FBRyw2Q0FBakQsQ0FDQSxHQUFNQyxpQ0FBZ0MsQ0FBRyw2Q0FBekMsQ0FDQSxHQUFNQyxpQkFBZ0IsQ0FBRyxrQkFBekIsQ0FDQSxHQUFNQyw4QkFBNkIsb0ZBQW5DLENBRUEsR0FBTUMsWUFBVyxDQUFHLGFBQXBCLENBQ0EsR0FBTUMsV0FBVSxDQUFHLFlBQW5CLENBR1A7QUFDTyxHQUFNQyxtQkFBa0IsQ0FBRyxRQUEzQixDQUlQO0FBQ08sR0FBTUMsZ0JBQWUsQ0FBRyxDQUF4QixDQUNBLEdBQU1DLGdCQUFlLENBQUcsRUFBeEIsQ0FDQSxHQUFNQyxvQkFBbUIsQ0FBRyxDQUE1QixDQUNBLEdBQU1DLG9CQUFtQixDQUFHLENBQTVCLENBQ0EsR0FBTUMsMEJBQXlCLENBQUcsQ0FBbEMsQ0FDQSxHQUFNQywwQkFBeUIsQ0FBRyxFQUFsQyxDQUNBLEdBQU1DLHFCQUFvQixDQUFHLENBQTdCLENBQ0EsR0FBTUMscUJBQW9CLENBQUcsRUFBN0IsQ0FFUDtBQUNPLEdBQU1DLGtCQUFvQyxDQUFHLGlEQUNsRCxDQUFDLENBQUMsVUFBRixDQUFjLFFBQWQsQ0FEa0QsQ0FFbEQsQ0FBQyxDQUFDLElBQUYsQ0FBUSxTQUFSLENBRmtELENBQTdDLEdBS0EsR0FBTUMsZ0JBQWtDLENBQUcsQ0FDaEQsQ0FBQyxDQUFDLFdBQUYsQ0FBZSxVQUFmLENBRGdELENBRWhELENBQUMsQ0FBQyxVQUFGLENBQWMsVUFBZCxDQUZnRCxDQUEzQyxDQUtBLEdBQU1DLGNBQWdDLENBQUcsQ0FDOUMsQ0FBQyxDQUFDLFVBQUYsQ0FBYyxTQUFkLENBRDhDLENBRTlDLENBQUMsQ0FBQyxVQUFGLENBQWMsU0FBZCxDQUY4QyxDQUF6QyxDQUtBLEdBQU1DLGNBQWdDLENBQUcsQ0FDOUMsQ0FBQyxDQUFDLFVBQUYsQ0FBYyxTQUFkLENBRDhDLENBRTlDLENBQUMsQ0FBQyxVQUFGLENBQWMsU0FBZCxDQUY4QyxDQUF6QyxDQUtBLEdBQU1DLG1CQUFxQyxDQUFHLENBQ25ELENBQUMsQ0FBQyxTQUFGLENBQWEsUUFBYixDQURtRCxDQUVuRCxDQUFDLENBQUMsU0FBRixDQUFhLFNBQWIsQ0FGbUQsQ0FBOUMsQ0FLQSxHQUFNQyxZQUE4QixDQUFHLGlEQUM1QyxDQUFDLENBQUMsVUFBRixDQUFjLFNBQWQsQ0FENEMsQ0FFNUMsQ0FBQyxDQUFDLFVBQUYsQ0FBYyxTQUFkLENBRjRDLENBQXZDLEdBS0EsR0FBTUMsc0JBQXdDLENBQUcsaURBQ3RELENBQUMsQ0FBQyxVQUFGLENBQWMsU0FBZCxDQURzRCxDQUV0RCxDQUFDLENBQUMsVUFBRixDQUFjLFNBQWQsQ0FGc0QsQ0FBakQsR0FLQSxHQUFNQyxzQkFBd0MsQ0FBRyxpREFDdEQsQ0FBQyxDQUFDLFVBQUYsQ0FBYyxDQUFDLFNBQWYsQ0FEc0QsQ0FFdEQsQ0FBQyxDQUFDLFFBQUYsQ0FBWSxDQUFDLFNBQWIsQ0FGc0QsQ0FBakQsR0FLQSxHQUFNQyxlQUFjLENBQUcsQ0FBQyxVQUFELENBQWEsQ0FBQyxTQUFkLENBQXZCLENBRVA7QUFDTyxHQUFNQyxzQkFBcUIsQ0FBRyxHQUE5QixDQUVQO0FBQ08sR0FBTUMsc0JBQXFCLENBQUcsU0FBOUIsQ0FDQSxHQUFNQyxVQUFTLENBQUcsU0FBbEIsQ0FDQSxHQUFNQyxVQUFTLENBQUcsU0FBbEIsQ0FDQSxHQUFNQyxVQUFTLENBQUcsU0FBbEIsQ0FDQSxHQUFNQyx1QkFBc0IsQ0FBRyxTQUEvQixDQUNBLEdBQU1DLHlDQUF3QyxDQUFHLEdBQWpELENBRVA7QUFDTyxHQUFNQyx1QkFBc0IsQ0FBRyxHQUEvQixDQUNBLEdBQU1DLHVDQUFzQyxDQUFHLEdBQS9DLENBRVA7QUFDTyxHQUFNQyxtQkFBa0IsQ0FBRyxHQUEzQixDQUNBLEdBQU1DLHlCQUF3QixDQUFHLEdBQWpDLENBQ0EsR0FBTUMsMkJBQTBCLENBQUcsSUFBbkMsQ0FHUDtBQUNPLEdBQU1DLHVCQUFzQixDQUFHdEYsOEJBQWMsQ0FBQyxDQUNuRHVGLGNBQWMsQ0FBRSxDQUNkckYsRUFBRSxDQUFFLDRCQURVLENBRWRDLGNBQWMsQ0FBRSx1QkFGRixDQUdkQyxXQUFXLENBQUUsK0NBSEMsQ0FEbUMsQ0FNbkRvRixlQUFlLENBQUUsQ0FDZnRGLEVBQUUsQ0FBRSw2QkFEVyxDQUVmQyxjQUFjLENBQUUscUJBRkQsQ0FHZkMsV0FBVyxDQUFFLDZDQUhFLENBTmtDLENBV25EcUYsWUFBWSxDQUFFLENBQ1p2RixFQUFFLENBQUUsdUJBRFEsQ0FFWkMsY0FBYyxDQUFFLFdBRkosQ0FHWkMsV0FBVyxDQUFFLG9DQUhELENBWHFDLENBQUQsQ0FBN0MsQ0FrQkEsR0FBTXNGLFNBQVEsQ0FBR0MscUJBQWpCLEM7O0FDdkpQO0FBS0E7QUFFQTtBQUlPLEdBQU1DLGdCQUFlLENBQUcsUUFBbEJBLGdCQUFrQixDQUFDQyxPQUFELENBQXFCLENBQ2xELFNBQVUsQ0FBQ0EsT0FBTyxDQUFHLEdBQVgsRUFBZ0JDLE9BQWhCLENBQXdCLENBQXhCLENBQVYsQ0FDRCxDQUZNLENBSUEsR0FBTUMsa0JBQWlCLENBQUcsUUFBcEJBLGtCQUFvQixDQUFDQyxVQUFELENBQXdCLENBQ3ZELEdBQUlDLGVBQUosQ0FDQSxHQUFJQyxvQkFBSixDQUVBLEdBQUlGLFVBQVUsRUFBSUcsMEJBQWxCLENBQXlELENBQ3ZERixjQUFjLENBQUcsYUFBakIsQ0FDQUMsbUJBQW1CLENBQUd0RixXQUF0QixDQUNELENBSEQsSUFHTyxJQUFJdUYsd0JBQUEsRUFBc0NILFVBQXRDLEVBQW9EQSxVQUFVLENBQUdHLDBCQUFyRSxDQUEyRyxDQUNoSEYsY0FBYyxDQUFHLFdBQWpCLENBQ0FDLG1CQUFtQixDQUFHdEYsU0FBdEIsQ0FDRCxDQUhNLElBR0EsQ0FDTHFGLGNBQWMsQ0FBRyxpQkFBakIsQ0FDQUMsbUJBQW1CLENBQUd0RixjQUF0QixDQUNELENBQ0QsTUFBTyxDQUFDcUYsY0FBRCxDQUFpQkMsbUJBQWpCLENBQVAsQ0FDRCxDQWZNLENBcUJQLEdBQU1FLFdBQVUsQ0FBRyxRQUFiQSxXQUFhLE1BQW1DLElBQWpDQyxXQUFpQyxNQUFqQ0EsVUFBaUMsQ0FDcEQsR0FBTXhHLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLDhCQUFjLENBQUMsQ0FDOUJzRyxvQkFBb0IsQ0FBRSxDQUNwQnBHLEVBQUUsQ0FBRSw4Q0FEZ0IsQ0FFcEJDLGNBQWMsQ0FBRSx3QkFGSSxDQUdwQkMsV0FBVyxDQUFFLDhDQUhPLENBRFEsQ0FNOUI0RixVQUFVLENBQUUsQ0FDVjlGLEVBQUUsQ0FBRSxvQ0FETSxDQUVWQyxjQUFjLENBQUUsWUFGTixDQUdWQyxXQUFXLENBQUUsdUNBSEgsQ0FOa0IsQ0FXOUI2RixjQUFjLENBQUUsQ0FDZC9GLEVBQUUsQ0FBRSx3Q0FEVSxDQUVkQyxjQUFjLENBQUUsZ0JBRkYsQ0FHZEMsV0FBVyxDQUFFLGlFQUhDLENBWGMsQ0FnQjlCbUcsZ0JBQWdCLENBQUUsQ0FDaEJyRyxFQUFFLENBQUUsNENBRFksQ0FFaEJDLGNBQWMsQ0FBRSxxQkFGQSxDQUdoQkMsV0FBVyxDQUFFLDBEQUhHLENBaEJZLENBcUI5Qm9HLE1BQU0sQ0FBRSxDQUNOdEcsRUFBRSxDQUFFLGtDQURFLENBRU5DLGNBQWMsQ0FBRSxTQUZWLENBR05DLFdBQVcsQ0FBRSxvQ0FIUCxDQXJCc0IsQ0EwQjlCcUcsS0FBSyxDQUFFLENBQ0x2RyxFQUFFLENBQUUsaUNBREMsQ0FFTEMsY0FBYyxDQUFFLFNBRlgsQ0FHTEMsV0FBVyxDQUFFLG1DQUhSLENBMUJ1QixDQStCOUJzRyxVQUFVLENBQUUsQ0FDVnhHLEVBQUUsQ0FBRSxzQ0FETSxDQUVWQyxjQUFjLENBQUUsYUFGTixDQUdWQyxXQUFXLENBQUUsd0NBSEgsQ0EvQmtCLENBb0M5QnVHLHFCQUFxQixDQUFFLENBQ3JCekcsRUFBRSxDQUFFLDZDQURpQixDQUVyQkMsY0FBYyxDQUFFLFlBRkssQ0FHckJDLFdBQVcsQ0FBRSx3Q0FIUSxDQXBDTyxDQXlDOUJ3RyxzQkFBc0IsQ0FBRSxDQUN0QjFHLEVBQUUsQ0FBRSw4Q0FEa0IsQ0FFdEJDLGNBQWMsQ0FBRSxvQkFGTSxDQUd0QkMsV0FBVyxDQUFFLHdDQUhTLENBekNNLENBOEM5QnlHLE9BQU8sQ0FBRSxDQUNQM0csRUFBRSxDQUFFLDhCQURHLENBRVBDLGNBQWMsQ0FBRSxTQUZULENBR1BDLFdBQVcsQ0FBRSw2RUFITixDQTlDcUIsQ0FtRDlCMEcsU0FBUyxDQUFFLENBQ1Q1RyxFQUFFLENBQUUsZ0NBREssQ0FFVEMsY0FBYyxDQUFFLFdBRlAsQ0FHVEMsV0FBVyxDQUFFLHlFQUhKLENBbkRtQixDQXdEOUIyRyxtQkFBbUIsQ0FBRSxDQUNuQjdHLEVBQUUsQ0FBRSwwQ0FEZSxDQUVuQkMsY0FBYyxDQUFFLHNCQUZHLENBR25CQyxXQUFXLENBQUUsb0VBQ2IscUNBSm1CLENBeERTLENBOEQ5QjRHLFlBQVksQ0FBRSxDQUNaOUcsRUFBRSxDQUFFLG1DQURRLENBRVpDLGNBQWMsQ0FBRSxtQkFGSixDQUdaQyxXQUFXLENBQUUsZ0VBSEQsQ0E5RGdCLENBbUU5QjZHLFdBQVcsQ0FBRSxDQUNYL0csRUFBRSxDQUFFLGtDQURPLENBRVhDLGNBQWMsQ0FBRSxnQkFGTCxDQUdYQyxXQUFXLENBQUUseUZBSEYsQ0FuRWlCLENBQUQsQ0FBL0IsQ0EwRUEsR0FBTThHLE1BQUssQ0FBR2IsVUFBVSxDQUFDRixtQkFBRCxDQUF4QixDQUNBLEdBQU1nQixXQUFVLENBQUdkLFVBQVUsQ0FBQ0YsY0FBRCxDQUE3QixDQUNBLEdBQU1PLFdBQVUsQ0FBR0wsVUFBVSxDQUFDRixnQkFBRCxDQUE3QixDQUNBLEdBQU1pQixXQUFVLENBQUdmLFVBQVUsQ0FBQ0YsV0FBRCxDQUE3QixDQUNBLEdBQU1rQixVQUFTLENBQUdoQixVQUFVLENBQUNGLFVBQUQsQ0FBNUIsQ0FRQTtBQUNBLEdBQU1tQixZQUF5QixDQUFHLENBQ2hDQyxLQUFLLENBQUUxSCxJQUFJLENBQUNnQixhQUFMLENBQW1CZCxRQUFRLENBQUM4RyxPQUE1QixDQUR5QixDQUVoQ3pHLFdBQVcsQ0FBRSw2RUFGbUIsQ0FHaENvSCxLQUFLLENBQUVuQixVQUFVLENBQUNGLDJCQUFELENBSGUsQ0FBbEMsQ0FLQSxHQUFNc0IsUUFBcUIsQ0FBRyxDQUM1QkYsS0FBSyxDQUFFMUgsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDK0csU0FBNUIsQ0FEcUIsQ0FFNUIxRyxXQUFXLENBQUUseUVBRmUsQ0FHNUJvSCxLQUFLLENBQUVuQixVQUFVLENBQUNGLDZCQUFELENBSFcsQ0FBOUIsQ0FLQSxHQUFNdUIsV0FBd0IsQ0FBRyxDQUMvQkgsS0FBSyxDQUFFMUgsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDZ0gsbUJBQTVCLENBRHdCLENBRS9CM0csV0FBVyxDQUFFLHNHQUZrQixDQUcvQm9ILEtBQUssQ0FBRW5CLFVBQVUsQ0FBQ0Ysd0NBQUQsQ0FIYyxDQUFqQyxDQUtBLEdBQU13QixhQUEwQixDQUFHLENBQ2pDSixLQUFLLENBQUUxSCxJQUFJLENBQUNnQixhQUFMLENBQW1CZCxRQUFRLENBQUNpSCxZQUE1QixDQUQwQixDQUVqQzVHLFdBQVcsQ0FBRSxnRUFGb0IsQ0FHakNvSCxLQUFLLENBQUVuQixVQUFVLENBQUNGLGdDQUFELENBSGdCLENBQW5DLENBS0EsR0FBTWMsWUFBeUIsQ0FBRyxDQUNoQ00sS0FBSyxDQUFFMUgsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDa0gsV0FBNUIsQ0FEeUIsQ0FFaEM3RyxXQUFXLENBQUUseUZBRm1CLENBR2hDb0gsS0FBSyxDQUFFbkIsVUFBVSxDQUFDRixrQ0FBRCxDQUhlLENBQWxDLENBTUEsR0FBTXlCLFdBQVUsQ0FBRyxDQUFDTixXQUFELENBQWNHLE9BQWQsQ0FBdUJDLFVBQXZCLENBQW1DQyxZQUFuQyxDQUFpRFYsV0FBakQsQ0FBbkIsQ0FFQSx1QkFBOENsQixpQkFBaUIsQ0FBQ21CLEtBQUQsQ0FBL0QsQ0FBT2pCLGNBQVAsdUJBQXVCQyxtQkFBdkIsdUJBRUEsbUJBQ0UsNkJBQU8sU0FBUyxDQUFFdEYsbUJBQWxCLENBQThDLFVBQVMsT0FBdkQsZUFDRSw4QkFBUSxTQUFTLENBQUVBLE1BQW5CLGVBQ0UsMkJBQUssU0FBUyxDQUFFQSxvQkFBaEIsZUFDRSwyQkFBSyxTQUFTLENBQUVBLFdBQWhCLEVBQXFDZixJQUFJLENBQUNnQixhQUFMLENBQW1CZCxRQUFRLENBQUN1RyxvQkFBNUIsQ0FBckMsQ0FERixjQUVFLDJCQUFLLFNBQVMsQ0FBRTFGLHVCQUFoQixDQUE4QixVQUFTLE9BQXZDLEtBQW9EZ0YsZUFBZSxDQUFDc0IsS0FBRCxDQUFuRSxjQUNFLDJCQUFLLFNBQVMsQ0FBRXRHLGdCQUFoQixlQUF5QyxxQ0FBekMsQ0FERixDQUZGLGNBS0UsMkJBQUssU0FBUyxDQUFFQSxjQUFoQixFQUF3Q2YsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDaUcsVUFBNUIsQ0FBeEMsQ0FMRixDQURGLGNBUUUsMkJBQUssU0FBUyxDQUFFcEYsZ0NBQWhCLGVBQ0UsMkJBQUssU0FBUyxDQUFFQSxXQUFoQixFQUFxQ2YsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDa0csY0FBNUIsQ0FBckMsQ0FERixjQUVFLDJCQUFLLFNBQVMsQ0FBRXJGLFFBQWhCLGVBQ0UsMkJBQUssU0FBUyxDQUFFc0YsbUJBQWhCLEVBREYsY0FFRSwyQkFBSyxTQUFTLENBQUV0RixjQUFoQixFQUF3Q3FGLGNBQXhDLENBRkYsQ0FGRixDQVJGLENBREYsY0FpQkUsMEJBQUksU0FBUyxDQUFFckYsU0FBZixlQUNFLDJDQUNFLDRCQUFNLFNBQVMsQ0FBRUEsV0FBakIsRUFBc0NmLElBQUksQ0FBQ2dCLGFBQUwsQ0FBbUJkLFFBQVEsQ0FBQ3dHLGdCQUE1QixDQUF0QyxLQURGLGNBRUUsNEJBQU0sU0FBUyxDQUFFM0YsVUFBakIsRUFBcUN1RyxVQUFyQyxDQUZGLENBREYsY0FLRSwyQ0FDRSw0QkFBTSxTQUFTLENBQUV2RyxXQUFqQixFQUFzQ2YsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDeUcsTUFBNUIsQ0FBdEMsS0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRTVGLFVBQWpCLEVBQXFDd0csVUFBckMsQ0FGRixDQUxGLGNBU0UsMkNBQ0UsNEJBQU0sU0FBUyxDQUFFeEcsV0FBakIsRUFBc0NmLElBQUksQ0FBQ2dCLGFBQUwsQ0FBbUJkLFFBQVEsQ0FBQzBHLEtBQTVCLENBQXRDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUU3RixVQUFqQixFQUFxQ3lHLFNBQXJDLENBRkYsQ0FURixjQWFFLDJDQUNFLDRCQUFNLFNBQVMsQ0FBRXpHLFdBQWpCLEVBQXNDZixJQUFJLENBQUNnQixhQUFMLENBQW1CZCxRQUFRLENBQUMyRyxVQUE1QixDQUF0QyxLQURGLGNBRUUsNEJBQU0sU0FBUyxDQUFFOUYsVUFBakIsRUFBcUM4RixVQUFVLENBQUNtQixjQUFYLEVBQXJDLENBRkYsQ0FiRixDQWpCRixjQW1DRSwyQkFBSyxTQUFTLENBQUVqSCxPQUFoQixlQUNFLCtCQUFNZixJQUFJLENBQUNnQixhQUFMLENBQW1CZCxRQUFRLENBQUM0RyxxQkFBNUIsQ0FBTixDQURGLGNBRUUsK0JBQU05RyxJQUFJLENBQUNnQixhQUFMLENBQW1CZCxRQUFRLENBQUM2RyxzQkFBNUIsQ0FBTixDQUZGLENBbkNGLENBd0NHZ0IsVUFBVSxDQUFDdEcsR0FBWCxDQUFlLFNBQUN3RyxTQUFELENBQVlDLEtBQVoscUJBQ2QsMEJBQUksR0FBRyxDQUFFQSxLQUFULENBQWdCLFNBQVMsQ0FBRW5ILFlBQTNCLENBQWdELFVBQVMsY0FBekQsZUFDRSw0Q0FDRSwyQkFBSyxTQUFTLENBQUVBLGNBQWhCLEVBQXdDa0gsU0FBUyxDQUFDUCxLQUFsRCxDQURGLGNBRUUsMkJBQUssU0FBUyxDQUFFM0csb0JBQWhCLEVBQ0drSCxTQUFTLENBQUMxSCxXQURiLENBRkYsQ0FERixjQU9FLDJCQUFLLFNBQVMsQ0FBRVEsY0FBaEIsRUFBd0NnRixlQUFlLENBQUNrQyxTQUFTLENBQUNOLEtBQVgsQ0FBdkQsQ0FQRixDQURjLEVBQWYsQ0F4Q0gsQ0FERixDQXVERCxDQTlLRCxDQWdMQSwwREFBZXBCLFVBQWYsRTs7QUMxTUEsR0FBTTRCLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BQTBFLElBQXhFQyxVQUF3RSxNQUF4RUEsU0FBd0UsQ0FBN0RDLGlCQUE2RCxNQUE3REEsaUJBQTZELENBQTFDQyxpQkFBMEMsTUFBMUNBLGlCQUEwQyxDQUM3RixtQkFDRSwyQkFBSyxTQUFTLENBQUVGLFNBQWhCLEVBQ0lDLGlCQUFpQixFQUFJQyxpQkFBdEIsY0FDRyxvQkFBQyxxQkFBRCxFQUFZLFVBQVUsQ0FBRUQsaUJBQXhCLEVBREgsY0FFRyxvQkFBQyxlQUFELE1BSE4sQ0FERixDQVFELENBVEQsQ0FXQSxpREFBZUYsWUFBZixFOzs7OztBQ2hCQTtBQUNBLFFBQVNJLFVBQVQsQ0FBbUJDLEdBQW5CLENBQStCQyxLQUEvQixDQUE2QyxDQUMzQyxNQUFPQyxpQkFBTSxDQUFDRixHQUFELENBQU4sQ0FBWUMsS0FBWixDQUFrQkEsS0FBbEIsRUFBeUJFLEdBQXpCLENBQTZCLEtBQTdCLENBQVAsQ0FDRCxDQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUNBLFFBQVNDLFVBQVQsTUFVZ0IsSUFUZEMsTUFTYyxNQVRkQSxLQVNjLENBUmRDLE9BUWMsTUFSZEEsT0FRYyxDQVBkQyxPQU9jLE1BUGRBLE9BT2MsQ0FOZEMsT0FNYyxNQU5kQSxPQU1jLENBQ2QsR0FBTUMsZ0JBQTJCLENBQUcsQ0FDbEMsYUFBYyxDQUNaLE1BRFksQ0FFWixDQUFDLEtBQUQsQ0FBUUosS0FBUixDQUZZLENBR1pOLFNBQVMsQ0FBQ2pDLFNBQUQsQ0FBc0JBLHFCQUF0QixDQUhHLENBSVp3QyxPQUpZLENBS1pQLFNBQVMsQ0FBQ2pDLFNBQUQsQ0FBc0JBLHFCQUF0QixDQUxHLENBTVp5QyxPQU5ZLENBT1pSLFNBQVMsQ0FBQ2pDLFNBQUQsQ0FBc0JBLHFCQUF0QixDQVBHLENBUVowQyxPQVJZLENBU1pULFNBQVMsQ0FBQ2pDLFNBQUQsQ0FBc0JBLHFCQUF0QixDQVRHLENBRG9CLENBQXBDLENBYUEsTUFBTzJDLGdCQUFQLENBQ0QsQ0FFRCxHQUFNQyxZQUFXLENBQUc1QyxRQUFBLENBQXFCLEVBQXJCLENBQTBCLEtBQTlDLENBRU8sR0FBTTZDLGFBQVksQ0FBRyxRQUFmQSxhQUFlLENBQUNDLGFBQUQsQ0FBMEMsY0FDcEUsTUFBTyxDQUNMLFVBQVcsQ0FETixDQUVMLHFCQUNFLFFBQVMsQ0FDUCxPQUFRLFFBREQsQ0FFUCxRQUNGLDhEQUMrREYsV0FEL0QscUVBRStEQSxXQUYvRCxxRUFHK0RBLFdBSC9ELHFFQUkrREEsV0FKL0QsUUFIUyxDQVNQLFVBQVc1QyxlQVRKLENBVVAsVUFBV0EsZUFWSixDQURYLENBYUUsTUFBTyxDQUNMLE9BQVEsUUFESCxDQUVMLFFBQVMsQ0FDUCwwREFETyxDQUZKLENBS0wsVUFBV0EsZUFMTixDQU1MLFVBQVdBLGVBTk4sQ0FiVCxXQXFCR0Esc0JBckJILEVBcUJzQyxDQUNwQztBQUNBO0FBQ0E7QUFDRSxPQUFRLFFBSjBCLENBS2xDO0FBQ0E7QUFDQSxZQUFhQSxjQVBxQixDQVFsQyxRQUFTLENBQ1AsY0FBZ0I4QyxjQUFoQixDQUNBOUMsd0JBQUEsQ0FBbUM4QyxhQUFhLENBQUMsWUFBRCxDQUFoRCxDQURBLENBRUE5QywwQkFITyxDQVJ5QixDQWFsQztBQUNBO0FBQ0E7QUFDQSxVQUFXQSxvQkFoQnVCLENBaUJsQyxVQUFXQSxvQkFqQnVCLENBckJ0QyxVQXdDR0EscUJBeENILEVBd0NxQyxDQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNFLE9BQVEsUUFMeUIsQ0FNakMsWUFBYUEsY0FOb0IsQ0FPakMsUUFBUyxDQUNQLGFBQWU4QyxjQUFmLENBQ0E5Qyx3QkFBQSxDQUFtQzhDLGFBQWEsQ0FBQyxXQUFELENBQWhELENBREEsQ0FFQTlDLHlCQUNGO0FBQ0E7QUFMUyxDQVB3QixDQWNqQyxVQUFXQSxtQkFkc0IsQ0FlakMsVUFBV0EsbUJBZnNCLENBeENyQyxVQXlERSxRQXpERixFQXlEWSxDQUNSLE9BQVEsUUFEQSxDQUVSLFFBQVMsa0ZBQzBFNEMsV0FEMUUseUZBRTBFQSxXQUYxRSx5RkFHMEVBLFdBSDFFLHlGQUkwRUEsV0FKMUUsUUFGRCxDQXpEWixVQUZLLENBcUVMLFNBQVUsQ0FDUixDQUNFLEtBQU0sT0FEUixDQUVFLFNBQVUsT0FGWixDQUdFLE9BQVEsUUFIVixDQUlFLFVBQVc1QyxlQUpiLENBS0UsVUFBV0EsZUFMYixDQURRLENBUVIsQ0FDRSxLQUFNLEtBRFIsQ0FFRSxTQUFVLEtBRlosQ0FHRSxPQUFRLFFBSFYsQ0FJRSxTQUFVLENBQ1Y7QUFDRSxhQUFjLE1BRk4sQ0FKWixDQVFFLFVBQVdBLGVBUmIsQ0FTRSxVQUFXQSxlQVRiLENBUlEsQ0FtQlIsQ0FDRSxLQUFNQSxxQkFEUixDQUVFLFNBQVVBLHNCQUZaLENBR0UsZUFBZ0JBLGtCQUhsQixDQUlFLE9BQVEsTUFKVixDQUtFLFFBQVNzQyxTQUFTLENBQUMsQ0FDakJDLEtBQUssQ0FBRXZDLG1CQURVLENBRWpCd0MsT0FBTyxDQUFFeEMsa0JBRlEsQ0FHakJ5QyxPQUFPLENBQUV6Qyx3QkFIUSxDQUlqQjBDLE9BQU8sQ0FBRTFDLDBCQUpRLENBQUQsQ0FMcEIsQ0FXRSxVQUFXQSxvQkFYYixDQW5CUSxDQWdDUixDQUNFLEtBQU1BLG9CQURSLENBRUUsU0FBVUEscUJBRlosQ0FHRSxlQUFnQkEsa0JBSGxCLENBSUUsT0FBUSxNQUpWLENBS0UsU0FBVSxDQUFDLEtBQUQsQ0FDUixDQUFDLEdBQUQsQ0FBTUEsa0JBQU4sQ0FBb0NBLHdCQUFwQyxDQURRLENBTFosQ0FRRSxRQUFTc0MsU0FBUyxDQUFDLENBQ2pCQyxLQUFLLENBQUV2QyxrQkFEVSxDQUVqQndDLE9BQU8sQ0FBRXhDLGtCQUZRLENBR2pCeUMsT0FBTyxDQUFFekMsd0JBSFEsQ0FJakIwQyxPQUFPLENBQUUxQywwQkFKUSxDQUFELENBUnBCLENBY0UsVUFBV0EsbUJBZGIsQ0FlRSxVQUFXQSxtQkFmYixDQWhDUSxDQWlEUixDQUNBO0FBQ0UsS0FBTSxtQkFGUixDQUdFLE9BQVEsUUFIVixDQUlFLFNBQVUsUUFKWixDQUtFLFVBQVdBLGVBTGIsQ0FNRSxVQUFXQSxlQU5iLENBakRRLENBckVMLENBQVAsQ0FnSUQsQ0FqSU0sQzs7QUNoRFA7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwwQkFBWSx3Qzs7QUNOdkIsbUMsQ0FDQTtBQWlCQTtBQUdBO0FBS0E7QUFnQkMsQ0FRQSxDQUVELEdBQU0rQyxPQUFNLENBQUcsUUFBVEEsT0FBUyxNQUErQixJQUE3QkMsU0FBNkIsTUFBN0JBLFFBQTZCLENBQzVDO0FBQ0EsMEJBQXlCQSxRQUFRLENBQUNDLElBQVQsQ0FBY0MsS0FBZCxDQUFvQixDQUFwQixFQUF1QkMsS0FBdkIsQ0FBNkIsR0FBN0IsQ0FBekIsQ0FBT0MsSUFBUCwwQkFBYUMsR0FBYiwwQkFBa0JDLEdBQWxCLDBCQUNBLGNBQWdDQyxrQkFBUSxDQUFnQixDQUN0REMsUUFBUSxDQUFFSCxHQUFHLEVBQUlJLFVBQVUsQ0FBQ0osR0FBRCxDQUFqQixFQUEwQnJELGlCQURrQixDQUV0RDBELFNBQVMsQ0FBRUosR0FBRyxFQUFJRyxVQUFVLENBQUNILEdBQUQsQ0FBakIsRUFBMEJ0RCxpQkFGaUIsQ0FHdERvRCxJQUFJLENBQUVBLElBQUksRUFBSUssVUFBVSxDQUFDTCxJQUFELENBQWxCLEVBQTRCcEQsZUFIb0IsQ0FBaEIsQ0FBeEMsQ0FBTzJELFFBQVAsY0FBaUJDLFdBQWpCLGNBTUEsZUFBOENMLGtCQUFRLEVBQXRELENBQU9NLGVBQVAsZUFBd0JDLGtCQUF4QixlQUNBLGVBQTRDUCxrQkFBUSxFQUFwRCxDQUFPUSxjQUFQLGVBQXVCQyxpQkFBdkIsZUFDQSxlQUF3RFQsa0JBQVEsQ0FBVSxLQUFWLENBQWhFLENBQU9VLG9CQUFQLGVBQTZCQyx1QkFBN0IsZUFDQSxlQUEwRFgsa0JBQVEsQ0FBVSxLQUFWLENBQWxFLENBQU9ZLHFCQUFQLGVBQThCQyx3QkFBOUIsZUFDQSxlQUFnRGIsa0JBQVEsQ0FBVSxLQUFWLENBQXhELENBQU9jLGdCQUFQLGVBQXlCQyxtQkFBekIsZUFFQSxHQUFNQyxPQUFNLENBQUdDLGdCQUFNLENBQVMsSUFBVCxDQUFyQixDQUNBLEdBQU1DLE1BQUssQ0FBR0MsZ0NBQVEsRUFBdEIsQ0FFQSxHQUFNMUMsa0JBQWlCLENBQUk2QixlQUFlLEVBQUlBLGVBQWUsQ0FBQzlKLEVBQXBDLEVBQTJDLEVBQXJFLENBQ0EsR0FBTTRLLE9BQU0sQ0FBR0MsaUJBQU8sQ0FBQyxpQkFBTSxDQUFDLElBQUQsQ0FBTzVFLGNBQVAsQ0FBaUNnQyxpQkFBakMsQ0FBTixFQUFELENBQTRELENBQUM2QixlQUFELENBQTVELENBQXRCLENBRUEsR0FBTS9JLFFBQU8sQ0FBRyxRQUFWQSxRQUFVLENBQUMrSixLQUFELENBQXFCLENBQ25DLEdBQU1DLFFBQU8sQ0FBR0QsS0FBSyxDQUFDRSxRQUFOLEVBQWtCRixLQUFLLENBQUNFLFFBQU4sQ0FBZSxDQUFmLENBQWxDLENBQ0EsR0FBSUQsT0FBSixDQUFhLENBQ1gsVUFBeUNFLEVBQUksQ0FBQ0YsT0FBRCxDQUE3QyxDQUFPRyxNQUFQLFVBQWVDLE1BQWYsVUFBdUJDLE1BQXZCLFVBQStCQyxNQUEvQixVQUNBLEdBQU1DLFlBQVcsQ0FBRyxHQUFJQyxvQkFBSixDQUF3QixDQUFDQyxNQUFNLENBQUU1QixRQUFRLENBQUM0QixNQUFsQixDQUEyQkMsS0FBSyxDQUFFN0IsUUFBUSxDQUFDNkIsS0FBM0MsQ0FBeEIsQ0FBcEIsQ0FDQSwwQkFBb0NILFdBQVcsQ0FBQ0ksU0FBWixDQUNoQyxDQUNFLENBQUNSLE1BQUQsQ0FBU0MsTUFBVCxDQURGLENBRUUsQ0FBQ0MsTUFBRCxDQUFTQyxNQUFULENBRkYsQ0FEZ0MsQ0FLaEMsQ0FDRU0sT0FBTyxDQUFFLEVBRFgsQ0FMZ0MsQ0FBcEMsQ0FBT2hDLFNBQVAsdUJBQU9BLFNBQVAsQ0FBa0JGLFFBQWxCLHVCQUFrQkEsUUFBbEIsQ0FBNEJKLEtBQTVCLHVCQUE0QkEsSUFBNUIsQ0FTQSxHQUFJMEIsT0FBTyxDQUFDL0ssRUFBUixHQUFlaUksaUJBQW5CLENBQXNDLENBQ3BDOEIsa0JBQWtCLENBQUNnQixPQUFELENBQWxCLENBQ0QsQ0FGRCxJQUVPLENBQ0xoQixrQkFBa0IsQ0FBQzZCLFNBQUQsQ0FBbEIsQ0FDRCxDQUNELEdBQU1DLFVBQVMsQ0FBRyxDQUNoQmxDLFNBQVMsQ0FBRUEsU0FESyxDQUVoQkYsUUFBUSxDQUFFQSxRQUZNLENBR2hCSixJQUFJLENBQUVBLEtBSFUsQ0FJaEJsRCxVQUFVLENBQUU0RSxPQUFPLENBQUM1RSxVQUpKLENBQWxCLENBTUEyRixTQUFTLENBQUMsQ0FDUixDQUFDWixNQUFELENBQVNDLE1BQVQsQ0FEUSxDQUVSLENBQUNDLE1BQUQsQ0FBU0MsTUFBVCxDQUZRLENBQUQsQ0FBVCxDQUlBcEIsaUJBQWlCLENBQUM0QixTQUFELENBQWpCLENBQ0QsQ0FDRixDQS9CRCxDQWlDQSxHQUFNRSxPQUFNLENBQUcsUUFBVEEsT0FBUyxFQUFNLENBQ25CLEdBQUksTUFBT0MsT0FBUCxHQUFrQixXQUFsQixFQUFpQ0EsTUFBTSxDQUFDQyxPQUF4QyxFQUFtRHpCLE1BQU0sQ0FBQzBCLE9BQTlELENBQXVFLENBQ3JFRixNQUFNLENBQUNHLGFBQVAsQ0FBdUIzQixNQUFNLENBQUMwQixPQUFQLENBQWVFLE1BQWYsRUFBdkIsQ0FDRCxDQUVELEdBQUk1RyxxQkFBSixDQUFjK0UsbUJBQW1CLENBQUMsSUFBRCxDQUFuQixDQUNmLENBTkQsQ0FTQSxHQUFNdUIsVUFBUyxDQUFHLFFBQVpBLFVBQVksQ0FBQ08sTUFBRCxDQUErQixDQUMvQywwQkFBb0MsR0FBSWQsb0JBQUosQ0FBd0IsQ0FBQ0MsTUFBTSxDQUFFNUIsUUFBUSxDQUFDNEIsTUFBbEIsQ0FBMkJDLEtBQUssQ0FBRTdCLFFBQVEsQ0FBQzZCLEtBQTNDLENBQXhCLEVBQy9CQyxTQUQrQixDQUNyQlcsTUFEcUIsQ0FDMkIsQ0FDekRWLE9BQU8sQ0FBRSxFQURnRCxDQUV6RFcsTUFBTSxDQUFFLENBQUMsQ0FBRCxDQUFJLENBQUMsR0FBTCxDQUZpRCxDQUQzQixDQUFwQyxDQUFPM0MsU0FBUCx1QkFBT0EsU0FBUCxDQUFrQkYsUUFBbEIsdUJBQWtCQSxRQUFsQixDQUE0QkosSUFBNUIsdUJBQTRCQSxJQUE1QixDQUtBUSxXQUFXLGtCQUNORCxRQURNLEVBRVRELFNBQVMsQ0FBVEEsU0FGUyxDQUdURixRQUFRLENBQVJBLFFBSFMsQ0FJVEosSUFBSSxDQUFKQSxJQUpTLENBS1RrRCxrQkFBa0IsQ0FBRSxJQUxYLENBTVRDLHNCQUFzQixDQUFFLEdBQUlDLDBCQUFKLEVBTmYsQ0FPVEMsZ0JBQWdCLENBQUVDLFVBUFQsR0FBWCxDQVNELENBZkQsQ0FpQkEsR0FBTTlMLDRCQUEyQixDQUFHLFFBQTlCQSw0QkFBOEIsQ0FBQ2lLLEtBQUQsQ0FBMEMsQ0FDNUVBLEtBQUssQ0FBQzhCLGVBQU4sR0FDQSxHQUFNQyxTQUFRLENBQUcvQixLQUFLLENBQUNnQyxNQUFOLEVBQWlCaEMsS0FBSyxDQUFDZ0MsTUFBUCxDQUE4QjlNLEVBQS9ELENBRUEsT0FBUTZNLFFBQVIsRUFDRSxJQUFLLElBQUwsQ0FDRWYsU0FBUyxDQUFDN0YsZUFBRCxDQUFULENBQ0EsTUFDRixJQUFLLElBQUwsQ0FDRTZGLFNBQVMsQ0FBQzdGLGFBQUQsQ0FBVCxDQUNBLE1BQ0YsSUFBSyxJQUFMLENBQ0U2RixTQUFTLENBQUM3RixhQUFELENBQVQsQ0FDQSxNQUNGLElBQUssSUFBTCxDQUNFNkYsU0FBUyxDQUFDN0Ysa0JBQUQsQ0FBVCxDQUNBLE1BRUYsUUFDRSxNQWZKLENBaUJELENBckJELENBdUJBLEdBQU04RyxrQkFBaUIsQ0FBRyxRQUFwQkEsa0JBQW9CLEVBQU0sQ0FDOUI1Qyx1QkFBdUIsQ0FBQyxJQUFELENBQXZCLENBQ0QsQ0FGRCxDQUlBLEdBQU02QyxnQkFBZSxDQUFHLFFBQWxCQSxnQkFBa0IsRUFBTSxDQUM1QjdDLHVCQUF1QixDQUFDLEtBQUQsQ0FBdkIsQ0FDRCxDQUZELENBSUEsR0FBTThDLFlBQVcsQ0FBRyxRQUFkQSxZQUFjLEVBQU0sQ0FDeEI1Qyx3QkFBd0IsQ0FBQyxLQUFELENBQXhCLENBQ0QsQ0FGRCxDQUlBLEdBQU02QyxpQkFBZ0IsQ0FBRyxRQUFuQkEsaUJBQW1CLEVBQU0sQ0FDN0I3Qyx3QkFBd0IsQ0FBQyxJQUFELENBQXhCLENBQ0QsQ0FGRCxDQUlBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRTNKLHdCQUFoQixlQUNFLG9CQUFDLGVBQUQsa0JBQ01rSixRQUROLEVBRUUsUUFBUSxDQUFFZCxZQUFZLENBQUM0QixLQUFELENBRnhCLENBR0UsT0FBTyxDQUFFekUsZUFIWCxDQUlFLE9BQU8sQ0FBRUEsZUFKWCxDQUtFLFVBQVUsQ0FBRSxDQUFDaUQsSUFBSSxDQUFFLElBQVAsQ0FMZCxDQU1FLEtBQUssQ0FBQyxNQU5SLENBT0UsTUFBTSxDQUFFb0IsZ0JBQWdCLENBQUcsTUFBSCxDQUFZLE1BUHRDLENBUUUsVUFBVSxDQUFFLEtBUmQsQ0FTRSxXQUFXLENBQUUsS0FUZixDQVVFLG1CQUFtQixDQUFFLENBQUNyRSxxQkFBRCxDQVZ2QixDQVdFLGdCQUFnQixDQUFFNEQsV0FYcEIsQ0FZRSxPQUFPLENBQUU5SSxPQVpYLENBYUUsTUFBTSxDQUFFZ0wsTUFiVixDQWNFLGlCQUFpQixDQUFFZ0IsaUJBZHJCLENBZUUsZUFBZSxDQUFFQyxlQWZuQixDQWdCRSxHQUFHLENBQUV4QyxNQWhCUCxDQWlCRSxVQUFTLFlBakJYLGdCQW1CRSxvQkFBQyxNQUFELEVBQ0UsRUFBRSxDQUFFdkUsc0JBRE4sQ0FFRSxJQUFJLENBQUMsUUFGUCxDQUdFLFNBQVMsQ0FBRUEsY0FIYixDQUlFLEtBQUssQ0FBRSxDQUFDQSwwQkFBRCxDQUpULENBS0UsT0FBTyxDQUFFQSxvQkFMWCxDQU1FLE9BQU8sQ0FBRUEsb0JBTlgsZUFRRSxvQkFBQyxnQkFBRCxFQUNFLEVBQUUsQ0FBRUEsK0NBRE4sQ0FFRSxlQUFjQSxrQkFGaEIsQ0FHRSxJQUFJLENBQUMsTUFIUCxDQUlFLEtBQUssQ0FBRSxDQUNMLGFBQWNBLHFCQURULENBRUwsYUFBY0Esc0NBRlQsQ0FHTCxlQUFnQkEsd0NBSFgsQ0FKVCxDQVNFLE9BQU8sQ0FBRUEseUJBVFgsQ0FVRSxPQUFPLENBQUVBLHlCQVZYLEVBUkYsY0FxQkUsb0JBQUMsZ0JBQUQsRUFDRSxFQUFFLENBQUVBLCtCQUROLENBRUUsSUFBSSxDQUFDLE1BRlAsQ0FHRSxlQUFjQSxrQkFIaEIsQ0FJRSxLQUFLLENBQUUsQ0FDTCxhQUFjQSxzQkFEVCxDQUVMLGFBQWNBLHNCQUZULENBSlQsQ0FRRSxNQUFNLENBQUUyRSxNQVJWLENBU0UsT0FBTyxDQUFFM0Usb0JBVFgsRUFyQkYsQ0FuQkYsQ0FvREksTUFBUXlFLE1BQVIsRUFBaUJWLGNBQWpCLEVBQW1DLENBQUNFLG9CQUFyQyxlQUNDLG9CQUFDLEtBQUQsRUFDRSxTQUFTLENBQUV4SixRQURiLENBRUUsT0FBTyxDQUFFLENBRlgsQ0FHRSxNQUFNLENBQUMsS0FIVCxDQUlFLFNBQVMsQ0FBRXNKLGNBQWMsQ0FBQ0wsU0FKNUIsQ0FLRSxRQUFRLENBQUVLLGNBQWMsQ0FBQ1AsUUFMM0IsQ0FNRSxZQUFZLENBQUUsSUFOaEIsQ0FPRSxPQUFPLENBQUVRLGlCQVBYLENBUUUsYUFBYSxDQUFFLElBUmpCLGVBVUUsb0JBQUMscUJBQUQsRUFBWSxVQUFVLENBQUVELGNBQWMsQ0FBQzdELFVBQXZDLEVBVkYsQ0FyREosY0FrRUUsb0JBQUMsa0JBQUQsRUFDRSxXQUFXLENBQUUsS0FEZixDQUVFLFNBQVMsQ0FBRXpGLGlCQUZiLEVBbEVGLENBc0VHLE1BQVFnSyxNQUFSLGNBQWdCLG9CQUFDLGlCQUFELEVBQ2YsU0FBUyxDQUFFaEssZ0JBREksQ0FFZixlQUFlLENBQUUsQ0FBQ3lNLGtCQUFrQixDQUFFLElBQXJCLENBRkYsQ0FHZixXQUFXLENBQUVGLFdBQ2I7QUFKZSxDQUtmLE9BQU8sQ0FBRUMsZ0JBTE0sRUFBaEIsQ0FNSSxFQTVFUCxDQTZFRzlDLHFCQUFxQixjQUFHLDREQUFILENBQTJDLEVBN0VuRSxjQThFRSxvQkFBQyxxQkFBRCxFQUF1QiwyQkFBMkIsQ0FBRXZKLDJCQUFwRCxFQTlFRixDQStFRyxNQUFRNkosTUFBUixjQUFnQixvQkFBQyxrQkFBRCxFQUFtQixTQUFTLENBQUVoSyxpQkFBOUIsRUFBaEIsQ0FBMkUsRUEvRTlFLENBREYsY0FrRkUsb0JBQUMsWUFBRCxFQUNFLFNBQVMsQ0FBRUEsMEJBRGIsQ0FFRSxpQkFBaUIsQ0FBRXNKLGNBQUYsU0FBRUEsY0FBRixpQkFBRUEsY0FBYyxDQUFFN0QsVUFGckMsQ0FHRSxpQkFBaUIsQ0FBRTJELGVBQUYsU0FBRUEsZUFBRixpQkFBRUEsZUFBZSxDQUFFOUosRUFIdEMsRUFsRkYsQ0FERixDQTBGRCxDQWpORCxDQW1OQSxzREFBZWdKLE1BQWYsRTs7QUN2UUE7QUFDTyx3RTs7QUNhUCxHQUFNb0UsV0FBVSxDQUFHLFFBQWJBLFdBQWEsTUFBa0MsSUFBaENuRSxTQUFnQyxNQUFoQ0EsUUFBZ0MsQ0FDbkQsR0FBTXRKLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLDhCQUFjLENBQUMsQ0FDOUJ1TixnQkFBZ0IsQ0FBRSxDQUNoQnJOLEVBQUUsQ0FBRSwwQkFEWSxDQUVoQkMsY0FBYyxDQUFFLHVGQUZBLENBR2hCQyxXQUFXLENBQUUsNEJBSEcsQ0FEWSxDQU05Qm9OLGdCQUFnQixDQUFFLENBQ2hCdE4sRUFBRSxDQUFFLDhCQURZLENBRWhCQyxjQUFjLENBQUUsaUVBRkEsQ0FHaEJDLFdBQVcsQ0FBRSx3QkFIRyxDQU5ZLENBQUQsQ0FBL0IsQ0FZQSxtQkFDRSxxREFDRSxvQkFBQywyQkFBRCxFQUFjLGFBQWEsQ0FBRSxLQUE3QixDQUFvQyxvQkFBb0IsQ0FBRSxJQUExRCxFQURGLGNBRUUsb0JBQUMsaUJBQUQsRUFBUSxRQUFRLENBQUUrSSxRQUFsQixFQUZGLGNBR0UsMkJBQUssU0FBUyxDQUFFdkksa0JBQWhCLGVBQ0UseUJBQUcsSUFBSSxDQUFFdUYsZ0JBQVQsRUFDR3RHLElBQUksQ0FBQ2dCLGFBQUwsQ0FBbUJkLFFBQVEsQ0FBQ3dOLGdCQUE1QixDQURILENBREYsQ0FIRixjQVFFLCtCQUFNMU4sSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQmQsUUFBUSxDQUFDeU4sZ0JBQTVCLENBQU4sQ0FSRixDQURGLENBWUQsQ0ExQkQsQ0E2QkEsMERBQWVGLFVBQWYsRTs7OztBQzNDQTtBQUNPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDRCQUFXO0FBQ2YsSUFBSSwwQkFBUztBQUNiLElBQUksK0JBQWM7QUFDbEI7QUFDQSxvRDs7QUNiUCxpREFBZSxvQkFBb0Isd2Q7O3VDQ09uQztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsR0FBTUcsVUFBUyxDQUFHLFFBQVpBLFVBQVksRUFBTSxDQUN0QixHQUFNNU4sS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUVBO0FBQ0E7QUFNQSxHQUFNNE4sWUFBOEQsY0FBR0MsZ0JBQUEsQ0FDbkUsY0FBMkRDLEdBQTNELEtBQUUzRixVQUFGLE1BQUVBLFNBQUYsQ0FBYTRGLFFBQWIsTUFBYUEsUUFBYixDQUEwQkMsWUFBMUIsa0VBQ0UseUNBQUssR0FBRyxDQUFFRixHQUFWLENBQWUsU0FBUyxDQUFFaE4sZUFBMUIsRUFBc0RrTixZQUF0RCxFQUNHRCxRQURILENBREYsRUFEbUUsQ0FBdkUsQ0FPQUgsV0FBVyxDQUFDSyxXQUFaLENBQTBCLHFCQUExQixDQUVBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRW5OLGVBQWhCLGVBQ0UsMEJBQUksU0FBUyxDQUFFQSxZQUFmLEVBQXFDZixJQUFJLENBQUNnQixhQUFMLENBQW1Cc0YsbUNBQW5CLENBQXJDLENBREYsY0FFRSwyQkFBSyxTQUFTLENBQUV2RixlQUFoQixlQUNFLDJCQUFLLFNBQVMsQ0FBRUEsVUFBaEIsZUFDRSwyQkFBSyxTQUFTLENBQUVBLFdBQWhCLENBQW9DLEVBQUUsQ0FBRUEsNEJBQXhDLEVBREYsY0FFRSxnQ0FBT2YsSUFBSSxDQUFDZ0IsYUFBTCxDQUFtQnNGLHFDQUFuQixDQUFQLENBRkYsY0FLRSxvQkFBQyx1QkFBRCxFQUNFLEtBQUssb0lBRFAsQ0FNRSxRQUFRLENBQUMsTUFOWCxDQU9FLFFBQVEsQ0FBRXVILFdBUFosZUFRRSwyQkFBSyxTQUFTLENBQUU5TSxRQUFoQixDQUFpQyxHQUFHLENBQUVvTixZQUF0QyxFQVJGLENBTEYsQ0FERixjQWtCRSwyQkFBSyxTQUFTLENBQUVwTixVQUFoQixlQUNFLDJCQUFLLFNBQVMsQ0FBRUEsV0FBaEIsQ0FBb0MsRUFBRSxDQUFFQSwwQkFBeEMsRUFERixjQUVFLGdDQUFPZixJQUFJLENBQUNnQixhQUFMLENBQW1Cc0Ysc0NBQW5CLENBQVAsQ0FGRixjQUtFLG9CQUFDLHVCQUFELEVBQ0UsS0FBSyxzSUFEUCxDQU1FLFFBQVEsQ0FBQyxNQU5YLENBT0UsUUFBUSxDQUFFdUgsV0FQWixlQVFFLDJCQUFLLFNBQVMsQ0FBRTlNLFFBQWhCLENBQWlDLEdBQUcsQ0FBRW9OLFlBQXRDLEVBUkYsQ0FMRixDQWxCRixDQUZGLENBREYsQ0F3Q0QsQ0EzREQsQ0E2REEseURBQWVQLFNBQWYsRTs7QUNwSEE7QUFDTztBQUNBO0FBQ0EseUU7O0FDZVAsR0FBTVEsVUFBUyxDQUFHLFFBQVpBLFVBQVksTUFBK0IsSUFBN0I5RSxTQUE2QixNQUE3QkEsUUFBNkIsQ0FDL0M7QUFDQTtBQUNBLG1CQUFRLG9CQUFDLHFCQUFELEVBQVEsUUFBUSxDQUFFQSxRQUFsQixlQUNOLG9CQUFDLG1DQUFELG1CQUNFLG9CQUFDLDJCQUFELEVBQWMsYUFBYSxDQUFFLElBQTdCLENBQW1DLG9CQUFvQixDQUFFLEtBQXpELEVBREYsQ0FETSxjQUtOLG9CQUFDLG1DQUFELEVBQXNCLFNBQVMsQ0FBRSxrQkFBakMsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUFVLG9CQUFDLG9CQUFELEVBQU0sR0FBRyxLQUFULGVBQ1IsZ0RBQ0UsMEJBQUksU0FBUyxDQUFFdkksaUJBQWYscUJBREYsY0FFRSwyQkFBSyxTQUFTLENBQUVBLG9CQUFoQixlQUNFLDJCQUFLLFNBQVMsQ0FBRUEscUJBQWhCLGVBQ0UsOFJBTUUsb0JBQUMsdUJBQUQsRUFBTSxFQUFFLENBQUUsY0FBVix1QkFORixhQURGLENBREYsY0FhRSxvQkFBQyxvQkFBRCxNQWJGLENBRkYsQ0FEUSxDQUFWLENBREYsY0FzQkUsb0JBQUMsb0JBQUQsRUFBTSxHQUFHLEtBQVQsZUFBVSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUNSLGdEQUNFLG9CQUFDLHFCQUFELEVBQVksUUFBUSxDQUFFdUksUUFBdEIsRUFERixDQURRLENBQVYsQ0F0QkYsY0E0QkUsb0JBQUMsb0JBQUQsRUFBTSxHQUFHLEtBQVQsZUFBVSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUNSLGdEQUNFLG9CQUFDLHdCQUFELE1BREYsQ0FEUSxDQUFWLENBNUJGLENBTE0sQ0FBUixDQXdDRCxDQTNDRCxDQTZDQSwwQ0FBZThFLFNBQWYiLCJmaWxlIjoiNjY2Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBob3dZb3VDYW5IZWxwQ29udGFpbmVyID0gXCJob3dZb3VDYW5IZWxwLW1vZHVsZS0taG93WW91Q2FuSGVscENvbnRhaW5lci0tM3djb3dcIjtcbmV4cG9ydCB2YXIgaG93WW91Q2FuSGVscFRleHQgPSBcImhvd1lvdUNhbkhlbHAtbW9kdWxlLS1ob3dZb3VDYW5IZWxwVGV4dC0tMzhIU0FcIjtcbmV4cG9ydCB2YXIgaG93WW91Q2FuSGVscEhlYWRlciA9IFwiaG93WW91Q2FuSGVscC1tb2R1bGUtLWhvd1lvdUNhbkhlbHBIZWFkZXItLTE2QTFrXCI7XG5leHBvcnQgdmFyIGhvd1lvdUNhbkhlbHBMaXN0ID0gXCJob3dZb3VDYW5IZWxwLW1vZHVsZS0taG93WW91Q2FuSGVscExpc3QtLTN3eUZ2XCI7XG5leHBvcnQgdmFyIGhvd1lvdUNhbkhlbHBMaXN0V3JhcHBlciA9IFwiaG93WW91Q2FuSGVscC1tb2R1bGUtLWhvd1lvdUNhbkhlbHBMaXN0V3JhcHBlci0tQkw3QURcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2hvd1lvdUNhbkhlbHAubW9kdWxlLnNjc3MnO1xuXG5jb25zdCBIb3dZb3VDYW5IZWxwID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICB5b3VDYW5IZWxwSGVhZGVyOiB7XG4gICAgICBpZDogJ2hvd1lvdUNhbkhlbHAuaGVhZGVyLnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdIb3cgWW91IENhbiBIZWxwIEltcHJvdmUgdGhlIFRvb2wnLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgaGVhZGVyIG9mIHRoZSBob3cgeW91IGNhbiBoZWxwIHNlY3Rpb24nLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscEluZm9UZXh0OiB7XG4gICAgICBpZDogJ3lvdUNhbkhlbHBJbmZvVGV4dC5saXN0LmVsZW1lbnQucHJlZml4JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSWYgeW91IGhhdmUgaGVscGZ1bCBpbmZvcm1hdGlvbiwgd2XigJlkIGxvdmUgdG8nLFxuICAgICAgZGVzY3JpcHRpb246ICd5b3UgY2FuIGhlbHAgaW5mbyB0ZXh0ICcsXG4gICAgfSxcbiAgICB5b3VDYW5IZWxwSW5mb0xpbmtUZXh0OiB7XG4gICAgICBpZDogJ3lvdUNhbkhlbHBJbmZvTGluay5saW5rLnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdnZXQgYW4gZW1haWwgZnJvbSB5b3UnLFxuICAgICAgZGVzY3JpcHRpb246ICd5b3UgY2FuIGhlbHAgaW5mbyB0ZXh0ICcsXG4gICAgfSxcbiAgICB5b3VDYW5IZWxwRGF0YU1ldGhQcmVmaXhUZXh0OiB7XG4gICAgICBpZDogJ3lvdUNhbkhlbHBEYXRhTWV0aFByZWZpeFRleHQubGluay5wcmVmaXgudGV4dCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1ZpZXcgb3VyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAndmlldyBvdXInLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscERhdGFNZXRoTGlua1RleHQ6IHtcbiAgICAgIGlkOiAneW91Q2FuSGVscERhdGFNZXRoTGlua1RleHQubGluay50ZXh0JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YSAmIG1ldGhvZG9sb2d5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGF0YSAmIG1ldGhvZG9sb2d5IGxpbmsnLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscERhdGFNZXRoU3VmZml4VGV4dDoge1xuICAgICAgaWQ6ICd5b3VDYW5IZWxwRGF0YU1ldGhTdWZmaXhUZXh0Lmxpbmsuc3VmZml4LnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdhbmQgc2VuZCB1cyBmZWVkYmFjaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ3NlbmQgdXMgZmVlZGJhY2t2IHZpYSBlbWFpbCcsXG4gICAgfSxcbiAgICB5b3VDYW5IZWxwU2hhcmluZ1ByZWZpeFRleHQ6IHtcbiAgICAgIGlkOiAneW91Q2FuSGVscFNoYXJpbmdQcmVmaXhUZXh0LmxpbmsucHJlZml4LnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGaW5kIHlvdXIgY29tbXVuaXR5IGFuZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ2ZpbmQgeW91ciBjb21tdW5pdHknLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscFNoYXJpbmdMaW5rVGV4dDoge1xuICAgICAgaWQ6ICd5b3VDYW5IZWxwU2hhcmluZ0xpbmtUZXh0LmxpbmsudGV4dCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ3NoYXJlIHlvdXIgZmVlZGJhY2snLFxuICAgICAgZGVzY3JpcHRpb246ICdzaGFyaW5nIGxpbmsgdG8gZW1haWwnLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5ob3dZb3VDYW5IZWxwQ29udGFpbmVyfT5cbiAgICAgIDxoMiBjbGFzc05hbWU9e3N0eWxlcy5ob3dZb3VDYW5IZWxwSGVhZGVyfT5cbiAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwSGVhZGVyKX1cbiAgICAgIDwvaDI+XG4gICAgICA8dWwgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3RXcmFwcGVyfT5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBMaXN0fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBUZXh0fT5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMueW91Q2FuSGVscEluZm9UZXh0KX1cbiAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICA8YSBocmVmPXsnbWFpbHRvOnNjcmVlbmluZ3Rvb2wuZmVlZGJhY2tAdXNkcy5nb3YnfT5cbiAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwSW5mb0xpbmtUZXh0KX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIHtgIGB9LlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3R9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscFRleHR9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwRGF0YU1ldGhQcmVmaXhUZXh0KX1cbiAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICA8TGluayB0bz17Jy9tZXRob2RvbG9neSd9PlxuICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnlvdUNhbkhlbHBEYXRhTWV0aExpbmtUZXh0KX1cbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnlvdUNhbkhlbHBEYXRhTWV0aFN1ZmZpeFRleHQpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3R9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscFRleHR9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwU2hhcmluZ1ByZWZpeFRleHQpfVxuICAgICAgICAgICAge2AgYH1cbiAgICAgICAgICAgIDxhIGhyZWY9eydtYWlsdG86c2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdid9PlxuICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnlvdUNhbkhlbHBTaGFyaW5nTGlua1RleHQpfVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAge2AgYH0uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSG93WW91Q2FuSGVscDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdO1xuXG4gIGlmIChfaSA9PSBudWxsKSByZXR1cm47XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuXG4gIHZhciBfcywgX2U7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufSIsImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheUxpbWl0IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufSIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5cbi8qKlxyXG4gKiBDb21tb24gdXRpbGl0aWVzXHJcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcclxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxyXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuICpcclxuICogQHBhcmFtIHtGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3J9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRNYXRyaXhBcnJheVR5cGUodHlwZSkge1xuICBBUlJBWV9UWVBFID0gdHlwZTtcbn1cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuLyoqXHJcbiAqIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBBbmdsZSBpbiBEZWdyZWVzXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SYWRpYW4oYSkge1xuICByZXR1cm4gYSAqIGRlZ3JlZTtcbn1cbi8qKlxyXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJndW1lbnRzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB2YWx1ZSwgd2l0aGluIGFuIGFic29sdXRlXHJcbiAqIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSBvZiBnbE1hdHJpeC5FUFNJTE9OIChhbiBhYnNvbHV0ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgdmFsdWVzIGxlc3NcclxuICogdGhhbiBvciBlcXVhbCB0byAxLjAsIGFuZCBhIHJlbGF0aXZlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciBsYXJnZXIgdmFsdWVzKVxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgbnVtYmVyIHRvIHRlc3QuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgbnVtYmVyIHRvIHRlc3QuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXJzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuaWYgKCFNYXRoLmh5cG90KSBNYXRoLmh5cG90ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgeSA9IDAsXG4gICAgICBpID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgeSArPSBhcmd1bWVudHNbaV0gKiBhcmd1bWVudHNbaV07XG4gIH1cblxuICByZXR1cm4gTWF0aC5zcXJ0KHkpO1xufTsiLCJpbXBvcnQgXCJjb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qc1wiO1xuaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogNCBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWM0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjNFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjNCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeiwgdykge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5jZWlsKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguZmxvb3IoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICBvdXRbM10gPSBNYXRoLm1pbihhWzNdLCBiWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByb3VuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzQncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSAtYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IHggKiBsZW47XG4gIG91dFsxXSA9IHkgKiBsZW47XG4gIG91dFsyXSA9IHogKiBsZW47XG4gIG91dFszXSA9IHcgKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjcm9zcy1wcm9kdWN0IG9mIHRocmVlIHZlY3RvcnMgaW4gYSA0LWRpbWVuc2lvbmFsIHNwYWNlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSByZXN1bHQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFUgdGhlIGZpcnN0IHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVyB0aGUgdGhpcmQgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSByZXN1bHRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIHUsIHYsIHcpIHtcbiAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLFxuICAgICAgQiA9IHZbMF0gKiB3WzJdIC0gdlsyXSAqIHdbMF0sXG4gICAgICBDID0gdlswXSAqIHdbM10gLSB2WzNdICogd1swXSxcbiAgICAgIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLFxuICAgICAgRSA9IHZbMV0gKiB3WzNdIC0gdlszXSAqIHdbMV0sXG4gICAgICBGID0gdlsyXSAqIHdbM10gLSB2WzNdICogd1syXTtcbiAgdmFyIEcgPSB1WzBdO1xuICB2YXIgSCA9IHVbMV07XG4gIHZhciBJID0gdVsyXTtcbiAgdmFyIEogPSB1WzNdO1xuICBvdXRbMF0gPSBIICogRiAtIEkgKiBFICsgSiAqIEQ7XG4gIG91dFsxXSA9IC0oRyAqIEYpICsgSSAqIEMgLSBKICogQjtcbiAgb3V0WzJdID0gRyAqIEUgLSBIICogQyArIEogKiBBO1xuICBvdXRbM10gPSAtKEcgKiBEKSArIEggKiBCIC0gSSAqIEE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIHZhciBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDsgLy8gTWFyc2FnbGlhLCBHZW9yZ2UuIENob29zaW5nIGEgUG9pbnQgZnJvbSB0aGUgU3VyZmFjZSBvZiBhXG4gIC8vIFNwaGVyZS4gQW5uLiBNYXRoLiBTdGF0aXN0LiA0MyAoMTk3MiksIG5vLiAyLCA2NDUtLTY0Ni5cbiAgLy8gaHR0cDovL3Byb2plY3RldWNsaWQub3JnL2V1Y2xpZC5hb21zLzExNzc2OTI2NDQ7XG5cbiAgdmFyIHYxLCB2MiwgdjMsIHY0O1xuICB2YXIgczEsIHMyO1xuXG4gIGRvIHtcbiAgICB2MSA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMxID0gdjEgKiB2MSArIHYyICogdjI7XG4gIH0gd2hpbGUgKHMxID49IDEpO1xuXG4gIGRvIHtcbiAgICB2MyA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjQgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMyID0gdjMgKiB2MyArIHY0ICogdjQ7XG4gIH0gd2hpbGUgKHMyID49IDEpO1xuXG4gIHZhciBkID0gTWF0aC5zcXJ0KCgxIC0gczEpIC8gczIpO1xuICBvdXRbMF0gPSBzY2FsZSAqIHYxO1xuICBvdXRbMV0gPSBzY2FsZSAqIHYyO1xuICBvdXRbMl0gPSBzY2FsZSAqIHYzICogZDtcbiAgb3V0WzNdID0gc2NhbGUgKiB2NCAqIGQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTsgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcblxuICB2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG4gIHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcbiAgdmFyIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuICB2YXIgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6OyAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cbiAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWM0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjNHMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDQ7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIHZlY1szXSA9IGFbaSArIDNdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICAgIGFbaSArIDNdID0gdmVjWzNdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIHZlYzQgZnJvbSAnZ2wtbWF0cml4L3ZlYzQnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hdDQoKSB7XG4gIHJldHVybiBbMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMV07XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtVmVjdG9yKG1hdHJpeCwgdmVjdG9yKSB7XG4gIHZhciByZXN1bHQgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIHZlY3RvciwgbWF0cml4KTtcbiAgdmVjNC5zY2FsZShyZXN1bHQsIHJlc3VsdCwgMSAvIHJlc3VsdFszXSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbW9kKHZhbHVlLCBkaXZpc29yKSB7XG4gIHZhciBtb2R1bHVzID0gdmFsdWUgJSBkaXZpc29yO1xuICByZXR1cm4gbW9kdWx1cyA8IDAgPyBkaXZpc29yICsgbW9kdWx1cyA6IG1vZHVsdXM7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVycChzdGFydCwgZW5kLCBzdGVwKSB7XG4gIHJldHVybiBzdGVwICogZW5kICsgKDEgLSBzdGVwKSAqIHN0YXJ0O1xufVxuXG5mdW5jdGlvbiBpZUxvZzIoeCkge1xuICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzJFO1xufVxuXG5leHBvcnQgdmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgaWVMb2cyOyIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5pbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiA0eDQgTWF0cml4PGJyPkZvcm1hdDogY29sdW1uLW1ham9yLCB3aGVuIHR5cGVkIG91dCBpdCBsb29rcyBsaWtlIHJvdy1tYWpvcjxicj5UaGUgbWF0cmljZXMgYXJlIGJlaW5nIHBvc3QgbXVsdGlwbGllZC5cclxuICogQG1vZHVsZSBtYXQ0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQ0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFs1XSA9IDE7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICBvdXRbOV0gPSBhWzldO1xuICBvdXRbMTBdID0gYVsxMF07XG4gIG91dFsxMV0gPSBhWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQ0IHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hdDQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcclxuICogQHJldHVybnMge21hdDR9IEEgbmV3IG1hdDRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMDM7XG4gIG91dFs0XSA9IG0xMDtcbiAgb3V0WzVdID0gbTExO1xuICBvdXRbNl0gPSBtMTI7XG4gIG91dFs3XSA9IG0xMztcbiAgb3V0WzhdID0gbTIwO1xuICBvdXRbOV0gPSBtMjE7XG4gIG91dFsxMF0gPSBtMjI7XG4gIG91dFsxMV0gPSBtMjM7XG4gIG91dFsxMl0gPSBtMzA7XG4gIG91dFsxM10gPSBtMzE7XG4gIG91dFsxNF0gPSBtMzI7XG4gIG91dFsxNV0gPSBtMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMDM7XG4gIG91dFs0XSA9IG0xMDtcbiAgb3V0WzVdID0gbTExO1xuICBvdXRbNl0gPSBtMTI7XG4gIG91dFs3XSA9IG0xMztcbiAgb3V0WzhdID0gbTIwO1xuICBvdXRbOV0gPSBtMjE7XG4gIG91dFsxMF0gPSBtMjI7XG4gIG91dFsxMV0gPSBtMjM7XG4gIG91dFsxMl0gPSBtMzA7XG4gIG91dFsxM10gPSBtMzE7XG4gIG91dFsxNF0gPSBtMzI7XG4gIG91dFsxNV0gPSBtMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM107XG4gICAgdmFyIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG4gICAgdmFyIGEyMyA9IGFbMTFdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhMDE7XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhMDI7XG4gICAgb3V0WzldID0gYTEyO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYTAzO1xuICAgIG91dFsxM10gPSBhMTM7XG4gICAgb3V0WzE0XSA9IGEyMztcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhWzFdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhWzJdO1xuICAgIG91dFs5XSA9IGFbNl07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYVszXTtcbiAgICBvdXRbMTNdID0gYVs3XTtcbiAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBJbnZlcnRzIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICBvdXRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgb3V0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0O1xuICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgb3V0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0O1xuICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgb3V0WzBdID0gYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpO1xuICBvdXRbMV0gPSAtKGEwMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gIG91dFsyXSA9IGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzNdID0gLShhMDEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbNF0gPSAtKGExMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gIG91dFs1XSA9IGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKTtcbiAgb3V0WzZdID0gLShhMDAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbN10gPSBhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFs4XSA9IGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKTtcbiAgb3V0WzldID0gLShhMDAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkpO1xuICBvdXRbMTBdID0gYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpO1xuICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICBvdXRbMTJdID0gLShhMTAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkpO1xuICBvdXRbMTNdID0gYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpO1xuICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICBvdXRbMTVdID0gYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0NHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07IC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuXG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzJdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFszXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbNF07XG4gIGIxID0gYls1XTtcbiAgYjIgPSBiWzZdO1xuICBiMyA9IGJbN107XG4gIG91dFs0XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbNV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzZdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFs3XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbOF07XG4gIGIxID0gYls5XTtcbiAgYjIgPSBiWzEwXTtcbiAgYjMgPSBiWzExXTtcbiAgb3V0WzhdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs5XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTBdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxMV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzEyXTtcbiAgYjEgPSBiWzEzXTtcbiAgYjIgPSBiWzE0XTtcbiAgYjMgPSBiWzE1XTtcbiAgb3V0WzEyXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMTNdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxNF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzE1XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdLFxuICAgICAgeiA9IHZbMl07XG4gIHZhciBhMDAsIGEwMSwgYTAyLCBhMDM7XG4gIHZhciBhMTAsIGExMSwgYTEyLCBhMTM7XG4gIHZhciBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgaWYgKGEgPT09IG91dCkge1xuICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMl0gKiB4ICsgYVs2XSAqIHkgKyBhWzEwXSAqIHogKyBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICB9IGVsc2Uge1xuICAgIGEwMCA9IGFbMF07XG4gICAgYTAxID0gYVsxXTtcbiAgICBhMDIgPSBhWzJdO1xuICAgIGEwMyA9IGFbM107XG4gICAgYTEwID0gYVs0XTtcbiAgICBhMTEgPSBhWzVdO1xuICAgIGExMiA9IGFbNl07XG4gICAgYTEzID0gYVs3XTtcbiAgICBhMjAgPSBhWzhdO1xuICAgIGEyMSA9IGFbOV07XG4gICAgYTIyID0gYVsxMF07XG4gICAgYTIzID0gYVsxMV07XG4gICAgb3V0WzBdID0gYTAwO1xuICAgIG91dFsxXSA9IGEwMTtcbiAgICBvdXRbMl0gPSBhMDI7XG4gICAgb3V0WzNdID0gYTAzO1xuICAgIG91dFs0XSA9IGExMDtcbiAgICBvdXRbNV0gPSBhMTE7XG4gICAgb3V0WzZdID0gYTEyO1xuICAgIG91dFs3XSA9IGExMztcbiAgICBvdXRbOF0gPSBhMjA7XG4gICAgb3V0WzldID0gYTIxO1xuICAgIG91dFsxMF0gPSBhMjI7XG4gICAgb3V0WzExXSA9IGEyMztcbiAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdO1xuICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyBub3QgdXNpbmcgdmVjdG9yaXphdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgb3V0WzBdID0gYVswXSAqIHg7XG4gIG91dFsxXSA9IGFbMV0gKiB4O1xuICBvdXRbMl0gPSBhWzJdICogeDtcbiAgb3V0WzNdID0gYVszXSAqIHg7XG4gIG91dFs0XSA9IGFbNF0gKiB5O1xuICBvdXRbNV0gPSBhWzVdICogeTtcbiAgb3V0WzZdID0gYVs2XSAqIHk7XG4gIG91dFs3XSA9IGFbN10gKiB5O1xuICBvdXRbOF0gPSBhWzhdICogejtcbiAgb3V0WzldID0gYVs5XSAqIHo7XG4gIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBnaXZlbiBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG4gIHZhciBhMDAsIGEwMSwgYTAyLCBhMDM7XG4gIHZhciBhMTAsIGExMSwgYTEyLCBhMTM7XG4gIHZhciBhMjAsIGEyMSwgYTIyLCBhMjM7XG4gIHZhciBiMDAsIGIwMSwgYjAyO1xuICB2YXIgYjEwLCBiMTEsIGIxMjtcbiAgdmFyIGIyMCwgYjIxLCBiMjI7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjO1xuICBhMDAgPSBhWzBdO1xuICBhMDEgPSBhWzFdO1xuICBhMDIgPSBhWzJdO1xuICBhMDMgPSBhWzNdO1xuICBhMTAgPSBhWzRdO1xuICBhMTEgPSBhWzVdO1xuICBhMTIgPSBhWzZdO1xuICBhMTMgPSBhWzddO1xuICBhMjAgPSBhWzhdO1xuICBhMjEgPSBhWzldO1xuICBhMjIgPSBhWzEwXTtcbiAgYTIzID0gYVsxMV07IC8vIENvbnN0cnVjdCB0aGUgZWxlbWVudHMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeFxuXG4gIGIwMCA9IHggKiB4ICogdCArIGM7XG4gIGIwMSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBiMDIgPSB6ICogeCAqIHQgLSB5ICogcztcbiAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIGIxMSA9IHkgKiB5ICogdCArIGM7XG4gIGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICBiMjAgPSB4ICogeiAqIHQgKyB5ICogcztcbiAgYjIxID0geSAqIHogKiB0IC0geCAqIHM7XG4gIGIyMiA9IHogKiB6ICogdCArIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICBvdXRbMV0gPSBhMDEgKiBiMDAgKyBhMTEgKiBiMDEgKyBhMjEgKiBiMDI7XG4gIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjtcbiAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICBvdXRbNF0gPSBhMDAgKiBiMTAgKyBhMTAgKiBiMTEgKyBhMjAgKiBiMTI7XG4gIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjtcbiAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICBvdXRbN10gPSBhMDMgKiBiMTAgKyBhMTMgKiBiMTEgKyBhMjMgKiBiMTI7XG4gIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjtcbiAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICBvdXRbMTBdID0gYTAyICogYjIwICsgYTEyICogYjIxICsgYTIyICogYjIyO1xuICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcbiAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xuICBvdXRbOV0gPSBhMDEgKiBzICsgYTIxICogYztcbiAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xuICBvdXRbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogcztcbiAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcbiAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IHZbMV07XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSB2WzJdO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGUgYXJvdW5kIGEgZ2l2ZW4gYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZShkZXN0LCBkZXN0LCByYWQsIGF4aXMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVgoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVhSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IC1zO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21ZUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAtcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gcztcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWihkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWlJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLXM7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiBhbmQgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dCwgcSwgdikge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0gKHl5ICsgenopO1xuICBvdXRbMV0gPSB4eSArIHd6O1xuICBvdXRbMl0gPSB4eiAtIHd5O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4eSAtIHd6O1xuICBvdXRbNV0gPSAxIC0gKHh4ICsgenopO1xuICBvdXRbNl0gPSB5eiArIHd4O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4eiArIHd5O1xuICBvdXRbOV0gPSB5eiAtIHd4O1xuICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBmcm9tIGEgZHVhbCBxdWF0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBNYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7bWF0NH0gbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0MihvdXQsIGEpIHtcbiAgdmFyIHRyYW5zbGF0aW9uID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN107XG4gIHZhciBtYWduaXR1ZGUgPSBieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnogKyBidyAqIGJ3OyAvL09ubHkgc2NhbGUgaWYgaXQgbWFrZXMgc2Vuc2VcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIHRyYW5zbGF0aW9uWzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDIgLyBtYWduaXR1ZGU7XG4gICAgdHJhbnNsYXRpb25bMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyIC8gbWFnbml0dWRlO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zbGF0aW9uWzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMjtcbiAgICB0cmFuc2xhdGlvblsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDI7XG4gICAgdHJhbnNsYXRpb25bMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyO1xuICB9XG5cbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBhLCB0cmFuc2xhdGlvbik7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXHJcbiAqICBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGggZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sXHJcbiAqICB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHRyYW5zbGF0aW9uIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXHJcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgbWF0KSB7XG4gIG91dFswXSA9IG1hdFsxMl07XG4gIG91dFsxXSA9IG1hdFsxM107XG4gIG91dFsyXSA9IG1hdFsxNF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgc2NhbGluZyBmYWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cclxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlXHJcbiAqICB3aXRoIGEgbm9ybWFsaXplZCBRdWF0ZXJuaW9uIHBhcmFtdGVyLCB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmVcclxuICogIHRoZSBzYW1lIGFzIHRoZSBzY2FsaW5nIHZlY3RvclxyXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXHJcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxpbmcob3V0LCBtYXQpIHtcbiAgdmFyIG0xMSA9IG1hdFswXTtcbiAgdmFyIG0xMiA9IG1hdFsxXTtcbiAgdmFyIG0xMyA9IG1hdFsyXTtcbiAgdmFyIG0yMSA9IG1hdFs0XTtcbiAgdmFyIG0yMiA9IG1hdFs1XTtcbiAgdmFyIG0yMyA9IG1hdFs2XTtcbiAgdmFyIG0zMSA9IG1hdFs4XTtcbiAgdmFyIG0zMiA9IG1hdFs5XTtcbiAgdmFyIG0zMyA9IG1hdFsxMF07XG4gIG91dFswXSA9IE1hdGguaHlwb3QobTExLCBtMTIsIG0xMyk7XG4gIG91dFsxXSA9IE1hdGguaHlwb3QobTIxLCBtMjIsIG0yMyk7XG4gIG91dFsyXSA9IE1hdGguaHlwb3QobTMxLCBtMzIsIG0zMyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSByb3RhdGlvbmFsIGNvbXBvbmVudFxyXG4gKiAgb2YgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGhcclxuICogIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLCB0aGUgcmV0dXJuZWQgcXVhdGVybmlvbiB3aWxsIGJlIHRoZVxyXG4gKiAgc2FtZSBhcyB0aGUgcXVhdGVybmlvbiBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBRdWF0ZXJuaW9uIHRvIHJlY2VpdmUgdGhlIHJvdGF0aW9uIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHtcbiAgdmFyIHNjYWxpbmcgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgZ2V0U2NhbGluZyhzY2FsaW5nLCBtYXQpO1xuICB2YXIgaXMxID0gMSAvIHNjYWxpbmdbMF07XG4gIHZhciBpczIgPSAxIC8gc2NhbGluZ1sxXTtcbiAgdmFyIGlzMyA9IDEgLyBzY2FsaW5nWzJdO1xuICB2YXIgc20xMSA9IG1hdFswXSAqIGlzMTtcbiAgdmFyIHNtMTIgPSBtYXRbMV0gKiBpczI7XG4gIHZhciBzbTEzID0gbWF0WzJdICogaXMzO1xuICB2YXIgc20yMSA9IG1hdFs0XSAqIGlzMTtcbiAgdmFyIHNtMjIgPSBtYXRbNV0gKiBpczI7XG4gIHZhciBzbTIzID0gbWF0WzZdICogaXMzO1xuICB2YXIgc20zMSA9IG1hdFs4XSAqIGlzMTtcbiAgdmFyIHNtMzIgPSBtYXRbOV0gKiBpczI7XG4gIHZhciBzbTMzID0gbWF0WzEwXSAqIGlzMztcbiAgdmFyIHRyYWNlID0gc20xMSArIHNtMjIgKyBzbTMzO1xuICB2YXIgUyA9IDA7XG5cbiAgaWYgKHRyYWNlID4gMCkge1xuICAgIFMgPSBNYXRoLnNxcnQodHJhY2UgKyAxLjApICogMjtcbiAgICBvdXRbM10gPSAwLjI1ICogUztcbiAgICBvdXRbMF0gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMV0gPSAoc20zMSAtIHNtMTMpIC8gUztcbiAgICBvdXRbMl0gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgfSBlbHNlIGlmIChzbTExID4gc20yMiAmJiBzbTExID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMjMgLSBzbTMyKSAvIFM7XG4gICAgb3V0WzBdID0gMC4yNSAqIFM7XG4gICAgb3V0WzFdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzJdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gIH0gZWxzZSBpZiAoc20yMiA+IHNtMzMpIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMjIgLSBzbTExIC0gc20zMykgKiAyO1xuICAgIG91dFszXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFswXSA9IChzbTEyICsgc20yMSkgLyBTO1xuICAgIG91dFsxXSA9IDAuMjUgKiBTO1xuICAgIG91dFsyXSA9IChzbTIzICsgc20zMikgLyBTO1xuICB9IGVsc2Uge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20zMyAtIHNtMTEgLSBzbTIyKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMTIgLSBzbTIxKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gICAgb3V0WzFdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gICAgb3V0WzJdID0gMC4yNSAqIFM7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBzIFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlKG91dCwgcSwgdiwgcykge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICB2YXIgc3ggPSBzWzBdO1xuICB2YXIgc3kgPSBzWzFdO1xuICB2YXIgc3ogPSBzWzJdO1xuICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlLCByb3RhdGluZyBhbmQgc2NhbGluZyBhcm91bmQgdGhlIGdpdmVuIG9yaWdpblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgb3JpZ2luKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgbmVnYXRpdmVPcmlnaW4pO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IG8gVGhlIG9yaWdpbiB2ZWN0b3IgYXJvdW5kIHdoaWNoIHRvIHNjYWxlIGFuZCByb3RhdGVcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW4ob3V0LCBxLCB2LCBzLCBvKSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIHZhciBzeCA9IHNbMF07XG4gIHZhciBzeSA9IHNbMV07XG4gIHZhciBzeiA9IHNbMl07XG4gIHZhciBveCA9IG9bMF07XG4gIHZhciBveSA9IG9bMV07XG4gIHZhciBveiA9IG9bMl07XG4gIHZhciBvdXQwID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIHZhciBvdXQxID0gKHh5ICsgd3opICogc3g7XG4gIHZhciBvdXQyID0gKHh6IC0gd3kpICogc3g7XG4gIHZhciBvdXQ0ID0gKHh5IC0gd3opICogc3k7XG4gIHZhciBvdXQ1ID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIHZhciBvdXQ2ID0gKHl6ICsgd3gpICogc3k7XG4gIHZhciBvdXQ4ID0gKHh6ICsgd3kpICogc3o7XG4gIHZhciBvdXQ5ID0gKHl6IC0gd3gpICogc3o7XG4gIHZhciBvdXQxMCA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICBvdXRbMF0gPSBvdXQwO1xuICBvdXRbMV0gPSBvdXQxO1xuICBvdXRbMl0gPSBvdXQyO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSBvdXQ0O1xuICBvdXRbNV0gPSBvdXQ1O1xuICBvdXRbNl0gPSBvdXQ2O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBvdXQ4O1xuICBvdXRbOV0gPSBvdXQ5O1xuICBvdXRbMTBdID0gb3V0MTA7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXSArIG94IC0gKG91dDAgKiBveCArIG91dDQgKiBveSArIG91dDggKiBveik7XG4gIG91dFsxM10gPSB2WzFdICsgb3kgLSAob3V0MSAqIG94ICsgb3V0NSAqIG95ICsgb3V0OSAqIG96KTtcbiAgb3V0WzE0XSA9IHZbMl0gKyBveiAtIChvdXQyICogb3ggKyBvdXQ2ICogb3kgKyBvdXQxMCAqIG96KTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geXggLSB3ejtcbiAgb3V0WzVdID0gMSAtIHh4IC0geno7XG4gIG91dFs2XSA9IHp5ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHp4ICsgd3k7XG4gIG91dFs5XSA9IHp5IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0geHggLSB5eTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZydXN0dW0ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCk7XG4gIHZhciB0YiA9IDEgLyAodG9wIC0gYm90dG9tKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gbmVhciAqIDIgKiBybDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gbmVhciAqIDIgKiB0YjtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHJpZ2h0ICsgbGVmdCkgKiBybDtcbiAgb3V0WzldID0gKHRvcCArIGJvdHRvbSkgKiB0YjtcbiAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgKiAyICogbmY7XG4gIG91dFsxNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cclxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgbmY7XG4gIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGY7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTVdID0gMDtcblxuICBpZiAoZmFyICE9IG51bGwgJiYgZmFyICE9PSBJbmZpbml0eSkge1xuICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE0XSA9IDIgKiBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtMiAqIG5lYXI7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGZpZWxkIG9mIHZpZXcuXHJcbiAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBwcm9qZWN0aW9uIG1hdHJpY2VzIHRvIGJlIHVzZWRcclxuICogd2l0aCB0aGUgc3RpbGwgZXhwZXJpZW1lbnRhbCBXZWJWUiBBUEkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtPYmplY3R9IGZvdiBPYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHZhbHVlczogdXBEZWdyZWVzLCBkb3duRGVncmVlcywgbGVmdERlZ3JlZXMsIHJpZ2h0RGVncmVlc1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyhvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgdmFyIHlTY2FsZSA9IDIuMCAvICh1cFRhbiArIGRvd25UYW4pO1xuICBvdXRbMF0gPSB4U2NhbGU7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIG91dFs0XSA9IDAuMDtcbiAgb3V0WzVdID0geVNjYWxlO1xuICBvdXRbNl0gPSAwLjA7XG4gIG91dFs3XSA9IDAuMDtcbiAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gIG91dFs5XSA9ICh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41O1xuICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTFdID0gLTEuMDtcbiAgb3V0WzEyXSA9IDAuMDtcbiAgb3V0WzEzXSA9IDAuMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxNV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRobyhvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBsciA9IDEgLyAobGVmdCAtIHJpZ2h0KTtcbiAgdmFyIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSAtMiAqIGxyO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAtMiAqIGJ0O1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMiAqIG5mO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxyXG4gKiBJZiB5b3Ugd2FudCBhIG1hdHJpeCB0aGF0IGFjdHVhbGx5IG1ha2VzIGFuIG9iamVjdCBsb29rIGF0IGFub3RoZXIgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSB0YXJnZXRUbyBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW47XG4gIHZhciBleWV4ID0gZXllWzBdO1xuICB2YXIgZXlleSA9IGV5ZVsxXTtcbiAgdmFyIGV5ZXogPSBleWVbMl07XG4gIHZhciB1cHggPSB1cFswXTtcbiAgdmFyIHVweSA9IHVwWzFdO1xuICB2YXIgdXB6ID0gdXBbMl07XG4gIHZhciBjZW50ZXJ4ID0gY2VudGVyWzBdO1xuICB2YXIgY2VudGVyeSA9IGNlbnRlclsxXTtcbiAgdmFyIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoZXlleSAtIGNlbnRlcnkpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KG91dCk7XG4gIH1cblxuICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICB6MSA9IGV5ZXkgLSBjZW50ZXJ5O1xuICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuICBsZW4gPSAxIC8gTWF0aC5oeXBvdCh6MCwgejEsIHoyKTtcbiAgejAgKj0gbGVuO1xuICB6MSAqPSBsZW47XG4gIHoyICo9IGxlbjtcbiAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgbGVuID0gTWF0aC5oeXBvdCh4MCwgeDEsIHgyKTtcblxuICBpZiAoIWxlbikge1xuICAgIHgwID0gMDtcbiAgICB4MSA9IDA7XG4gICAgeDIgPSAwO1xuICB9IGVsc2Uge1xuICAgIGxlbiA9IDEgLyBsZW47XG4gICAgeDAgKj0gbGVuO1xuICAgIHgxICo9IGxlbjtcbiAgICB4MiAqPSBsZW47XG4gIH1cblxuICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICB5MSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuICBsZW4gPSBNYXRoLmh5cG90KHkwLCB5MSwgeTIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeTAgPSAwO1xuICAgIHkxID0gMDtcbiAgICB5MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB5MCAqPSBsZW47XG4gICAgeTEgKj0gbGVuO1xuICAgIHkyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB5MDtcbiAgb3V0WzJdID0gejA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHgxO1xuICBvdXRbNV0gPSB5MTtcbiAgb3V0WzZdID0gejE7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHgyO1xuICBvdXRbOV0gPSB5MjtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgb3V0WzE0XSA9IC0oejAgKiBleWV4ICsgejEgKiBleWV5ICsgejIgKiBleWV6KTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgbWF0cml4IHRoYXQgbWFrZXMgc29tZXRoaW5nIGxvb2sgYXQgc29tZXRoaW5nIGVsc2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0YXJnZXRUbyhvdXQsIGV5ZSwgdGFyZ2V0LCB1cCkge1xuICB2YXIgZXlleCA9IGV5ZVswXSxcbiAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICB1cHkgPSB1cFsxXSxcbiAgICAgIHVweiA9IHVwWzJdO1xuICB2YXIgejAgPSBleWV4IC0gdGFyZ2V0WzBdLFxuICAgICAgejEgPSBleWV5IC0gdGFyZ2V0WzFdLFxuICAgICAgejIgPSBleWV6IC0gdGFyZ2V0WzJdO1xuICB2YXIgbGVuID0gejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuICB9XG5cbiAgdmFyIHgwID0gdXB5ICogejIgLSB1cHogKiB6MSxcbiAgICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MixcbiAgICAgIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgbGVuID0geDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHgwICo9IGxlbjtcbiAgICB4MSAqPSBsZW47XG4gICAgeDIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHgxO1xuICBvdXRbMl0gPSB4MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gejEgKiB4MiAtIHoyICogeDE7XG4gIG91dFs1XSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICBvdXRbNl0gPSB6MCAqIHgxIC0gejEgKiB4MDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gejA7XG4gIG91dFs5XSA9IHoxO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gZXlleDtcbiAgb3V0WzEzXSA9IGV5ZXk7XG4gIG91dFsxNF0gPSBleWV6O1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0NChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIsIFwiICsgYVs4XSArIFwiLCBcIiArIGFbOV0gKyBcIiwgXCIgKyBhWzEwXSArIFwiLCBcIiArIGFbMTFdICsgXCIsIFwiICsgYVsxMl0gKyBcIiwgXCIgKyBhWzEzXSArIFwiLCBcIiArIGFbMTRdICsgXCIsIFwiICsgYVsxNV0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdLCBhWzldLCBhWzEwXSwgYVsxMV0sIGFbMTJdLCBhWzEzXSwgYVsxNF0sIGFbMTVdKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQ0J3NcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gLSBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gLSBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdIC0gYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSAtIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gLSBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdIC0gYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSAtIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICBvdXRbNl0gPSBhWzZdICogYjtcbiAgb3V0WzddID0gYVs3XSAqIGI7XG4gIG91dFs4XSA9IGFbOF0gKiBiO1xuICBvdXRbOV0gPSBhWzldICogYjtcbiAgb3V0WzEwXSA9IGFbMTBdICogYjtcbiAgb3V0WzExXSA9IGFbMTFdICogYjtcbiAgb3V0WzEyXSA9IGFbMTJdICogYjtcbiAgb3V0WzEzXSA9IGFbMTNdICogYjtcbiAgb3V0WzE0XSA9IGFbMTRdICogYjtcbiAgb3V0WzE1XSA9IGFbMTVdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdICogc2NhbGU7XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdICogc2NhbGU7XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdICogc2NhbGU7XG4gIG91dFs3XSA9IGFbN10gKyBiWzddICogc2NhbGU7XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdICogc2NhbGU7XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldICogc2NhbGU7XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdICogc2NhbGU7XG4gIG91dFsxMV0gPSBhWzExXSArIGJbMTFdICogc2NhbGU7XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdICogc2NhbGU7XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdICogc2NhbGU7XG4gIG91dFsxNF0gPSBhWzE0XSArIGJbMTRdICogc2NhbGU7XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdICYmIGFbOV0gPT09IGJbOV0gJiYgYVsxMF0gPT09IGJbMTBdICYmIGFbMTFdID09PSBiWzExXSAmJiBhWzEyXSA9PT0gYlsxMl0gJiYgYVsxM10gPT09IGJbMTNdICYmIGFbMTRdID09PSBiWzE0XSAmJiBhWzE1XSA9PT0gYlsxNV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN107XG4gIHZhciBhOCA9IGFbOF0sXG4gICAgICBhOSA9IGFbOV0sXG4gICAgICBhMTAgPSBhWzEwXSxcbiAgICAgIGExMSA9IGFbMTFdO1xuICB2YXIgYTEyID0gYVsxMl0sXG4gICAgICBhMTMgPSBhWzEzXSxcbiAgICAgIGExNCA9IGFbMTRdLFxuICAgICAgYTE1ID0gYVsxNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHZhciBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN107XG4gIHZhciBiOCA9IGJbOF0sXG4gICAgICBiOSA9IGJbOV0sXG4gICAgICBiMTAgPSBiWzEwXSxcbiAgICAgIGIxMSA9IGJbMTFdO1xuICB2YXIgYjEyID0gYlsxMl0sXG4gICAgICBiMTMgPSBiWzEzXSxcbiAgICAgIGIxNCA9IGJbMTRdLFxuICAgICAgYjE1ID0gYlsxNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKSAmJiBNYXRoLmFicyhhOSAtIGI5KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOSksIE1hdGguYWJzKGI5KSkgJiYgTWF0aC5hYnMoYTEwIC0gYjEwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTApLCBNYXRoLmFicyhiMTApKSAmJiBNYXRoLmFicyhhMTEgLSBiMTEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMSksIE1hdGguYWJzKGIxMSkpICYmIE1hdGguYWJzKGExMiAtIGIxMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEyKSwgTWF0aC5hYnMoYjEyKSkgJiYgTWF0aC5hYnMoYTEzIC0gYjEzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTMpLCBNYXRoLmFicyhiMTMpKSAmJiBNYXRoLmFicyhhMTQgLSBiMTQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNCksIE1hdGguYWJzKGIxNCkpICYmIE1hdGguYWJzKGExNSAtIGIxNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE1KSwgTWF0aC5hYnMoYjE1KSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0IFwiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIjtcbmltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDIgRGltZW5zaW9uYWwgVmVjdG9yXHJcbiAqIEBtb2R1bGUgdmVjMlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzJcclxuICpcclxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSkge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNlaWxcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxyXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHk7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcclxuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDIob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzNdICogeSArIG1bNl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMCdcclxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgMkQgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgdmVjMiBwb2ludCB0byByb3RhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgYiwgcmFkKSB7XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgdmFyIHAwID0gYVswXSAtIGJbMF0sXG4gICAgICBwMSA9IGFbMV0gLSBiWzFdLFxuICAgICAgc2luQyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjb3NDID0gTWF0aC5jb3MocmFkKTsgLy9wZXJmb3JtIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHAwICogY29zQyAtIHAxICogc2luQyArIGJbMF07XG4gIG91dFsxXSA9IHAwICogc2luQyArIHAxICogY29zQyArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIHgxID0gYVswXSxcbiAgICAgIHkxID0gYVsxXSxcbiAgICAgIHgyID0gYlswXSxcbiAgICAgIHkyID0gYlsxXSxcbiAgICAgIC8vIG1hZyBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgbWFnbml0dWRlcyBvZiBhIGFuZCBiXG4gIG1hZyA9IE1hdGguc3FydCh4MSAqIHgxICsgeTEgKiB5MSkgKiBNYXRoLnNxcnQoeDIgKiB4MiArIHkyICogeTIpLFxuICAgICAgLy8gbWFnICYmLi4gc2hvcnQgY2lyY3VpdHMgaWYgbWFnID09IDBcbiAgY29zaW5lID0gbWFnICYmICh4MSAqIHgyICsgeTEgKiB5MikgLyBtYWc7IC8vIE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSBjbGFtcHMgdGhlIGNvc2luZSBiZXR3ZWVuIC0xIGFuZCAxXG5cbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBleGFjdGx5IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5pbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzNcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSwgeikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHopIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0O1xuICB2YXIgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvO1xuICB2YXIgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgdmFyIHogPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAtIDEuMDtcbiAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAgLSB6ICogeikgKiBzY2FsZTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICBvdXRbMl0gPSB6ICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cclxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTtcbiAgdyA9IHcgfHwgMS4wO1xuICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgb3V0WzFdID0gKG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdKSAvIHc7XG4gIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XG4gIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XHJcbiAqIENhbiBhbHNvIGJlIHVzZWQgZm9yIGR1YWwgcXVhdGVybmlvbnMuIChNdWx0aXBseSBpdCB3aXRoIHRoZSByZWFsIHBhcnQpXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIC8vIGJlbmNobWFya3M6IGh0dHBzOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXRyYW5zZm9ybS12ZWMzLWltcGxlbWVudGF0aW9ucy1maXhlZFxuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdO1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdOyAvLyB2YXIgcXZlYyA9IFtxeCwgcXksIHF6XTtcbiAgLy8gdmFyIHV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgYSk7XG5cbiAgdmFyIHV2eCA9IHF5ICogeiAtIHF6ICogeSxcbiAgICAgIHV2eSA9IHF6ICogeCAtIHF4ICogeixcbiAgICAgIHV2eiA9IHF4ICogeSAtIHF5ICogeDsgLy8gdmFyIHV1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIHV2KTtcblxuICB2YXIgdXV2eCA9IHF5ICogdXZ6IC0gcXogKiB1dnksXG4gICAgICB1dXZ5ID0gcXogKiB1dnggLSBxeCAqIHV2eixcbiAgICAgIHV1dnogPSBxeCAqIHV2eSAtIHF5ICogdXZ4OyAvLyB2ZWMzLnNjYWxlKHV2LCB1diwgMiAqIHcpO1xuXG4gIHZhciB3MiA9IHF3ICogMjtcbiAgdXZ4ICo9IHcyO1xuICB1dnkgKj0gdzI7XG4gIHV2eiAqPSB3MjsgLy8gdmVjMy5zY2FsZSh1dXYsIHV1diwgMik7XG5cbiAgdXV2eCAqPSAyO1xuICB1dXZ5ICo9IDI7XG4gIHV1dnogKj0gMjsgLy8gcmV0dXJuIHZlYzMuYWRkKG91dCwgYSwgdmVjMy5hZGQob3V0LCB1diwgdXV2KSk7XG5cbiAgb3V0WzBdID0geCArIHV2eCArIHV1dng7XG4gIG91dFsxXSA9IHkgKyB1dnkgKyB1dXZ5O1xuICBvdXRbMl0gPSB6ICsgdXZ6ICsgdXV2ejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhyYWQpIC0gcFsyXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMl0gPSBwWzFdICogTWF0aC5zaW4ocmFkKSArIHBbMl0gKiBNYXRoLmNvcyhyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB6LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKHJhZCkgLSBwWzFdICogTWF0aC5zaW4ocmFkKTtcbiAgclsxXSA9IHBbMF0gKiBNYXRoLnNpbihyYWQpICsgcFsxXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMl0gPSBwWzJdOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgbWFnMSA9IE1hdGguc3FydChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopLFxuICAgICAgbWFnMiA9IE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnopLFxuICAgICAgbWFnID0gbWFnMSAqIG1hZzIsXG4gICAgICBjb3NpbmUgPSBtYWcgJiYgZG90KGEsIGIpIC8gbWFnO1xuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMyB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzNzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yOiBhc3NlcnRpb24gZmFpbGVkLicpO1xuICB9XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IGNyZWF0ZU1hdDQsIHRyYW5zZm9ybVZlY3RvciwgbG9nMiB9IGZyb20gJy4vbWF0aC11dGlscyc7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gJ2dsLW1hdHJpeC9tYXQ0JztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tICdnbC1tYXRyaXgvdmVjMyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4vYXNzZXJ0JztcbnZhciBQSSA9IE1hdGguUEk7XG52YXIgUElfNCA9IFBJIC8gNDtcbnZhciBERUdSRUVTX1RPX1JBRElBTlMgPSBQSSAvIDE4MDtcbnZhciBSQURJQU5TX1RPX0RFR1JFRVMgPSAxODAgLyBQSTtcbnZhciBUSUxFX1NJWkUgPSA1MTI7XG52YXIgRUFSVEhfQ0lSQ1VNRkVSRU5DRSA9IDQwLjAzZTY7XG5leHBvcnQgdmFyIERFRkFVTFRfQUxUSVRVREUgPSAxLjU7XG5leHBvcnQgZnVuY3Rpb24gem9vbVRvU2NhbGUoem9vbSkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUb1pvb20oc2NhbGUpIHtcbiAgcmV0dXJuIGxvZzIoc2NhbGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxuZ0xhdFRvV29ybGQoX3JlZikge1xuICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgIGxuZyA9IF9yZWYyWzBdLFxuICAgICAgbGF0ID0gX3JlZjJbMV07XG5cbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsbmcpKTtcbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsYXQpICYmIGxhdCA+PSAtOTAgJiYgbGF0IDw9IDkwLCAnaW52YWxpZCBsYXRpdHVkZScpO1xuICB2YXIgbGFtYmRhMiA9IGxuZyAqIERFR1JFRVNfVE9fUkFESUFOUztcbiAgdmFyIHBoaTIgPSBsYXQgKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIHZhciB4ID0gVElMRV9TSVpFICogKGxhbWJkYTIgKyBQSSkgLyAoMiAqIFBJKTtcbiAgdmFyIHkgPSBUSUxFX1NJWkUgKiAoUEkgKyBNYXRoLmxvZyhNYXRoLnRhbihQSV80ICsgcGhpMiAqIDAuNSkpKSAvICgyICogUEkpO1xuICByZXR1cm4gW3gsIHldO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdvcmxkVG9MbmdMYXQoX3JlZjMpIHtcbiAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDIpLFxuICAgICAgeCA9IF9yZWY0WzBdLFxuICAgICAgeSA9IF9yZWY0WzFdO1xuXG4gIHZhciBsYW1iZGEyID0geCAvIFRJTEVfU0laRSAqICgyICogUEkpIC0gUEk7XG4gIHZhciBwaGkyID0gMiAqIChNYXRoLmF0YW4oTWF0aC5leHAoeSAvIFRJTEVfU0laRSAqICgyICogUEkpIC0gUEkpKSAtIFBJXzQpO1xuICByZXR1cm4gW2xhbWJkYTIgKiBSQURJQU5TX1RPX0RFR1JFRVMsIHBoaTIgKiBSQURJQU5TX1RPX0RFR1JFRVNdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGVyWm9vbShfcmVmNSkge1xuICB2YXIgbGF0aXR1ZGUgPSBfcmVmNS5sYXRpdHVkZTtcbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsYXRpdHVkZSkpO1xuICB2YXIgbGF0Q29zaW5lID0gTWF0aC5jb3MobGF0aXR1ZGUgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuICByZXR1cm4gc2NhbGVUb1pvb20oRUFSVEhfQ0lSQ1VNRkVSRU5DRSAqIGxhdENvc2luZSkgLSA5O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlU2NhbGVzKF9yZWY2KSB7XG4gIHZhciBsYXRpdHVkZSA9IF9yZWY2LmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlID0gX3JlZjYubG9uZ2l0dWRlLFxuICAgICAgX3JlZjYkaGlnaFByZWNpc2lvbiA9IF9yZWY2LmhpZ2hQcmVjaXNpb24sXG4gICAgICBoaWdoUHJlY2lzaW9uID0gX3JlZjYkaGlnaFByZWNpc2lvbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRoaWdoUHJlY2lzaW9uO1xuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxhdGl0dWRlKSAmJiBOdW1iZXIuaXNGaW5pdGUobG9uZ2l0dWRlKSk7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIHdvcmxkU2l6ZSA9IFRJTEVfU0laRTtcbiAgdmFyIGxhdENvc2luZSA9IE1hdGguY29zKGxhdGl0dWRlICogREVHUkVFU19UT19SQURJQU5TKTtcbiAgdmFyIHVuaXRzUGVyRGVncmVlWCA9IHdvcmxkU2l6ZSAvIDM2MDtcbiAgdmFyIHVuaXRzUGVyRGVncmVlWSA9IHVuaXRzUGVyRGVncmVlWCAvIGxhdENvc2luZTtcbiAgdmFyIGFsdFVuaXRzUGVyTWV0ZXIgPSB3b3JsZFNpemUgLyBFQVJUSF9DSVJDVU1GRVJFTkNFIC8gbGF0Q29zaW5lO1xuICByZXN1bHQudW5pdHNQZXJNZXRlciA9IFthbHRVbml0c1Blck1ldGVyLCBhbHRVbml0c1Blck1ldGVyLCBhbHRVbml0c1Blck1ldGVyXTtcbiAgcmVzdWx0Lm1ldGVyc1BlclVuaXQgPSBbMSAvIGFsdFVuaXRzUGVyTWV0ZXIsIDEgLyBhbHRVbml0c1Blck1ldGVyLCAxIC8gYWx0VW5pdHNQZXJNZXRlcl07XG4gIHJlc3VsdC51bml0c1BlckRlZ3JlZSA9IFt1bml0c1BlckRlZ3JlZVgsIHVuaXRzUGVyRGVncmVlWSwgYWx0VW5pdHNQZXJNZXRlcl07XG4gIHJlc3VsdC5kZWdyZWVzUGVyVW5pdCA9IFsxIC8gdW5pdHNQZXJEZWdyZWVYLCAxIC8gdW5pdHNQZXJEZWdyZWVZLCAxIC8gYWx0VW5pdHNQZXJNZXRlcl07XG5cbiAgaWYgKGhpZ2hQcmVjaXNpb24pIHtcbiAgICB2YXIgbGF0Q29zaW5lMiA9IERFR1JFRVNfVE9fUkFESUFOUyAqIE1hdGgudGFuKGxhdGl0dWRlICogREVHUkVFU19UT19SQURJQU5TKSAvIGxhdENvc2luZTtcbiAgICB2YXIgdW5pdHNQZXJEZWdyZWVZMiA9IHVuaXRzUGVyRGVncmVlWCAqIGxhdENvc2luZTIgLyAyO1xuICAgIHZhciBhbHRVbml0c1BlckRlZ3JlZTIgPSB3b3JsZFNpemUgLyBFQVJUSF9DSVJDVU1GRVJFTkNFICogbGF0Q29zaW5lMjtcbiAgICB2YXIgYWx0VW5pdHNQZXJNZXRlcjIgPSBhbHRVbml0c1BlckRlZ3JlZTIgLyB1bml0c1BlckRlZ3JlZVkgKiBhbHRVbml0c1Blck1ldGVyO1xuICAgIHJlc3VsdC51bml0c1BlckRlZ3JlZTIgPSBbMCwgdW5pdHNQZXJEZWdyZWVZMiwgYWx0VW5pdHNQZXJEZWdyZWUyXTtcbiAgICByZXN1bHQudW5pdHNQZXJNZXRlcjIgPSBbYWx0VW5pdHNQZXJNZXRlcjIsIDAsIGFsdFVuaXRzUGVyTWV0ZXIyXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkTWV0ZXJzVG9MbmdMYXQobG5nTGF0WiwgeHl6KSB7XG4gIHZhciBfbG5nTGF0WiA9IF9zbGljZWRUb0FycmF5KGxuZ0xhdFosIDMpLFxuICAgICAgbG9uZ2l0dWRlID0gX2xuZ0xhdFpbMF0sXG4gICAgICBsYXRpdHVkZSA9IF9sbmdMYXRaWzFdLFxuICAgICAgejAgPSBfbG5nTGF0WlsyXTtcblxuICB2YXIgX3h5eiA9IF9zbGljZWRUb0FycmF5KHh5eiwgMyksXG4gICAgICB4ID0gX3h5elswXSxcbiAgICAgIHkgPSBfeHl6WzFdLFxuICAgICAgeiA9IF94eXpbMl07XG5cbiAgdmFyIF9nZXREaXN0YW5jZVNjYWxlcyA9IGdldERpc3RhbmNlU2NhbGVzKHtcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgaGlnaFByZWNpc2lvbjogdHJ1ZVxuICB9KSxcbiAgICAgIHVuaXRzUGVyTWV0ZXIgPSBfZ2V0RGlzdGFuY2VTY2FsZXMudW5pdHNQZXJNZXRlcixcbiAgICAgIHVuaXRzUGVyTWV0ZXIyID0gX2dldERpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXIyO1xuXG4gIHZhciB3b3JsZHNwYWNlID0gbG5nTGF0VG9Xb3JsZChsbmdMYXRaKTtcbiAgd29ybGRzcGFjZVswXSArPSB4ICogKHVuaXRzUGVyTWV0ZXJbMF0gKyB1bml0c1Blck1ldGVyMlswXSAqIHkpO1xuICB3b3JsZHNwYWNlWzFdICs9IHkgKiAodW5pdHNQZXJNZXRlclsxXSArIHVuaXRzUGVyTWV0ZXIyWzFdICogeSk7XG4gIHZhciBuZXdMbmdMYXQgPSB3b3JsZFRvTG5nTGF0KHdvcmxkc3BhY2UpO1xuICB2YXIgbmV3WiA9ICh6MCB8fCAwKSArICh6IHx8IDApO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHowKSB8fCBOdW1iZXIuaXNGaW5pdGUoeikgPyBbbmV3TG5nTGF0WzBdLCBuZXdMbmdMYXRbMV0sIG5ld1pdIDogbmV3TG5nTGF0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdNYXRyaXgoX3JlZjcpIHtcbiAgdmFyIGhlaWdodCA9IF9yZWY3LmhlaWdodCxcbiAgICAgIHBpdGNoID0gX3JlZjcucGl0Y2gsXG4gICAgICBiZWFyaW5nID0gX3JlZjcuYmVhcmluZyxcbiAgICAgIGFsdGl0dWRlID0gX3JlZjcuYWx0aXR1ZGUsXG4gICAgICBzY2FsZSA9IF9yZWY3LnNjYWxlLFxuICAgICAgX3JlZjckY2VudGVyID0gX3JlZjcuY2VudGVyLFxuICAgICAgY2VudGVyID0gX3JlZjckY2VudGVyID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjckY2VudGVyO1xuICB2YXIgdm0gPSBjcmVhdGVNYXQ0KCk7XG4gIG1hdDQudHJhbnNsYXRlKHZtLCB2bSwgWzAsIDAsIC1hbHRpdHVkZV0pO1xuICBtYXQ0LnJvdGF0ZVgodm0sIHZtLCAtcGl0Y2ggKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuICBtYXQ0LnJvdGF0ZVoodm0sIHZtLCBiZWFyaW5nICogREVHUkVFU19UT19SQURJQU5TKTtcbiAgc2NhbGUgLz0gaGVpZ2h0O1xuICBtYXQ0LnNjYWxlKHZtLCB2bSwgW3NjYWxlLCBzY2FsZSwgc2NhbGVdKTtcblxuICBpZiAoY2VudGVyKSB7XG4gICAgbWF0NC50cmFuc2xhdGUodm0sIHZtLCB2ZWMzLm5lZ2F0ZShbXSwgY2VudGVyKSk7XG4gIH1cblxuICByZXR1cm4gdm07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvamVjdGlvblBhcmFtZXRlcnMoX3JlZjgpIHtcbiAgdmFyIHdpZHRoID0gX3JlZjgud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmOC5oZWlnaHQsXG4gICAgICBfcmVmOCRmb3Z5ID0gX3JlZjguZm92eSxcbiAgICAgIGZvdnkgPSBfcmVmOCRmb3Z5ID09PSB2b2lkIDAgPyBhbHRpdHVkZVRvRm92eShERUZBVUxUX0FMVElUVURFKSA6IF9yZWY4JGZvdnksXG4gICAgICBhbHRpdHVkZSA9IF9yZWY4LmFsdGl0dWRlLFxuICAgICAgX3JlZjgkcGl0Y2ggPSBfcmVmOC5waXRjaCxcbiAgICAgIHBpdGNoID0gX3JlZjgkcGl0Y2ggPT09IHZvaWQgMCA/IDAgOiBfcmVmOCRwaXRjaCxcbiAgICAgIF9yZWY4JG5lYXJaTXVsdGlwbGllciA9IF9yZWY4Lm5lYXJaTXVsdGlwbGllcixcbiAgICAgIG5lYXJaTXVsdGlwbGllciA9IF9yZWY4JG5lYXJaTXVsdGlwbGllciA9PT0gdm9pZCAwID8gMSA6IF9yZWY4JG5lYXJaTXVsdGlwbGllcixcbiAgICAgIF9yZWY4JGZhclpNdWx0aXBsaWVyID0gX3JlZjguZmFyWk11bHRpcGxpZXIsXG4gICAgICBmYXJaTXVsdGlwbGllciA9IF9yZWY4JGZhclpNdWx0aXBsaWVyID09PSB2b2lkIDAgPyAxIDogX3JlZjgkZmFyWk11bHRpcGxpZXI7XG5cbiAgaWYgKGFsdGl0dWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3Z5ID0gYWx0aXR1ZGVUb0ZvdnkoYWx0aXR1ZGUpO1xuICB9XG5cbiAgdmFyIGhhbGZGb3YgPSAwLjUgKiBmb3Z5ICogREVHUkVFU19UT19SQURJQU5TO1xuICB2YXIgZm9jYWxEaXN0YW5jZSA9IGZvdnlUb0FsdGl0dWRlKGZvdnkpO1xuICB2YXIgcGl0Y2hSYWRpYW5zID0gcGl0Y2ggKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIHZhciB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID0gTWF0aC5zaW4oaGFsZkZvdikgKiBmb2NhbERpc3RhbmNlIC8gTWF0aC5zaW4oTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5QSSAvIDIgLSBwaXRjaFJhZGlhbnMgLSBoYWxmRm92LCAwLjAxKSwgTWF0aC5QSSAtIDAuMDEpKTtcbiAgdmFyIGZhclogPSBNYXRoLnNpbihwaXRjaFJhZGlhbnMpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIGZvY2FsRGlzdGFuY2U7XG4gIHJldHVybiB7XG4gICAgZm92OiAyICogaGFsZkZvdixcbiAgICBhc3BlY3Q6IHdpZHRoIC8gaGVpZ2h0LFxuICAgIGZvY2FsRGlzdGFuY2U6IGZvY2FsRGlzdGFuY2UsXG4gICAgbmVhcjogbmVhclpNdWx0aXBsaWVyLFxuICAgIGZhcjogZmFyWiAqIGZhclpNdWx0aXBsaWVyXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvamVjdGlvbk1hdHJpeChfcmVmOSkge1xuICB2YXIgd2lkdGggPSBfcmVmOS53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWY5LmhlaWdodCxcbiAgICAgIHBpdGNoID0gX3JlZjkucGl0Y2gsXG4gICAgICBhbHRpdHVkZSA9IF9yZWY5LmFsdGl0dWRlLFxuICAgICAgZm92eSA9IF9yZWY5LmZvdnksXG4gICAgICBuZWFyWk11bHRpcGxpZXIgPSBfcmVmOS5uZWFyWk11bHRpcGxpZXIsXG4gICAgICBmYXJaTXVsdGlwbGllciA9IF9yZWY5LmZhclpNdWx0aXBsaWVyO1xuXG4gIHZhciBfZ2V0UHJvamVjdGlvblBhcmFtZXQgPSBnZXRQcm9qZWN0aW9uUGFyYW1ldGVycyh7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGFsdGl0dWRlOiBhbHRpdHVkZSxcbiAgICBmb3Z5OiBmb3Z5LFxuICAgIHBpdGNoOiBwaXRjaCxcbiAgICBuZWFyWk11bHRpcGxpZXI6IG5lYXJaTXVsdGlwbGllcixcbiAgICBmYXJaTXVsdGlwbGllcjogZmFyWk11bHRpcGxpZXJcbiAgfSksXG4gICAgICBmb3YgPSBfZ2V0UHJvamVjdGlvblBhcmFtZXQuZm92LFxuICAgICAgYXNwZWN0ID0gX2dldFByb2plY3Rpb25QYXJhbWV0LmFzcGVjdCxcbiAgICAgIG5lYXIgPSBfZ2V0UHJvamVjdGlvblBhcmFtZXQubmVhcixcbiAgICAgIGZhciA9IF9nZXRQcm9qZWN0aW9uUGFyYW1ldC5mYXI7XG5cbiAgdmFyIHByb2plY3Rpb25NYXRyaXggPSBtYXQ0LnBlcnNwZWN0aXZlKFtdLCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyKTtcbiAgcmV0dXJuIHByb2plY3Rpb25NYXRyaXg7XG59XG5leHBvcnQgZnVuY3Rpb24gYWx0aXR1ZGVUb0ZvdnkoYWx0aXR1ZGUpIHtcbiAgcmV0dXJuIDIgKiBNYXRoLmF0YW4oMC41IC8gYWx0aXR1ZGUpICogUkFESUFOU19UT19ERUdSRUVTO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvdnlUb0FsdGl0dWRlKGZvdnkpIHtcbiAgcmV0dXJuIDAuNSAvIE1hdGgudGFuKDAuNSAqIGZvdnkgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdvcmxkVG9QaXhlbHMoeHl6LCBwaXhlbFByb2plY3Rpb25NYXRyaXgpIHtcbiAgdmFyIF94eXoyID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgIHggPSBfeHl6MlswXSxcbiAgICAgIHkgPSBfeHl6MlsxXSxcbiAgICAgIF94eXoyJCA9IF94eXoyWzJdLFxuICAgICAgeiA9IF94eXoyJCA9PT0gdm9pZCAwID8gMCA6IF94eXoyJDtcblxuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKHgpICYmIE51bWJlci5pc0Zpbml0ZSh5KSAmJiBOdW1iZXIuaXNGaW5pdGUoeikpO1xuICByZXR1cm4gdHJhbnNmb3JtVmVjdG9yKHBpeGVsUHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIHosIDFdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwaXhlbHNUb1dvcmxkKHh5eiwgcGl4ZWxVbnByb2plY3Rpb25NYXRyaXgpIHtcbiAgdmFyIHRhcmdldFogPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgdmFyIF94eXozID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgIHggPSBfeHl6M1swXSxcbiAgICAgIHkgPSBfeHl6M1sxXSxcbiAgICAgIHogPSBfeHl6M1syXTtcblxuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKHgpICYmIE51bWJlci5pc0Zpbml0ZSh5KSwgJ2ludmFsaWQgcGl4ZWwgY29vcmRpbmF0ZScpO1xuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeikpIHtcbiAgICB2YXIgY29vcmQgPSB0cmFuc2Zvcm1WZWN0b3IocGl4ZWxVbnByb2plY3Rpb25NYXRyaXgsIFt4LCB5LCB6LCAxXSk7XG4gICAgcmV0dXJuIGNvb3JkO1xuICB9XG5cbiAgdmFyIGNvb3JkMCA9IHRyYW5zZm9ybVZlY3RvcihwaXhlbFVucHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIDAsIDFdKTtcbiAgdmFyIGNvb3JkMSA9IHRyYW5zZm9ybVZlY3RvcihwaXhlbFVucHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIDEsIDFdKTtcbiAgdmFyIHowID0gY29vcmQwWzJdO1xuICB2YXIgejEgPSBjb29yZDFbMl07XG4gIHZhciB0ID0gejAgPT09IHoxID8gMCA6ICgodGFyZ2V0WiB8fCAwKSAtIHowKSAvICh6MSAtIHowKTtcbiAgcmV0dXJuIHZlYzIubGVycChbXSwgY29vcmQwLCBjb29yZDEsIHQpO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IGxvZzIgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZml0Qm91bmRzKF9yZWYpIHtcbiAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgYm91bmRzID0gX3JlZi5ib3VuZHMsXG4gICAgICBfcmVmJG1pbkV4dGVudCA9IF9yZWYubWluRXh0ZW50LFxuICAgICAgbWluRXh0ZW50ID0gX3JlZiRtaW5FeHRlbnQgPT09IHZvaWQgMCA/IDAgOiBfcmVmJG1pbkV4dGVudCxcbiAgICAgIF9yZWYkbWF4Wm9vbSA9IF9yZWYubWF4Wm9vbSxcbiAgICAgIG1heFpvb20gPSBfcmVmJG1heFpvb20gPT09IHZvaWQgMCA/IDI0IDogX3JlZiRtYXhab29tLFxuICAgICAgX3JlZiRwYWRkaW5nID0gX3JlZi5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9yZWYkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9yZWYkcGFkZGluZyxcbiAgICAgIF9yZWYkb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfcmVmJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX3JlZiRvZmZzZXQ7XG5cbiAgdmFyIF9ib3VuZHMgPSBfc2xpY2VkVG9BcnJheShib3VuZHMsIDIpLFxuICAgICAgX2JvdW5kcyQgPSBfc2xpY2VkVG9BcnJheShfYm91bmRzWzBdLCAyKSxcbiAgICAgIHdlc3QgPSBfYm91bmRzJFswXSxcbiAgICAgIHNvdXRoID0gX2JvdW5kcyRbMV0sXG4gICAgICBfYm91bmRzJDIgPSBfc2xpY2VkVG9BcnJheShfYm91bmRzWzFdLCAyKSxcbiAgICAgIGVhc3QgPSBfYm91bmRzJDJbMF0sXG4gICAgICBub3J0aCA9IF9ib3VuZHMkMlsxXTtcblxuICBpZiAoTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcpKSB7XG4gICAgdmFyIHAgPSBwYWRkaW5nO1xuICAgIHBhZGRpbmcgPSB7XG4gICAgICB0b3A6IHAsXG4gICAgICBib3R0b206IHAsXG4gICAgICBsZWZ0OiBwLFxuICAgICAgcmlnaHQ6IHBcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUocGFkZGluZy50b3ApICYmIE51bWJlci5pc0Zpbml0ZShwYWRkaW5nLmJvdHRvbSkgJiYgTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcubGVmdCkgJiYgTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcucmlnaHQpKTtcbiAgfVxuXG4gIHZhciB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbG9uZ2l0dWRlOiAwLFxuICAgIGxhdGl0dWRlOiAwLFxuICAgIHpvb206IDBcbiAgfSk7XG4gIHZhciBudyA9IHZpZXdwb3J0LnByb2plY3QoW3dlc3QsIG5vcnRoXSk7XG4gIHZhciBzZSA9IHZpZXdwb3J0LnByb2plY3QoW2Vhc3QsIHNvdXRoXSk7XG4gIHZhciBzaXplID0gW01hdGgubWF4KE1hdGguYWJzKHNlWzBdIC0gbndbMF0pLCBtaW5FeHRlbnQpLCBNYXRoLm1heChNYXRoLmFicyhzZVsxXSAtIG53WzFdKSwgbWluRXh0ZW50KV07XG4gIHZhciB0YXJnZXRTaXplID0gW3dpZHRoIC0gcGFkZGluZy5sZWZ0IC0gcGFkZGluZy5yaWdodCAtIE1hdGguYWJzKG9mZnNldFswXSkgKiAyLCBoZWlnaHQgLSBwYWRkaW5nLnRvcCAtIHBhZGRpbmcuYm90dG9tIC0gTWF0aC5hYnMob2Zmc2V0WzFdKSAqIDJdO1xuICBhc3NlcnQodGFyZ2V0U2l6ZVswXSA+IDAgJiYgdGFyZ2V0U2l6ZVsxXSA+IDApO1xuICB2YXIgc2NhbGVYID0gdGFyZ2V0U2l6ZVswXSAvIHNpemVbMF07XG4gIHZhciBzY2FsZVkgPSB0YXJnZXRTaXplWzFdIC8gc2l6ZVsxXTtcbiAgdmFyIG9mZnNldFggPSAocGFkZGluZy5yaWdodCAtIHBhZGRpbmcubGVmdCkgLyAyIC8gc2NhbGVYO1xuICB2YXIgb2Zmc2V0WSA9IChwYWRkaW5nLmJvdHRvbSAtIHBhZGRpbmcudG9wKSAvIDIgLyBzY2FsZVk7XG4gIHZhciBjZW50ZXIgPSBbKHNlWzBdICsgbndbMF0pIC8gMiArIG9mZnNldFgsIChzZVsxXSArIG53WzFdKSAvIDIgKyBvZmZzZXRZXTtcbiAgdmFyIGNlbnRlckxuZ0xhdCA9IHZpZXdwb3J0LnVucHJvamVjdChjZW50ZXIpO1xuICB2YXIgem9vbSA9IE1hdGgubWluKG1heFpvb20sIHZpZXdwb3J0Lnpvb20gKyBsb2cyKE1hdGguYWJzKE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKSkpKTtcbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZSh6b29tKSk7XG4gIHJldHVybiB7XG4gICAgbG9uZ2l0dWRlOiBjZW50ZXJMbmdMYXRbMF0sXG4gICAgbGF0aXR1ZGU6IGNlbnRlckxuZ0xhdFsxXSxcbiAgICB6b29tOiB6b29tXG4gIH07XG59IiwiaW1wb3J0IHsgd29ybGRUb0xuZ0xhdCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xuaW1wb3J0IHsgdHJhbnNmb3JtVmVjdG9yIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbnZhciBERUdSRUVTX1RPX1JBRElBTlMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRzKHZpZXdwb3J0KSB7XG4gIHZhciB6ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgd2lkdGggPSB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodCxcbiAgICAgIHVucHJvamVjdCA9IHZpZXdwb3J0LnVucHJvamVjdDtcbiAgdmFyIHVucHJvamVjdE9wcyA9IHtcbiAgICB0YXJnZXRaOiB6XG4gIH07XG4gIHZhciBib3R0b21MZWZ0ID0gdW5wcm9qZWN0KFswLCBoZWlnaHRdLCB1bnByb2plY3RPcHMpO1xuICB2YXIgYm90dG9tUmlnaHQgPSB1bnByb2plY3QoW3dpZHRoLCBoZWlnaHRdLCB1bnByb2plY3RPcHMpO1xuICB2YXIgdG9wTGVmdDtcbiAgdmFyIHRvcFJpZ2h0O1xuICB2YXIgaGFsZkZvdiA9IHZpZXdwb3J0LmZvdnkgPyAwLjUgKiB2aWV3cG9ydC5mb3Z5ICogREVHUkVFU19UT19SQURJQU5TIDogTWF0aC5hdGFuKDAuNSAvIHZpZXdwb3J0LmFsdGl0dWRlKTtcbiAgdmFyIGFuZ2xlVG9Hcm91bmQgPSAoOTAgLSB2aWV3cG9ydC5waXRjaCkgKiBERUdSRUVTX1RPX1JBRElBTlM7XG5cbiAgaWYgKGhhbGZGb3YgPiBhbmdsZVRvR3JvdW5kIC0gMC4wMSkge1xuICAgIHRvcExlZnQgPSB1bnByb2plY3RPbkZhclBsYW5lKHZpZXdwb3J0LCAwLCB6KTtcbiAgICB0b3BSaWdodCA9IHVucHJvamVjdE9uRmFyUGxhbmUodmlld3BvcnQsIHdpZHRoLCB6KTtcbiAgfSBlbHNlIHtcbiAgICB0b3BMZWZ0ID0gdW5wcm9qZWN0KFswLCAwXSwgdW5wcm9qZWN0T3BzKTtcbiAgICB0b3BSaWdodCA9IHVucHJvamVjdChbd2lkdGgsIDBdLCB1bnByb2plY3RPcHMpO1xuICB9XG5cbiAgcmV0dXJuIFtib3R0b21MZWZ0LCBib3R0b21SaWdodCwgdG9wUmlnaHQsIHRvcExlZnRdO1xufVxuXG5mdW5jdGlvbiB1bnByb2plY3RPbkZhclBsYW5lKHZpZXdwb3J0LCB4LCB0YXJnZXRaKSB7XG4gIHZhciBwaXhlbFVucHJvamVjdGlvbk1hdHJpeCA9IHZpZXdwb3J0LnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4O1xuICB2YXIgY29vcmQwID0gdHJhbnNmb3JtVmVjdG9yKHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCBbeCwgMCwgMSwgMV0pO1xuICB2YXIgY29vcmQxID0gdHJhbnNmb3JtVmVjdG9yKHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCBbeCwgdmlld3BvcnQuaGVpZ2h0LCAxLCAxXSk7XG4gIHZhciB6ID0gdGFyZ2V0WiAqIHZpZXdwb3J0LmRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXJbMl07XG4gIHZhciB0ID0gKHogLSBjb29yZDBbMl0pIC8gKGNvb3JkMVsyXSAtIGNvb3JkMFsyXSk7XG4gIHZhciBjb29yZCA9IHZlYzIubGVycChbXSwgY29vcmQwLCBjb29yZDEsIHQpO1xuICB2YXIgcmVzdWx0ID0gd29ybGRUb0xuZ0xhdChjb29yZCk7XG4gIHJlc3VsdFsyXSA9IHRhcmdldFo7XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IGNyZWF0ZU1hdDQgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuaW1wb3J0IHsgem9vbVRvU2NhbGUsIHBpeGVsc1RvV29ybGQsIGxuZ0xhdFRvV29ybGQsIHdvcmxkVG9MbmdMYXQsIHdvcmxkVG9QaXhlbHMsIGFsdGl0dWRlVG9Gb3Z5LCBmb3Z5VG9BbHRpdHVkZSwgREVGQVVMVF9BTFRJVFVERSwgZ2V0UHJvamVjdGlvbk1hdHJpeCwgZ2V0RGlzdGFuY2VTY2FsZXMsIGdldFZpZXdNYXRyaXggfSBmcm9tICcuL3dlYi1tZXJjYXRvci11dGlscyc7XG5pbXBvcnQgX2ZpdEJvdW5kcyBmcm9tICcuL2ZpdC1ib3VuZHMnO1xuaW1wb3J0IGdldEJvdW5kcyBmcm9tICcuL2dldC1ib3VuZHMnO1xuaW1wb3J0ICogYXMgbWF0NCBmcm9tICdnbC1tYXRyaXgvbWF0NCc7XG5pbXBvcnQgKiBhcyB2ZWMyIGZyb20gJ2dsLW1hdHJpeC92ZWMyJztcbmltcG9ydCAqIGFzIHZlYzMgZnJvbSAnZ2wtbWF0cml4L3ZlYzMnO1xuXG52YXIgV2ViTWVyY2F0b3JWaWV3cG9ydCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdlYk1lcmNhdG9yVmlld3BvcnQoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHtcbiAgICAgIHdpZHRoOiAxLFxuICAgICAgaGVpZ2h0OiAxXG4gICAgfSxcbiAgICAgICAgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICAgICAgX3JlZiRsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlID0gX3JlZiRsYXRpdHVkZSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkbGF0aXR1ZGUsXG4gICAgICAgIF9yZWYkbG9uZ2l0dWRlID0gX3JlZi5sb25naXR1ZGUsXG4gICAgICAgIGxvbmdpdHVkZSA9IF9yZWYkbG9uZ2l0dWRlID09PSB2b2lkIDAgPyAwIDogX3JlZiRsb25naXR1ZGUsXG4gICAgICAgIF9yZWYkem9vbSA9IF9yZWYuem9vbSxcbiAgICAgICAgem9vbSA9IF9yZWYkem9vbSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkem9vbSxcbiAgICAgICAgX3JlZiRwaXRjaCA9IF9yZWYucGl0Y2gsXG4gICAgICAgIHBpdGNoID0gX3JlZiRwaXRjaCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkcGl0Y2gsXG4gICAgICAgIF9yZWYkYmVhcmluZyA9IF9yZWYuYmVhcmluZyxcbiAgICAgICAgYmVhcmluZyA9IF9yZWYkYmVhcmluZyA9PT0gdm9pZCAwID8gMCA6IF9yZWYkYmVhcmluZyxcbiAgICAgICAgX3JlZiRhbHRpdHVkZSA9IF9yZWYuYWx0aXR1ZGUsXG4gICAgICAgIGFsdGl0dWRlID0gX3JlZiRhbHRpdHVkZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkYWx0aXR1ZGUsXG4gICAgICAgIF9yZWYkZm92eSA9IF9yZWYuZm92eSxcbiAgICAgICAgZm92eSA9IF9yZWYkZm92eSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkZm92eSxcbiAgICAgICAgX3JlZiRwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sXG4gICAgICAgIHBvc2l0aW9uID0gX3JlZiRwb3NpdGlvbiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcG9zaXRpb24sXG4gICAgICAgIF9yZWYkbmVhclpNdWx0aXBsaWVyID0gX3JlZi5uZWFyWk11bHRpcGxpZXIsXG4gICAgICAgIG5lYXJaTXVsdGlwbGllciA9IF9yZWYkbmVhclpNdWx0aXBsaWVyID09PSB2b2lkIDAgPyAwLjAyIDogX3JlZiRuZWFyWk11bHRpcGxpZXIsXG4gICAgICAgIF9yZWYkZmFyWk11bHRpcGxpZXIgPSBfcmVmLmZhclpNdWx0aXBsaWVyLFxuICAgICAgICBmYXJaTXVsdGlwbGllciA9IF9yZWYkZmFyWk11bHRpcGxpZXIgPT09IHZvaWQgMCA/IDEuMDEgOiBfcmVmJGZhclpNdWx0aXBsaWVyO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdlYk1lcmNhdG9yVmlld3BvcnQpO1xuXG4gICAgd2lkdGggPSB3aWR0aCB8fCAxO1xuICAgIGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG4gICAgaWYgKGZvdnkgPT09IG51bGwgJiYgYWx0aXR1ZGUgPT09IG51bGwpIHtcbiAgICAgIGFsdGl0dWRlID0gREVGQVVMVF9BTFRJVFVERTtcbiAgICAgIGZvdnkgPSBhbHRpdHVkZVRvRm92eShhbHRpdHVkZSk7XG4gICAgfSBlbHNlIGlmIChmb3Z5ID09PSBudWxsKSB7XG4gICAgICBmb3Z5ID0gYWx0aXR1ZGVUb0ZvdnkoYWx0aXR1ZGUpO1xuICAgIH0gZWxzZSBpZiAoYWx0aXR1ZGUgPT09IG51bGwpIHtcbiAgICAgIGFsdGl0dWRlID0gZm92eVRvQWx0aXR1ZGUoZm92eSk7XG4gICAgfVxuXG4gICAgdmFyIHNjYWxlID0gem9vbVRvU2NhbGUoem9vbSk7XG4gICAgYWx0aXR1ZGUgPSBNYXRoLm1heCgwLjc1LCBhbHRpdHVkZSk7XG4gICAgdmFyIGRpc3RhbmNlU2NhbGVzID0gZ2V0RGlzdGFuY2VTY2FsZXMoe1xuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGVcbiAgICB9KTtcbiAgICB2YXIgY2VudGVyID0gbG5nTGF0VG9Xb3JsZChbbG9uZ2l0dWRlLCBsYXRpdHVkZV0pO1xuICAgIGNlbnRlclsyXSA9IDA7XG5cbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIHZlYzMuYWRkKGNlbnRlciwgY2VudGVyLCB2ZWMzLm11bChbXSwgcG9zaXRpb24sIGRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXIpKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3Rpb25NYXRyaXggPSBnZXRQcm9qZWN0aW9uTWF0cml4KHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgZm92eTogZm92eSxcbiAgICAgIG5lYXJaTXVsdGlwbGllcjogbmVhclpNdWx0aXBsaWVyLFxuICAgICAgZmFyWk11bHRpcGxpZXI6IGZhclpNdWx0aXBsaWVyXG4gICAgfSk7XG4gICAgdGhpcy52aWV3TWF0cml4ID0gZ2V0Vmlld01hdHJpeCh7XG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgIGNlbnRlcjogY2VudGVyLFxuICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgYmVhcmluZzogYmVhcmluZyxcbiAgICAgIGFsdGl0dWRlOiBhbHRpdHVkZVxuICAgIH0pO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5sYXRpdHVkZSA9IGxhdGl0dWRlO1xuICAgIHRoaXMubG9uZ2l0dWRlID0gbG9uZ2l0dWRlO1xuICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgdGhpcy5waXRjaCA9IHBpdGNoO1xuICAgIHRoaXMuYmVhcmluZyA9IGJlYXJpbmc7XG4gICAgdGhpcy5hbHRpdHVkZSA9IGFsdGl0dWRlO1xuICAgIHRoaXMuZm92eSA9IGZvdnk7XG4gICAgdGhpcy5jZW50ZXIgPSBjZW50ZXI7XG4gICAgdGhpcy5tZXRlck9mZnNldCA9IHBvc2l0aW9uIHx8IFswLCAwLCAwXTtcbiAgICB0aGlzLmRpc3RhbmNlU2NhbGVzID0gZGlzdGFuY2VTY2FsZXM7XG5cbiAgICB0aGlzLl9pbml0TWF0cmljZXMoKTtcblxuICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2plY3QgPSB0aGlzLnByb2plY3QuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVucHJvamVjdCA9IHRoaXMudW5wcm9qZWN0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9qZWN0UG9zaXRpb24gPSB0aGlzLnByb2plY3RQb3NpdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMudW5wcm9qZWN0UG9zaXRpb24gPSB0aGlzLnVucHJvamVjdFBvc2l0aW9uLmJpbmQodGhpcyk7XG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhXZWJNZXJjYXRvclZpZXdwb3J0LCBbe1xuICAgIGtleTogXCJfaW5pdE1hdHJpY2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0TWF0cmljZXMoKSB7XG4gICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgIHByb2plY3Rpb25NYXRyaXggPSB0aGlzLnByb2plY3Rpb25NYXRyaXgsXG4gICAgICAgICAgdmlld01hdHJpeCA9IHRoaXMudmlld01hdHJpeDtcbiAgICAgIHZhciB2cG0gPSBjcmVhdGVNYXQ0KCk7XG4gICAgICBtYXQ0Lm11bHRpcGx5KHZwbSwgdnBtLCBwcm9qZWN0aW9uTWF0cml4KTtcbiAgICAgIG1hdDQubXVsdGlwbHkodnBtLCB2cG0sIHZpZXdNYXRyaXgpO1xuICAgICAgdGhpcy52aWV3UHJvamVjdGlvbk1hdHJpeCA9IHZwbTtcbiAgICAgIHZhciBtID0gY3JlYXRlTWF0NCgpO1xuICAgICAgbWF0NC5zY2FsZShtLCBtLCBbd2lkdGggLyAyLCAtaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWzEsIC0xLCAwXSk7XG4gICAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIHZwbSk7XG4gICAgICB2YXIgbUludmVyc2UgPSBtYXQ0LmludmVydChjcmVhdGVNYXQ0KCksIG0pO1xuXG4gICAgICBpZiAoIW1JbnZlcnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGl4ZWwgcHJvamVjdCBtYXRyaXggbm90IGludmVydGlibGUnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5waXhlbFByb2plY3Rpb25NYXRyaXggPSBtO1xuICAgICAgdGhpcy5waXhlbFVucHJvamVjdGlvbk1hdHJpeCA9IG1JbnZlcnNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlcXVhbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXF1YWxzKHZpZXdwb3J0KSB7XG4gICAgICBpZiAoISh2aWV3cG9ydCBpbnN0YW5jZW9mIFdlYk1lcmNhdG9yVmlld3BvcnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0LndpZHRoID09PSB0aGlzLndpZHRoICYmIHZpZXdwb3J0LmhlaWdodCA9PT0gdGhpcy5oZWlnaHQgJiYgbWF0NC5lcXVhbHModmlld3BvcnQucHJvamVjdGlvbk1hdHJpeCwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KSAmJiBtYXQ0LmVxdWFscyh2aWV3cG9ydC52aWV3TWF0cml4LCB0aGlzLnZpZXdNYXRyaXgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9qZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2plY3QoeHl6KSB7XG4gICAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICAgIF9yZWYyJHRvcExlZnQgPSBfcmVmMi50b3BMZWZ0LFxuICAgICAgICAgIHRvcExlZnQgPSBfcmVmMiR0b3BMZWZ0ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjIkdG9wTGVmdDtcblxuICAgICAgdmFyIHdvcmxkUG9zaXRpb24gPSB0aGlzLnByb2plY3RQb3NpdGlvbih4eXopO1xuICAgICAgdmFyIGNvb3JkID0gd29ybGRUb1BpeGVscyh3b3JsZFBvc2l0aW9uLCB0aGlzLnBpeGVsUHJvamVjdGlvbk1hdHJpeCk7XG5cbiAgICAgIHZhciBfY29vcmQgPSBfc2xpY2VkVG9BcnJheShjb29yZCwgMiksXG4gICAgICAgICAgeCA9IF9jb29yZFswXSxcbiAgICAgICAgICB5ID0gX2Nvb3JkWzFdO1xuXG4gICAgICB2YXIgeTIgPSB0b3BMZWZ0ID8geSA6IHRoaXMuaGVpZ2h0IC0geTtcbiAgICAgIHJldHVybiB4eXoubGVuZ3RoID09PSAyID8gW3gsIHkyXSA6IFt4LCB5MiwgY29vcmRbMl1dO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnByb2plY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5wcm9qZWN0KHh5eikge1xuICAgICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgICBfcmVmMyR0b3BMZWZ0ID0gX3JlZjMudG9wTGVmdCxcbiAgICAgICAgICB0b3BMZWZ0ID0gX3JlZjMkdG9wTGVmdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYzJHRvcExlZnQsXG4gICAgICAgICAgX3JlZjMkdGFyZ2V0WiA9IF9yZWYzLnRhcmdldFosXG4gICAgICAgICAgdGFyZ2V0WiA9IF9yZWYzJHRhcmdldFogPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYzJHRhcmdldFo7XG5cbiAgICAgIHZhciBfeHl6ID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgICAgICB4ID0gX3h5elswXSxcbiAgICAgICAgICB5ID0gX3h5elsxXSxcbiAgICAgICAgICB6ID0gX3h5elsyXTtcblxuICAgICAgdmFyIHkyID0gdG9wTGVmdCA/IHkgOiB0aGlzLmhlaWdodCAtIHk7XG4gICAgICB2YXIgdGFyZ2V0WldvcmxkID0gdGFyZ2V0WiAmJiB0YXJnZXRaICogdGhpcy5kaXN0YW5jZVNjYWxlcy51bml0c1Blck1ldGVyWzJdO1xuICAgICAgdmFyIGNvb3JkID0gcGl4ZWxzVG9Xb3JsZChbeCwgeTIsIHpdLCB0aGlzLnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCB0YXJnZXRaV29ybGQpO1xuXG4gICAgICB2YXIgX3RoaXMkdW5wcm9qZWN0UG9zaXRpID0gdGhpcy51bnByb2plY3RQb3NpdGlvbihjb29yZCksXG4gICAgICAgICAgX3RoaXMkdW5wcm9qZWN0UG9zaXRpMiA9IF9zbGljZWRUb0FycmF5KF90aGlzJHVucHJvamVjdFBvc2l0aSwgMyksXG4gICAgICAgICAgWCA9IF90aGlzJHVucHJvamVjdFBvc2l0aTJbMF0sXG4gICAgICAgICAgWSA9IF90aGlzJHVucHJvamVjdFBvc2l0aTJbMV0sXG4gICAgICAgICAgWiA9IF90aGlzJHVucHJvamVjdFBvc2l0aTJbMl07XG5cbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoeikpIHtcbiAgICAgICAgcmV0dXJuIFtYLCBZLCBaXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0YXJnZXRaKSA/IFtYLCBZLCB0YXJnZXRaXSA6IFtYLCBZXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJvamVjdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2plY3RQb3NpdGlvbih4eXopIHtcbiAgICAgIHZhciBfbG5nTGF0VG9Xb3JsZCA9IGxuZ0xhdFRvV29ybGQoeHl6KSxcbiAgICAgICAgICBfbG5nTGF0VG9Xb3JsZDIgPSBfc2xpY2VkVG9BcnJheShfbG5nTGF0VG9Xb3JsZCwgMiksXG4gICAgICAgICAgWCA9IF9sbmdMYXRUb1dvcmxkMlswXSxcbiAgICAgICAgICBZID0gX2xuZ0xhdFRvV29ybGQyWzFdO1xuXG4gICAgICB2YXIgWiA9ICh4eXpbMl0gfHwgMCkgKiB0aGlzLmRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXJbMl07XG4gICAgICByZXR1cm4gW1gsIFksIFpdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnByb2plY3RQb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnByb2plY3RQb3NpdGlvbih4eXopIHtcbiAgICAgIHZhciBfd29ybGRUb0xuZ0xhdCA9IHdvcmxkVG9MbmdMYXQoeHl6KSxcbiAgICAgICAgICBfd29ybGRUb0xuZ0xhdDIgPSBfc2xpY2VkVG9BcnJheShfd29ybGRUb0xuZ0xhdCwgMiksXG4gICAgICAgICAgWCA9IF93b3JsZFRvTG5nTGF0MlswXSxcbiAgICAgICAgICBZID0gX3dvcmxkVG9MbmdMYXQyWzFdO1xuXG4gICAgICB2YXIgWiA9ICh4eXpbMl0gfHwgMCkgKiB0aGlzLmRpc3RhbmNlU2NhbGVzLm1ldGVyc1BlclVuaXRbMl07XG4gICAgICByZXR1cm4gW1gsIFksIFpdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9qZWN0RmxhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9qZWN0RmxhdChsbmdMYXQpIHtcbiAgICAgIHJldHVybiBsbmdMYXRUb1dvcmxkKGxuZ0xhdCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVucHJvamVjdEZsYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5wcm9qZWN0RmxhdCh4eSkge1xuICAgICAgcmV0dXJuIHdvcmxkVG9MbmdMYXQoeHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oX3JlZjQpIHtcbiAgICAgIHZhciBsbmdMYXQgPSBfcmVmNC5sbmdMYXQsXG4gICAgICAgICAgcG9zID0gX3JlZjQucG9zO1xuICAgICAgdmFyIGZyb21Mb2NhdGlvbiA9IHBpeGVsc1RvV29ybGQocG9zLCB0aGlzLnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4KTtcbiAgICAgIHZhciB0b0xvY2F0aW9uID0gbG5nTGF0VG9Xb3JsZChsbmdMYXQpO1xuICAgICAgdmFyIHRyYW5zbGF0ZSA9IHZlYzIuYWRkKFtdLCB0b0xvY2F0aW9uLCB2ZWMyLm5lZ2F0ZShbXSwgZnJvbUxvY2F0aW9uKSk7XG4gICAgICB2YXIgbmV3Q2VudGVyID0gdmVjMi5hZGQoW10sIHRoaXMuY2VudGVyLCB0cmFuc2xhdGUpO1xuICAgICAgcmV0dXJuIHdvcmxkVG9MbmdMYXQobmV3Q2VudGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TG9jYXRpb25BdFBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvY2F0aW9uQXRQb2ludChfcmVmNSkge1xuICAgICAgdmFyIGxuZ0xhdCA9IF9yZWY1LmxuZ0xhdCxcbiAgICAgICAgICBwb3MgPSBfcmVmNS5wb3M7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uKHtcbiAgICAgICAgbG5nTGF0OiBsbmdMYXQsXG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZml0Qm91bmRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpdEJvdW5kcyhib3VuZHMpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cbiAgICAgIHZhciBfZml0Qm91bmRzMiA9IF9maXRCb3VuZHMoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9LCBvcHRpb25zKSksXG4gICAgICAgICAgbG9uZ2l0dWRlID0gX2ZpdEJvdW5kczIubG9uZ2l0dWRlLFxuICAgICAgICAgIGxhdGl0dWRlID0gX2ZpdEJvdW5kczIubGF0aXR1ZGUsXG4gICAgICAgICAgem9vbSA9IF9maXRCb3VuZHMyLnpvb207XG5cbiAgICAgIHJldHVybiBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgIHpvb206IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRCb3VuZHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Qm91bmRzKG9wdGlvbnMpIHtcbiAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5nZXRCb3VuZGluZ1JlZ2lvbihvcHRpb25zKTtcbiAgICAgIHZhciB3ZXN0ID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGNvcm5lcnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwWzBdO1xuICAgICAgfSkpKTtcbiAgICAgIHZhciBlYXN0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGNvcm5lcnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwWzBdO1xuICAgICAgfSkpKTtcbiAgICAgIHZhciBzb3V0aCA9IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShjb3JuZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgIH0pKSk7XG4gICAgICB2YXIgbm9ydGggPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoY29ybmVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHBbMV07XG4gICAgICB9KSkpO1xuICAgICAgcmV0dXJuIFtbd2VzdCwgc291dGhdLCBbZWFzdCwgbm9ydGhdXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Qm91bmRpbmdSZWdpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Qm91bmRpbmdSZWdpb24oKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gZ2V0Qm91bmRzKHRoaXMsIG9wdGlvbnMueiB8fCAwKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gV2ViTWVyY2F0b3JWaWV3cG9ydDtcbn0oKTtcblxuZXhwb3J0IHsgV2ViTWVyY2F0b3JWaWV3cG9ydCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQgZnJvbSAnLi93ZWItbWVyY2F0b3Itdmlld3BvcnQnO1xuaW1wb3J0IHsgbW9kLCBsb2cyIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbnZhciBNQVhfTEFUSVRVREUgPSA4NS4wNTExMztcbnZhciBNSU5fTEFUSVRVREUgPSAtODUuMDUxMTM7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemVWaWV3cG9ydFByb3BzKF9yZWYpIHtcbiAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgbG9uZ2l0dWRlID0gX3JlZi5sb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICB6b29tID0gX3JlZi56b29tLFxuICAgICAgX3JlZiRwaXRjaCA9IF9yZWYucGl0Y2gsXG4gICAgICBwaXRjaCA9IF9yZWYkcGl0Y2ggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHBpdGNoLFxuICAgICAgX3JlZiRiZWFyaW5nID0gX3JlZi5iZWFyaW5nLFxuICAgICAgYmVhcmluZyA9IF9yZWYkYmVhcmluZyA9PT0gdm9pZCAwID8gMCA6IF9yZWYkYmVhcmluZztcblxuICBpZiAobG9uZ2l0dWRlIDwgLTE4MCB8fCBsb25naXR1ZGUgPiAxODApIHtcbiAgICBsb25naXR1ZGUgPSBtb2QobG9uZ2l0dWRlICsgMTgwLCAzNjApIC0gMTgwO1xuICB9XG5cbiAgaWYgKGJlYXJpbmcgPCAtMTgwIHx8IGJlYXJpbmcgPiAxODApIHtcbiAgICBiZWFyaW5nID0gbW9kKGJlYXJpbmcgKyAxODAsIDM2MCkgLSAxODA7XG4gIH1cblxuICB2YXIgZmxhdFZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoe1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgem9vbTogem9vbVxuICB9KTtcbiAgdmFyIHRvcFkgPSBmbGF0Vmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBNQVhfTEFUSVRVREVdKVsxXTtcbiAgdmFyIGJvdHRvbVkgPSBmbGF0Vmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBNSU5fTEFUSVRVREVdKVsxXTtcbiAgdmFyIHNoaWZ0WSA9IDA7XG5cbiAgaWYgKGJvdHRvbVkgLSB0b3BZIDwgaGVpZ2h0KSB7XG4gICAgem9vbSArPSBsb2cyKGhlaWdodCAvIChib3R0b21ZIC0gdG9wWSkpO1xuICAgIGZsYXRWaWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICB6b29tOiB6b29tXG4gICAgfSk7XG4gICAgdG9wWSA9IGZsYXRWaWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIE1BWF9MQVRJVFVERV0pWzFdO1xuICAgIGJvdHRvbVkgPSBmbGF0Vmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBNSU5fTEFUSVRVREVdKVsxXTtcbiAgfVxuXG4gIGlmICh0b3BZID4gMCkge1xuICAgIHNoaWZ0WSA9IHRvcFk7XG4gIH0gZWxzZSBpZiAoYm90dG9tWSA8IGhlaWdodCkge1xuICAgIHNoaWZ0WSA9IGJvdHRvbVkgLSBoZWlnaHQ7XG4gIH1cblxuICBpZiAoc2hpZnRZKSB7XG4gICAgbGF0aXR1ZGUgPSBmbGF0Vmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCAvIDIsIGhlaWdodCAvIDIgKyBzaGlmdFldKVsxXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICB6b29tOiB6b29tLFxuICAgIHBpdGNoOiBwaXRjaCxcbiAgICBiZWFyaW5nOiBiZWFyaW5nXG4gIH07XG59IiwiZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5pbXBvcnQgeyBsZXJwIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbmltcG9ydCB7IHNjYWxlVG9ab29tLCB6b29tVG9TY2FsZSwgbG5nTGF0VG9Xb3JsZCwgd29ybGRUb0xuZ0xhdCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xudmFyIEVQU0lMT04gPSAwLjAxO1xudmFyIFZJRVdQT1JUX1RSQU5TSVRJT05fUFJPUFMgPSBbJ2xvbmdpdHVkZScsICdsYXRpdHVkZScsICd6b29tJ107XG52YXIgREVGQVVMVF9PUFRTID0ge1xuICBjdXJ2ZTogMS40MTQsXG4gIHNwZWVkOiAxLjJcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmbHlUb1ZpZXdwb3J0KHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgdmFyIHZpZXdwb3J0ID0ge307XG5cbiAgdmFyIF9nZXRGbHlUb1RyYW5zaXRpb25QYSA9IGdldEZseVRvVHJhbnNpdGlvblBhcmFtcyhzdGFydFByb3BzLCBlbmRQcm9wcywgb3B0cyksXG4gICAgICBzdGFydFpvb20gPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEuc3RhcnRab29tLFxuICAgICAgc3RhcnRDZW50ZXJYWSA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5zdGFydENlbnRlclhZLFxuICAgICAgdURlbHRhID0gX2dldEZseVRvVHJhbnNpdGlvblBhLnVEZWx0YSxcbiAgICAgIHcwID0gX2dldEZseVRvVHJhbnNpdGlvblBhLncwLFxuICAgICAgdTEgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEudTEsXG4gICAgICBTID0gX2dldEZseVRvVHJhbnNpdGlvblBhLlMsXG4gICAgICByaG8gPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEucmhvLFxuICAgICAgcmhvMiA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5yaG8yLFxuICAgICAgcjAgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEucjA7XG5cbiAgaWYgKHUxIDwgRVBTSUxPTikge1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0UHJvcHNba2V5XTtcbiAgICAgICAgdmFyIGVuZFZhbHVlID0gZW5kUHJvcHNba2V5XTtcbiAgICAgICAgdmlld3BvcnRba2V5XSA9IGxlcnAoc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnQ7XG4gIH1cblxuICB2YXIgcyA9IHQgKiBTO1xuICB2YXIgdyA9IE1hdGguY29zaChyMCkgLyBNYXRoLmNvc2gocjAgKyByaG8gKiBzKTtcbiAgdmFyIHUgPSB3MCAqICgoTWF0aC5jb3NoKHIwKSAqIE1hdGgudGFuaChyMCArIHJobyAqIHMpIC0gTWF0aC5zaW5oKHIwKSkgLyByaG8yKSAvIHUxO1xuICB2YXIgc2NhbGVJbmNyZW1lbnQgPSAxIC8gdztcbiAgdmFyIG5ld1pvb20gPSBzdGFydFpvb20gKyBzY2FsZVRvWm9vbShzY2FsZUluY3JlbWVudCk7XG4gIHZhciBuZXdDZW50ZXJXb3JsZCA9IHZlYzIuc2NhbGUoW10sIHVEZWx0YSwgdSk7XG4gIHZlYzIuYWRkKG5ld0NlbnRlcldvcmxkLCBuZXdDZW50ZXJXb3JsZCwgc3RhcnRDZW50ZXJYWSk7XG4gIHZhciBuZXdDZW50ZXIgPSB3b3JsZFRvTG5nTGF0KG5ld0NlbnRlcldvcmxkKTtcbiAgdmlld3BvcnQubG9uZ2l0dWRlID0gbmV3Q2VudGVyWzBdO1xuICB2aWV3cG9ydC5sYXRpdHVkZSA9IG5ld0NlbnRlclsxXTtcbiAgdmlld3BvcnQuem9vbSA9IG5ld1pvb207XG4gIHJldHVybiB2aWV3cG9ydDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbHlUb0R1cmF0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUUywgb3B0cyk7XG4gIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICBzY3JlZW5TcGVlZCA9IF9vcHRzLnNjcmVlblNwZWVkLFxuICAgICAgc3BlZWQgPSBfb3B0cy5zcGVlZCxcbiAgICAgIG1heER1cmF0aW9uID0gX29wdHMubWF4RHVyYXRpb247XG5cbiAgdmFyIF9nZXRGbHlUb1RyYW5zaXRpb25QYTIgPSBnZXRGbHlUb1RyYW5zaXRpb25QYXJhbXMoc3RhcnRQcm9wcywgZW5kUHJvcHMsIG9wdHMpLFxuICAgICAgUyA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYTIuUyxcbiAgICAgIHJobyA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYTIucmhvO1xuXG4gIHZhciBsZW5ndGggPSAxMDAwICogUztcbiAgdmFyIGR1cmF0aW9uO1xuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoc2NyZWVuU3BlZWQpKSB7XG4gICAgZHVyYXRpb24gPSBsZW5ndGggLyAoc2NyZWVuU3BlZWQgLyByaG8pO1xuICB9IGVsc2Uge1xuICAgIGR1cmF0aW9uID0gbGVuZ3RoIC8gc3BlZWQ7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG1heER1cmF0aW9uKSAmJiBkdXJhdGlvbiA+IG1heER1cmF0aW9uID8gMCA6IGR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRGbHlUb1RyYW5zaXRpb25QYXJhbXMoc3RhcnRQcm9wcywgZW5kUHJvcHMsIG9wdHMpIHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUUywgb3B0cyk7XG4gIHZhciByaG8gPSBvcHRzLmN1cnZlO1xuICB2YXIgc3RhcnRab29tID0gc3RhcnRQcm9wcy56b29tO1xuICB2YXIgc3RhcnRDZW50ZXIgPSBbc3RhcnRQcm9wcy5sb25naXR1ZGUsIHN0YXJ0UHJvcHMubGF0aXR1ZGVdO1xuICB2YXIgc3RhcnRTY2FsZSA9IHpvb21Ub1NjYWxlKHN0YXJ0Wm9vbSk7XG4gIHZhciBlbmRab29tID0gZW5kUHJvcHMuem9vbTtcbiAgdmFyIGVuZENlbnRlciA9IFtlbmRQcm9wcy5sb25naXR1ZGUsIGVuZFByb3BzLmxhdGl0dWRlXTtcbiAgdmFyIHNjYWxlID0gem9vbVRvU2NhbGUoZW5kWm9vbSAtIHN0YXJ0Wm9vbSk7XG4gIHZhciBzdGFydENlbnRlclhZID0gbG5nTGF0VG9Xb3JsZChzdGFydENlbnRlcik7XG4gIHZhciBlbmRDZW50ZXJYWSA9IGxuZ0xhdFRvV29ybGQoZW5kQ2VudGVyKTtcbiAgdmFyIHVEZWx0YSA9IHZlYzIuc3ViKFtdLCBlbmRDZW50ZXJYWSwgc3RhcnRDZW50ZXJYWSk7XG4gIHZhciB3MCA9IE1hdGgubWF4KHN0YXJ0UHJvcHMud2lkdGgsIHN0YXJ0UHJvcHMuaGVpZ2h0KTtcbiAgdmFyIHcxID0gdzAgLyBzY2FsZTtcbiAgdmFyIHUxID0gdmVjMi5sZW5ndGgodURlbHRhKSAqIHN0YXJ0U2NhbGU7XG5cbiAgdmFyIF91MSA9IE1hdGgubWF4KHUxLCBFUFNJTE9OKTtcblxuICB2YXIgcmhvMiA9IHJobyAqIHJobztcbiAgdmFyIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvMiAqIHJobzIgKiBfdTEgKiBfdTEpIC8gKDIgKiB3MCAqIHJobzIgKiBfdTEpO1xuICB2YXIgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG8yICogcmhvMiAqIF91MSAqIF91MSkgLyAoMiAqIHcxICogcmhvMiAqIF91MSk7XG4gIHZhciByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCk7XG4gIHZhciByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gIHZhciBTID0gKHIxIC0gcjApIC8gcmhvO1xuICByZXR1cm4ge1xuICAgIHN0YXJ0Wm9vbTogc3RhcnRab29tLFxuICAgIHN0YXJ0Q2VudGVyWFk6IHN0YXJ0Q2VudGVyWFksXG4gICAgdURlbHRhOiB1RGVsdGEsXG4gICAgdzA6IHcwLFxuICAgIHUxOiB1MSxcbiAgICBTOiBTLFxuICAgIHJobzogcmhvLFxuICAgIHJobzI6IHJobzIsXG4gICAgcjA6IHIwLFxuICAgIHIxOiByMVxuICB9O1xufSIsImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFdlYk1lcmNhdG9yVmlld3BvcnQgfSBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldEJvdW5kcyB9IGZyb20gJy4vZ2V0LWJvdW5kcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpdEJvdW5kcyB9IGZyb20gJy4vZml0LWJvdW5kcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vcm1hbGl6ZVZpZXdwb3J0UHJvcHMgfSBmcm9tICcuL25vcm1hbGl6ZS12aWV3cG9ydC1wcm9wcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZseVRvVmlld3BvcnQsIGdldEZseVRvRHVyYXRpb24gfSBmcm9tICcuL2ZseS10by12aWV3cG9ydCc7XG5leHBvcnQgeyBsbmdMYXRUb1dvcmxkLCB3b3JsZFRvTG5nTGF0LCB3b3JsZFRvUGl4ZWxzLCBwaXhlbHNUb1dvcmxkLCB6b29tVG9TY2FsZSwgc2NhbGVUb1pvb20sIGdldE1ldGVyWm9vbSwgZ2V0RGlzdGFuY2VTY2FsZXMsIGFkZE1ldGVyc1RvTG5nTGF0LCBnZXRWaWV3TWF0cml4LCBnZXRQcm9qZWN0aW9uTWF0cml4LCBnZXRQcm9qZWN0aW9uUGFyYW1ldGVycyB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJzsiLCJleHBvcnQgeyBXZWJNZXJjYXRvclZpZXdwb3J0IGFzIGRlZmF1bHQgfSBmcm9tICdAbWF0aC5nbC93ZWItbWVyY2F0b3InO1xuZXhwb3J0ICogZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJzsiLCIvKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNoaW1zIHRoYXQgcHJvdmlkZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEVTNiBjb2xsZWN0aW9ucy5cclxuICpcclxuICogVGhlc2UgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgbWVhbnQgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBSZXNpemVPYnNlcnZlclxyXG4gKiBtb2R1bGVzIGFzIHRoZXkgY292ZXIgb25seSBhIGxpbWl0ZWQgcmFuZ2Ugb2YgdXNlIGNhc2VzLlxyXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1qc2RvYywgdmFsaWQtanNkb2MgKi9cbnZhciBNYXBTaGltID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gTWFwO1xuICB9XG4gIC8qKlxyXG4gICAqIFJldHVybnMgaW5kZXggaW4gcHJvdmlkZWQgYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQga2V5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBcnJheTxBcnJheT59IGFyclxyXG4gICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldEluZGV4KGFyciwga2V5KSB7XG4gICAgdmFyIHJlc3VsdCA9IC0xO1xuICAgIGFyci5zb21lKGZ1bmN0aW9uIChlbnRyeSwgaW5kZXgpIHtcbiAgICAgIGlmIChlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJlc3VsdCA9IGluZGV4O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8qKiBAY2xhc3MgKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xuICAgICAgICB0aGlzLl9fZW50cmllc19fID0gW107XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fZW50cmllc19fLmxlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcmV0dXJucyB7Kn1cclxuICAgICAgICovXG5cbiAgICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fX2VudHJpZXNfX1tpbmRleF07XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVsxXTtcbiAgICAgIH07XG4gICAgICAvKipcclxuICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZVxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcblxuICAgICAgICBpZiAofmluZGV4KSB7XG4gICAgICAgICAgdGhpcy5fX2VudHJpZXNfX1tpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuX19lbnRyaWVzX187XG4gICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4KGVudHJpZXMsIGtleSk7XG5cbiAgICAgICAgaWYgKH5pbmRleCkge1xuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gISF+Z2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcbiAgICAgIH07XG4gICAgICAvKipcclxuICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAqL1xuXG5cbiAgICAgIGNsYXNzXzEucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9fZW50cmllc19fLnNwbGljZSgwKTtcbiAgICAgIH07XG4gICAgICAvKipcclxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcclxuICAgICAgICogQHBhcmFtIHsqfSBbY3R4PW51bGxdXHJcbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgKi9cblxuXG4gICAgICBjbGFzc18xLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjdHgpIHtcbiAgICAgICAgaWYgKGN0eCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY3R4ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLl9fZW50cmllc19fOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBlbnRyeSA9IF9hW19pXTtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKGN0eCwgZW50cnlbMV0sIGVudHJ5WzBdKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGNsYXNzXzE7XG4gICAgfSgpXG4gICk7XG59KCk7XG4vKipcclxuICogRGV0ZWN0cyB3aGV0aGVyIHdpbmRvdyBhbmQgZG9jdW1lbnQgb2JqZWN0cyBhcmUgYXZhaWxhYmxlIGluIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcbiAqL1xuXG5cbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCA9PT0gZG9jdW1lbnQ7IC8vIFJldHVybnMgZ2xvYmFsIG9iamVjdCBvZiBhIGN1cnJlbnQgZW52aXJvbm1lbnQuXG5cbnZhciBnbG9iYWwkMSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5NYXRoID09PSBNYXRoKSB7XG4gICAgcmV0dXJuIGdsb2JhbDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09PSBNYXRoKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT09IE1hdGgpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuXG5cbiAgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG59KCk7XG4vKipcclxuICogQSBzaGltIGZvciB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdoaWNoIGZhbGxzIGJhY2sgdG8gdGhlIHNldFRpbWVvdXQgaWZcclxuICogZmlyc3Qgb25lIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJlcXVlc3RzJyBpZGVudGlmaWVyLlxyXG4gKi9cblxuXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSXQncyByZXF1aXJlZCB0byB1c2UgYSBib3VuZGVkIGZ1bmN0aW9uIGJlY2F1c2UgSUUgc29tZXRpbWVzIHRocm93c1xuICAgIC8vIGFuIFwiSW52YWxpZCBjYWxsaW5nIG9iamVjdFwiIGVycm9yIGlmIHJBRiBpcyBpbnZva2VkIHdpdGhvdXQgdGhlIGdsb2JhbFxuICAgIC8vIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUuXG4gICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbCQxKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soRGF0ZS5ub3coKSk7XG4gICAgfSwgMTAwMCAvIDYwKTtcbiAgfTtcbn0oKTsgLy8gRGVmaW5lcyBtaW5pbXVtIHRpbWVvdXQgYmVmb3JlIGFkZGluZyBhIHRyYWlsaW5nIGNhbGwuXG5cblxudmFyIHRyYWlsaW5nVGltZW91dCA9IDI7XG4vKipcclxuICogQ3JlYXRlcyBhIHdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggZW5zdXJlcyB0aGF0IHByb3ZpZGVkIGNhbGxiYWNrIHdpbGwgYmVcclxuICogaW52b2tlZCBvbmx5IG9uY2UgZHVyaW5nIHRoZSBzcGVjaWZpZWQgZGVsYXkgcGVyaW9kLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGRlbGF5IHBlcmlvZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gRGVsYXkgYWZ0ZXIgd2hpY2ggdG8gaW52b2tlIGNhbGxiYWNrLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgZGVsYXkpIHtcbiAgdmFyIGxlYWRpbmdDYWxsID0gZmFsc2UsXG4gICAgICB0cmFpbGluZ0NhbGwgPSBmYWxzZSxcbiAgICAgIGxhc3RDYWxsVGltZSA9IDA7XG4gIC8qKlxyXG4gICAqIEludm9rZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBzY2hlZHVsZXMgbmV3IGludm9jYXRpb24gaWZcclxuICAgKiB0aGUgXCJwcm94eVwiIHdhcyBjYWxsZWQgZHVyaW5nIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVQZW5kaW5nKCkge1xuICAgIGlmIChsZWFkaW5nQ2FsbCkge1xuICAgICAgbGVhZGluZ0NhbGwgPSBmYWxzZTtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgaWYgKHRyYWlsaW5nQ2FsbCkge1xuICAgICAgcHJveHkoKTtcbiAgICB9XG4gIH1cbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LiBJdCB3aWxsIGZ1cnRoZXIgcG9zdHBvbmVcclxuICAgKiBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBkZWxlZ2F0aW5nIGl0IHRvIHRoZVxyXG4gICAqIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gdGltZW91dENhbGxiYWNrKCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSQxKHJlc29sdmVQZW5kaW5nKTtcbiAgfVxuICAvKipcclxuICAgKiBTY2hlZHVsZXMgaW52b2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHByb3h5KCkge1xuICAgIHZhciB0aW1lU3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGxlYWRpbmdDYWxsKSB7XG4gICAgICAvLyBSZWplY3QgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzLlxuICAgICAgaWYgKHRpbWVTdGFtcCAtIGxhc3RDYWxsVGltZSA8IHRyYWlsaW5nVGltZW91dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFNjaGVkdWxlIG5ldyBjYWxsIHRvIGJlIGluIGludm9rZWQgd2hlbiB0aGUgcGVuZGluZyBvbmUgaXMgcmVzb2x2ZWQuXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgXCJ0cmFuc2l0aW9uc1wiIHdoaWNoIG5ldmVyIGFjdHVhbGx5IHN0YXJ0XG4gICAgICAvLyBpbW1lZGlhdGVseSBzbyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHdlIG1pZ2h0IG1pc3Mgb25lIGlmIGNoYW5nZVxuICAgICAgLy8gaGFwcGVucyBhbWlkcyB0aGUgcGVuZGluZyBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRyYWlsaW5nQ2FsbCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlYWRpbmdDYWxsID0gdHJ1ZTtcbiAgICAgIHRyYWlsaW5nQ2FsbCA9IGZhbHNlO1xuICAgICAgc2V0VGltZW91dCh0aW1lb3V0Q2FsbGJhY2ssIGRlbGF5KTtcbiAgICB9XG5cbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lU3RhbXA7XG4gIH1cblxuICByZXR1cm4gcHJveHk7XG59IC8vIE1pbmltdW0gZGVsYXkgYmVmb3JlIGludm9raW5nIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2ZXJzLlxuXG5cbnZhciBSRUZSRVNIX0RFTEFZID0gMjA7IC8vIEEgbGlzdCBvZiBzdWJzdHJpbmdzIG9mIENTUyBwcm9wZXJ0aWVzIHVzZWQgdG8gZmluZCB0cmFuc2l0aW9uIGV2ZW50cyB0aGF0XG4vLyBtaWdodCBhZmZlY3QgZGltZW5zaW9ucyBvZiBvYnNlcnZlZCBlbGVtZW50cy5cblxudmFyIHRyYW5zaXRpb25LZXlzID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ3NpemUnLCAnd2VpZ2h0J107IC8vIENoZWNrIGlmIE11dGF0aW9uT2JzZXJ2ZXIgaXMgYXZhaWxhYmxlLlxuXG52YXIgbXV0YXRpb25PYnNlcnZlclN1cHBvcnRlZCA9IHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcbi8qKlxyXG4gKiBTaW5nbGV0b24gY29udHJvbGxlciBjbGFzcyB3aGljaCBoYW5kbGVzIHVwZGF0ZXMgb2YgUmVzaXplT2JzZXJ2ZXIgaW5zdGFuY2VzLlxyXG4gKi9cblxudmFyIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCkge1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgRE9NIGxpc3RlbmVycyBoYXZlIGJlZW4gYWRkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICB0aGlzLmNvbm5lY3RlZF8gPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIFRlbGxzIHRoYXQgY29udHJvbGxlciBoYXMgc3Vic2NyaWJlZCBmb3IgTXV0YXRpb24gRXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBLZWVwcyByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIG9mIE11dGF0aW9uT2JzZXJ2ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge011dGF0aW9uT2JzZXJ2ZXJ9XHJcbiAgICAgKi9cblxuICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtBcnJheTxSZXNpemVPYnNlcnZlclNQST59XHJcbiAgICAgKi9cblxuICAgIHRoaXMub2JzZXJ2ZXJzXyA9IFtdO1xuICAgIHRoaXMub25UcmFuc2l0aW9uRW5kXyA9IHRoaXMub25UcmFuc2l0aW9uRW5kXy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVmcmVzaCA9IHRocm90dGxlKHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpLCBSRUZSRVNIX0RFTEFZKTtcbiAgfVxuICAvKipcclxuICAgKiBBZGRzIG9ic2VydmVyIHRvIG9ic2VydmVycyBsaXN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSBhZGRlZC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuYWRkT2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICBpZiAoIX50aGlzLm9ic2VydmVyc18uaW5kZXhPZihvYnNlcnZlcikpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzXy5wdXNoKG9ic2VydmVyKTtcbiAgICB9IC8vIEFkZCBsaXN0ZW5lcnMgaWYgdGhleSBoYXZlbid0IGJlZW4gYWRkZWQgeWV0LlxuXG5cbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkXykge1xuICAgICAgdGhpcy5jb25uZWN0XygpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBvYnNlcnZlciBmcm9tIG9ic2VydmVycyBsaXN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSByZW1vdmVkLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc187XG4gICAgdmFyIGluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpOyAvLyBSZW1vdmUgb2JzZXJ2ZXIgaWYgaXQncyBwcmVzZW50IGluIHJlZ2lzdHJ5LlxuXG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSAvLyBSZW1vdmUgbGlzdGVuZXJzIGlmIGNvbnRyb2xsZXIgaGFzIG5vIGNvbm5lY3RlZCBvYnNlcnZlcnMuXG5cblxuICAgIGlmICghb2JzZXJ2ZXJzLmxlbmd0aCAmJiB0aGlzLmNvbm5lY3RlZF8pIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdF8oKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEludm9rZXMgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuIEl0IHdpbGwgY29udGludWUgcnVubmluZyB1cGRhdGVzIGluc29mYXJcclxuICAgKiBpdCBkZXRlY3RzIGNoYW5nZXMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2hhbmdlc0RldGVjdGVkID0gdGhpcy51cGRhdGVPYnNlcnZlcnNfKCk7IC8vIENvbnRpbnVlIHJ1bm5pbmcgdXBkYXRlcyBpZiBjaGFuZ2VzIGhhdmUgYmVlbiBkZXRlY3RlZCBhcyB0aGVyZSBtaWdodFxuICAgIC8vIGJlIGZ1dHVyZSBvbmVzIGNhdXNlZCBieSBDU1MgdHJhbnNpdGlvbnMuXG5cbiAgICBpZiAoY2hhbmdlc0RldGVjdGVkKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgZXZlcnkgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdCBhbmQgbm90aWZpZXMgdGhlbSBvZiBxdWV1ZWRcclxuICAgKiBlbnRyaWVzLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBcInRydWVcIiBpZiBhbnkgb2JzZXJ2ZXIgaGFzIGRldGVjdGVkIGNoYW5nZXMgaW5cclxuICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgaXQncyBlbGVtZW50cy5cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUudXBkYXRlT2JzZXJ2ZXJzXyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBDb2xsZWN0IG9ic2VydmVycyB0aGF0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cbiAgICB2YXIgYWN0aXZlT2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnNfLmZpbHRlcihmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBvYnNlcnZlci5nYXRoZXJBY3RpdmUoKSwgb2JzZXJ2ZXIuaGFzQWN0aXZlKCk7XG4gICAgfSk7IC8vIERlbGl2ZXIgbm90aWZpY2F0aW9ucyBpbiBhIHNlcGFyYXRlIGN5Y2xlIGluIG9yZGVyIHRvIGF2b2lkIGFueVxuICAgIC8vIGNvbGxpc2lvbnMgYmV0d2VlbiBvYnNlcnZlcnMsIGUuZy4gd2hlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2ZcbiAgICAvLyBSZXNpemVPYnNlcnZlciBhcmUgdHJhY2tpbmcgdGhlIHNhbWUgZWxlbWVudCBhbmQgdGhlIGNhbGxiYWNrIG9mIG9uZVxuICAgIC8vIG9mIHRoZW0gY2hhbmdlcyBjb250ZW50IGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIHRhcmdldC4gU29tZXRpbWVzXG4gICAgLy8gdGhpcyBtYXkgcmVzdWx0IGluIG5vdGlmaWNhdGlvbnMgYmVpbmcgYmxvY2tlZCBmb3IgdGhlIHJlc3Qgb2Ygb2JzZXJ2ZXJzLlxuXG4gICAgYWN0aXZlT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2ZXIuYnJvYWRjYXN0QWN0aXZlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZU9ic2VydmVycy5sZW5ndGggPiAwO1xuICB9O1xuICAvKipcclxuICAgKiBJbml0aWFsaXplcyBET00gbGlzdGVuZXJzLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuY29ubmVjdF8gPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBydW5uaW5nIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgb3IgaWYgbGlzdGVuZXJzXG4gICAgLy8gaGF2ZSBiZWVuIGFscmVhZHkgYWRkZWQuXG4gICAgaWYgKCFpc0Jyb3dzZXIgfHwgdGhpcy5jb25uZWN0ZWRfKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTdWJzY3JpcHRpb24gdG8gdGhlIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvclxuICAgIC8vIGRlbGF5ZWQgdHJhbnNpdGlvbnMuIFRoaXMgd2F5IGl0J3MgcG9zc2libGUgdG8gY2FwdHVyZSBhdCBsZWFzdCB0aGVcbiAgICAvLyBmaW5hbCBzdGF0ZSBvZiBhbiBlbGVtZW50LlxuXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5vblRyYW5zaXRpb25FbmRfKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZWZyZXNoKTtcblxuICAgIGlmIChtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMucmVmcmVzaCk7XG4gICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5vYnNlcnZlKGRvY3VtZW50LCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTVN1YnRyZWVNb2RpZmllZCcsIHRoaXMucmVmcmVzaCk7XG4gICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3RlZF8gPSB0cnVlO1xuICB9O1xuICAvKipcclxuICAgKiBSZW1vdmVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5kaXNjb25uZWN0XyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIHJ1bm5pbmcgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBpZiBsaXN0ZW5lcnNcbiAgICAvLyBoYXZlIGJlZW4gYWxyZWFkeSByZW1vdmVkLlxuICAgIGlmICghaXNCcm93c2VyIHx8ICF0aGlzLmNvbm5lY3RlZF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5vblRyYW5zaXRpb25FbmRfKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZWZyZXNoKTtcblxuICAgIGlmICh0aGlzLm11dGF0aW9uc09ic2VydmVyXykge1xuICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdET01TdWJ0cmVlTW9kaWZpZWQnLCB0aGlzLnJlZnJlc2gpO1xuICAgIH1cblxuICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcbiAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGhhbmRsZXIuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSB7VHJhbnNpdGlvbkV2ZW50fSBldmVudFxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5vblRyYW5zaXRpb25FbmRfID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2EucHJvcGVydHlOYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWUgPSBfYiA9PT0gdm9pZCAwID8gJycgOiBfYjsgLy8gRGV0ZWN0IHdoZXRoZXIgdHJhbnNpdGlvbiBtYXkgYWZmZWN0IGRpbWVuc2lvbnMgb2YgYW4gZWxlbWVudC5cblxuICAgIHZhciBpc1JlZmxvd1Byb3BlcnR5ID0gdHJhbnNpdGlvbktleXMuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gISF+cHJvcGVydHlOYW1lLmluZGV4T2Yoa2V5KTtcbiAgICB9KTtcblxuICAgIGlmIChpc1JlZmxvd1Byb3BlcnR5KSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgaW5zdGFuY2Ugb2YgdGhlIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlXykge1xuICAgICAgdGhpcy5pbnN0YW5jZV8gPSBuZXcgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VfO1xuICB9O1xuICAvKipcclxuICAgKiBIb2xkcyByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2xsZXIncyBpbnN0YW5jZS5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuaW5zdGFuY2VfID0gbnVsbDtcbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcjtcbn0oKTtcbi8qKlxyXG4gKiBEZWZpbmVzIG5vbi13cml0YWJsZS9lbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIHRhcmdldCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBPYmplY3QgZm9yIHdoaWNoIHRvIGRlZmluZSBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBQcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRhcmdldCBvYmplY3QuXHJcbiAqL1xuXG5cbnZhciBkZWZpbmVDb25maWd1cmFibGUgPSBmdW5jdGlvbiBkZWZpbmVDb25maWd1cmFibGUodGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrZXkgPSBfYVtfaV07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICB2YWx1ZTogcHJvcHNba2V5XSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlZCBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XHJcbiAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAqL1xuXG5cbnZhciBnZXRXaW5kb3dPZiA9IGZ1bmN0aW9uIGdldFdpbmRvd09mKHRhcmdldCkge1xuICAvLyBBc3N1bWUgdGhhdCB0aGUgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiBOb2RlLCB3aGljaCBtZWFucyB0aGF0IGl0XG4gIC8vIGhhcyB0aGUgXCJvd25lckRvY3VtZW50XCIgcHJvcGVydHkgZnJvbSB3aGljaCB3ZSBjYW4gcmV0cmlldmUgYVxuICAvLyBjb3JyZXNwb25kaW5nIGdsb2JhbCBvYmplY3QuXG4gIHZhciBvd25lckdsb2JhbCA9IHRhcmdldCAmJiB0YXJnZXQub3duZXJEb2N1bWVudCAmJiB0YXJnZXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsgLy8gUmV0dXJuIHRoZSBsb2NhbCBnbG9iYWwgb2JqZWN0IGlmIGl0J3Mgbm90IHBvc3NpYmxlIGV4dHJhY3Qgb25lIGZyb21cbiAgLy8gcHJvdmlkZWQgZWxlbWVudC5cblxuICByZXR1cm4gb3duZXJHbG9iYWwgfHwgZ2xvYmFsJDE7XG59OyAvLyBQbGFjZWhvbGRlciBvZiBhbiBlbXB0eSBjb250ZW50IHJlY3RhbmdsZS5cblxuXG52YXIgZW1wdHlSZWN0ID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XG4vKipcclxuICogQ29udmVydHMgcHJvdmlkZWQgc3RyaW5nIHRvIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xuXG5mdW5jdGlvbiB0b0Zsb2F0KHZhbHVlKSB7XG4gIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwO1xufVxuLyoqXHJcbiAqIEV4dHJhY3RzIGJvcmRlcnMgc2l6ZSBmcm9tIHByb3ZpZGVkIHN0eWxlcy5cclxuICpcclxuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IHBvc2l0aW9ucyAtIEJvcmRlcnMgcG9zaXRpb25zICh0b3AsIHJpZ2h0LCAuLi4pXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJvcmRlcnNTaXplKHN0eWxlcykge1xuICB2YXIgcG9zaXRpb25zID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBwb3NpdGlvbnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICByZXR1cm4gcG9zaXRpb25zLnJlZHVjZShmdW5jdGlvbiAoc2l6ZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ2JvcmRlci0nICsgcG9zaXRpb24gKyAnLXdpZHRoJ107XG4gICAgcmV0dXJuIHNpemUgKyB0b0Zsb2F0KHZhbHVlKTtcbiAgfSwgMCk7XG59XG4vKipcclxuICogRXh0cmFjdHMgcGFkZGluZ3Mgc2l6ZXMgZnJvbSBwcm92aWRlZCBzdHlsZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFBhZGRpbmdzIGJveC5cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0UGFkZGluZ3Moc3R5bGVzKSB7XG4gIHZhciBwb3NpdGlvbnMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xuICB2YXIgcGFkZGluZ3MgPSB7fTtcblxuICBmb3IgKHZhciBfaSA9IDAsIHBvc2l0aW9uc18xID0gcG9zaXRpb25zOyBfaSA8IHBvc2l0aW9uc18xLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBwb3NpdGlvbiA9IHBvc2l0aW9uc18xW19pXTtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ3BhZGRpbmctJyArIHBvc2l0aW9uXTtcbiAgICBwYWRkaW5nc1twb3NpdGlvbl0gPSB0b0Zsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBwYWRkaW5ncztcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHByb3ZpZGVkIFNWRyBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1NWR0dyYXBoaWNzRWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCBjb250ZW50IHJlY3RhbmdsZSBvZiB3aGljaCBuZWVkc1xyXG4gKiAgICAgIHRvIGJlIGNhbGN1bGF0ZWQuXHJcbiAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KSB7XG4gIHZhciBiYm94ID0gdGFyZ2V0LmdldEJCb3goKTtcbiAgcmV0dXJuIGNyZWF0ZVJlY3RJbml0KDAsIDAsIGJib3gud2lkdGgsIGJib3guaGVpZ2h0KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHByb3ZpZGVkIEhUTUxFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KSB7XG4gIC8vIENsaWVudCB3aWR0aCAmIGhlaWdodCBwcm9wZXJ0aWVzIGNhbid0IGJlXG4gIC8vIHVzZWQgZXhjbHVzaXZlbHkgYXMgdGhleSBwcm92aWRlIHJvdW5kZWQgdmFsdWVzLlxuICB2YXIgY2xpZW50V2lkdGggPSB0YXJnZXQuY2xpZW50V2lkdGgsXG4gICAgICBjbGllbnRIZWlnaHQgPSB0YXJnZXQuY2xpZW50SGVpZ2h0OyAvLyBCeSB0aGlzIGNvbmRpdGlvbiB3ZSBjYW4gY2F0Y2ggYWxsIG5vbi1yZXBsYWNlZCBpbmxpbmUsIGhpZGRlbiBhbmRcbiAgLy8gZGV0YWNoZWQgZWxlbWVudHMuIFRob3VnaCBlbGVtZW50cyB3aXRoIHdpZHRoICYgaGVpZ2h0IHByb3BlcnRpZXMgbGVzc1xuICAvLyB0aGFuIDAuNSB3aWxsIGJlIGRpc2NhcmRlZCBhcyB3ZWxsLlxuICAvL1xuICAvLyBXaXRob3V0IGl0IHdlIHdvdWxkIG5lZWQgdG8gaW1wbGVtZW50IHNlcGFyYXRlIG1ldGhvZHMgZm9yIGVhY2ggb2ZcbiAgLy8gdGhvc2UgY2FzZXMgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHBlcmZvcm0gYSBwcmVjaXNlIGFuZCBwZXJmb3JtYW5jZVxuICAvLyBlZmZlY3RpdmUgdGVzdCBmb3IgaGlkZGVuIGVsZW1lbnRzLiBFLmcuIGV2ZW4galF1ZXJ5J3MgJzp2aXNpYmxlJyBmaWx0ZXJcbiAgLy8gZ2l2ZXMgd3JvbmcgcmVzdWx0cyBmb3IgZWxlbWVudHMgd2l0aCB3aWR0aCAmIGhlaWdodCBsZXNzIHRoYW4gMC41LlxuXG4gIGlmICghY2xpZW50V2lkdGggJiYgIWNsaWVudEhlaWdodCkge1xuICAgIHJldHVybiBlbXB0eVJlY3Q7XG4gIH1cblxuICB2YXIgc3R5bGVzID0gZ2V0V2luZG93T2YodGFyZ2V0KS5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gIHZhciBwYWRkaW5ncyA9IGdldFBhZGRpbmdzKHN0eWxlcyk7XG4gIHZhciBob3JpelBhZCA9IHBhZGRpbmdzLmxlZnQgKyBwYWRkaW5ncy5yaWdodDtcbiAgdmFyIHZlcnRQYWQgPSBwYWRkaW5ncy50b3AgKyBwYWRkaW5ncy5ib3R0b207IC8vIENvbXB1dGVkIHN0eWxlcyBvZiB3aWR0aCAmIGhlaWdodCBhcmUgYmVpbmcgdXNlZCBiZWNhdXNlIHRoZXkgYXJlIHRoZVxuICAvLyBvbmx5IGRpbWVuc2lvbnMgYXZhaWxhYmxlIHRvIEpTIHRoYXQgY29udGFpbiBub24tcm91bmRlZCB2YWx1ZXMuIEl0IGNvdWxkXG4gIC8vIGJlIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpZiBvbmx5IGl0J3MgZGF0YSB3YXNuJ3RcbiAgLy8gYWZmZWN0ZWQgYnkgQ1NTIHRyYW5zZm9ybWF0aW9ucyBsZXQgYWxvbmUgcGFkZGluZ3MsIGJvcmRlcnMgYW5kIHNjcm9sbCBiYXJzLlxuXG4gIHZhciB3aWR0aCA9IHRvRmxvYXQoc3R5bGVzLndpZHRoKSxcbiAgICAgIGhlaWdodCA9IHRvRmxvYXQoc3R5bGVzLmhlaWdodCk7IC8vIFdpZHRoICYgaGVpZ2h0IGluY2x1ZGUgcGFkZGluZ3MgYW5kIGJvcmRlcnMgd2hlbiB0aGUgJ2JvcmRlci1ib3gnIGJveFxuICAvLyBtb2RlbCBpcyBhcHBsaWVkIChleGNlcHQgZm9yIElFKS5cblxuICBpZiAoc3R5bGVzLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgLy8gRm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGhhbmRsZSBJbnRlcm5ldCBFeHBsb3JlciB3aGljaFxuICAgIC8vIGRvZXNuJ3QgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB0byBjb21wdXRlZCBDU1MgZGltZW5zaW9ucy5cbiAgICAvL1xuICAgIC8vIFdlIGNhbiBzYXkgdGhhdCBpZiBDU1MgZGltZW5zaW9ucyArIHBhZGRpbmdzIGFyZSBlcXVhbCB0byB0aGUgXCJjbGllbnRcIlxuICAgIC8vIHByb3BlcnRpZXMgdGhlbiBpdCdzIGVpdGhlciBJRSwgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBzdWJ0cmFjdFxuICAgIC8vIGFueXRoaW5nLCBvciBhbiBlbGVtZW50IG1lcmVseSBkb2Vzbid0IGhhdmUgcGFkZGluZ3MvYm9yZGVycyBzdHlsZXMuXG4gICAgaWYgKE1hdGgucm91bmQod2lkdGggKyBob3JpelBhZCkgIT09IGNsaWVudFdpZHRoKSB7XG4gICAgICB3aWR0aCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICdsZWZ0JywgJ3JpZ2h0JykgKyBob3JpelBhZDtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5yb3VuZChoZWlnaHQgKyB2ZXJ0UGFkKSAhPT0gY2xpZW50SGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAndG9wJywgJ2JvdHRvbScpICsgdmVydFBhZDtcbiAgICB9XG4gIH0gLy8gRm9sbG93aW5nIHN0ZXBzIGNhbid0IGJlIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50J3Mgcm9vdCBlbGVtZW50IGFzIGl0c1xuICAvLyBjbGllbnRbV2lkdGgvSGVpZ2h0XSBwcm9wZXJ0aWVzIHJlcHJlc2VudCB2aWV3cG9ydCBhcmVhIG9mIHRoZSB3aW5kb3cuXG4gIC8vIEJlc2lkZXMsIGl0J3MgYXMgd2VsbCBub3QgbmVjZXNzYXJ5IGFzIHRoZSA8aHRtbD4gaXRzZWxmIG5laXRoZXIgaGFzXG4gIC8vIHJlbmRlcmVkIHNjcm9sbCBiYXJzIG5vciBpdCBjYW4gYmUgY2xpcHBlZC5cblxuXG4gIGlmICghaXNEb2N1bWVudEVsZW1lbnQodGFyZ2V0KSkge1xuICAgIC8vIEluIHNvbWUgYnJvd3NlcnMgKG9ubHkgaW4gRmlyZWZveCwgYWN0dWFsbHkpIENTUyB3aWR0aCAmIGhlaWdodFxuICAgIC8vIGluY2x1ZGUgc2Nyb2xsIGJhcnMgc2l6ZSB3aGljaCBjYW4gYmUgcmVtb3ZlZCBhdCB0aGlzIHN0ZXAgYXMgc2Nyb2xsXG4gICAgLy8gYmFycyBhcmUgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHJvdW5kZWQgZGltZW5zaW9ucyArIHBhZGRpbmdzXG4gICAgLy8gYW5kIFwiY2xpZW50XCIgcHJvcGVydGllcywgdGhvdWdoIHRoYXQgaXMgbm90IGFsd2F5cyB0cnVlIGluIENocm9tZS5cbiAgICB2YXIgdmVydFNjcm9sbGJhciA9IE1hdGgucm91bmQod2lkdGggKyBob3JpelBhZCkgLSBjbGllbnRXaWR0aDtcbiAgICB2YXIgaG9yaXpTY3JvbGxiYXIgPSBNYXRoLnJvdW5kKGhlaWdodCArIHZlcnRQYWQpIC0gY2xpZW50SGVpZ2h0OyAvLyBDaHJvbWUgaGFzIGEgcmF0aGVyIHdlaXJkIHJvdW5kaW5nIG9mIFwiY2xpZW50XCIgcHJvcGVydGllcy5cbiAgICAvLyBFLmcuIGZvciBhbiBlbGVtZW50IHdpdGggY29udGVudCB3aWR0aCBvZiAzMTQuMnB4IGl0IHNvbWV0aW1lcyBnaXZlc1xuICAgIC8vIHRoZSBjbGllbnQgd2lkdGggb2YgMzE1cHggYW5kIGZvciB0aGUgd2lkdGggb2YgMzE0LjdweCBpdCBtYXkgZ2l2ZVxuICAgIC8vIDMxNHB4LiBBbmQgaXQgZG9lc24ndCBoYXBwZW4gYWxsIHRoZSB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGlzIGRlbHRhXG4gICAgLy8gYXMgYSBub24tcmVsZXZhbnQuXG5cbiAgICBpZiAoTWF0aC5hYnModmVydFNjcm9sbGJhcikgIT09IDEpIHtcbiAgICAgIHdpZHRoIC09IHZlcnRTY3JvbGxiYXI7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGhvcml6U2Nyb2xsYmFyKSAhPT0gMSkge1xuICAgICAgaGVpZ2h0IC09IGhvcml6U2Nyb2xsYmFyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSZWN0SW5pdChwYWRkaW5ncy5sZWZ0LCBwYWRkaW5ncy50b3AsIHdpZHRoLCBoZWlnaHQpO1xufVxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNWR0dyYXBoaWNzRWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIGNoZWNrZWQuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cblxuXG52YXIgaXNTVkdHcmFwaGljc0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFNvbWUgYnJvd3NlcnMsIG5hbWVseSBJRSBhbmQgRWRnZSwgZG9uJ3QgaGF2ZSB0aGUgU1ZHR3JhcGhpY3NFbGVtZW50XG4gIC8vIGludGVyZmFjZS5cbiAgaWYgKHR5cGVvZiBTVkdHcmFwaGljc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICB9O1xuICB9IC8vIElmIGl0J3Mgc28sIHRoZW4gY2hlY2sgdGhhdCBlbGVtZW50IGlzIGF0IGxlYXN0IGFuIGluc3RhbmNlIG9mIHRoZVxuICAvLyBTVkdFbGVtZW50IGFuZCB0aGF0IGl0IGhhcyB0aGUgXCJnZXRCQm94XCIgbWV0aG9kLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0VsZW1lbnQgJiYgdHlwZW9mIHRhcmdldC5nZXRCQm94ID09PSAnZnVuY3Rpb24nO1xuICB9O1xufSgpO1xuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYSBkb2N1bWVudCBlbGVtZW50ICg8aHRtbD4pLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRG9jdW1lbnRFbGVtZW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0ID09PSBnZXRXaW5kb3dPZih0YXJnZXQpLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFuIGFwcHJvcHJpYXRlIGNvbnRlbnQgcmVjdGFuZ2xlIGZvciBwcm92aWRlZCBodG1sIG9yIHN2ZyBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHMgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb250ZW50UmVjdCh0YXJnZXQpIHtcbiAgaWYgKCFpc0Jyb3dzZXIpIHtcbiAgICByZXR1cm4gZW1wdHlSZWN0O1xuICB9XG5cbiAgaWYgKGlzU1ZHR3JhcGhpY3NFbGVtZW50KHRhcmdldCkpIHtcbiAgICByZXR1cm4gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KTtcbiAgfVxuXG4gIHJldHVybiBnZXRIVE1MRWxlbWVudENvbnRlbnRSZWN0KHRhcmdldCk7XG59XG4vKipcclxuICogQ3JlYXRlcyByZWN0YW5nbGUgd2l0aCBhbiBpbnRlcmZhY2Ugb2YgdGhlIERPTVJlY3RSZWFkT25seS5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RvbXJlY3RyZWFkb25seVxyXG4gKlxyXG4gKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIE9iamVjdCB3aXRoIHJlY3RhbmdsZSdzIHgveSBjb29yZGluYXRlcyBhbmQgZGltZW5zaW9ucy5cclxuICogQHJldHVybnMge0RPTVJlY3RSZWFkT25seX1cclxuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlUmVhZE9ubHlSZWN0KF9hKSB7XG4gIHZhciB4ID0gX2EueCxcbiAgICAgIHkgPSBfYS55LFxuICAgICAgd2lkdGggPSBfYS53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9hLmhlaWdodDsgLy8gSWYgRE9NUmVjdFJlYWRPbmx5IGlzIGF2YWlsYWJsZSB1c2UgaXQgYXMgYSBwcm90b3R5cGUgZm9yIHRoZSByZWN0YW5nbGUuXG5cbiAgdmFyIENvbnN0ciA9IHR5cGVvZiBET01SZWN0UmVhZE9ubHkgIT09ICd1bmRlZmluZWQnID8gRE9NUmVjdFJlYWRPbmx5IDogT2JqZWN0O1xuICB2YXIgcmVjdCA9IE9iamVjdC5jcmVhdGUoQ29uc3RyLnByb3RvdHlwZSk7IC8vIFJlY3RhbmdsZSdzIHByb3BlcnRpZXMgYXJlIG5vdCB3cml0YWJsZSBhbmQgbm9uLWVudW1lcmFibGUuXG5cbiAgZGVmaW5lQ29uZmlndXJhYmxlKHJlY3QsIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogaGVpZ2h0ICsgeSxcbiAgICBsZWZ0OiB4XG4gIH0pO1xuICByZXR1cm4gcmVjdDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIERPTVJlY3RJbml0IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGltZW5zaW9ucyBhbmQgdGhlIHgveSBjb29yZGluYXRlcy5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RpY3RkZWYtZG9tcmVjdGluaXRcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBYIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gWSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBSZWN0YW5nbGUncyB3aWR0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFJlY3RhbmdsZSdzIGhlaWdodC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cblxuXG5mdW5jdGlvbiBjcmVhdGVSZWN0SW5pdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuLyoqXHJcbiAqIENsYXNzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGF0aW9ucyBvZiB0aGUgY29udGVudCByZWN0YW5nbGUgb2ZcclxuICogcHJvdmlkZWQgRE9NIGVsZW1lbnQgYW5kIGZvciBrZWVwaW5nIHRyYWNrIG9mIGl0J3MgY2hhbmdlcy5cclxuICovXG5cblxudmFyIFJlc2l6ZU9ic2VydmF0aW9uID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBvYnNlcnZlZC5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2YXRpb24odGFyZ2V0KSB7XG4gICAgLyoqXHJcbiAgICAgKiBCcm9hZGNhc3RlZCB3aWR0aCBvZiBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG4gICAgdGhpcy5icm9hZGNhc3RXaWR0aCA9IDA7XG4gICAgLyoqXHJcbiAgICAgKiBCcm9hZGNhc3RlZCBoZWlnaHQgb2YgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5icm9hZGNhc3RIZWlnaHQgPSAwO1xuICAgIC8qKlxyXG4gICAgICogUmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtET01SZWN0SW5pdH1cclxuICAgICAqL1xuXG4gICAgdGhpcy5jb250ZW50UmVjdF8gPSBjcmVhdGVSZWN0SW5pdCgwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgfVxuICAvKipcclxuICAgKiBVcGRhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIGFuZCB0ZWxscyB3aGV0aGVyIGl0J3Mgd2lkdGggb3IgaGVpZ2h0IHByb3BlcnRpZXNcclxuICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYnJvYWRjYXN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDb250ZW50UmVjdCh0aGlzLnRhcmdldCk7XG4gICAgdGhpcy5jb250ZW50UmVjdF8gPSByZWN0O1xuICAgIHJldHVybiByZWN0LndpZHRoICE9PSB0aGlzLmJyb2FkY2FzdFdpZHRoIHx8IHJlY3QuaGVpZ2h0ICE9PSB0aGlzLmJyb2FkY2FzdEhlaWdodDtcbiAgfTtcbiAgLyoqXHJcbiAgICogVXBkYXRlcyAnYnJvYWRjYXN0V2lkdGgnIGFuZCAnYnJvYWRjYXN0SGVpZ2h0JyBwcm9wZXJ0aWVzIHdpdGggYSBkYXRhXHJcbiAgICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9mIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge0RPTVJlY3RJbml0fSBMYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmJyb2FkY2FzdFJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlY3QgPSB0aGlzLmNvbnRlbnRSZWN0XztcbiAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gcmVjdC53aWR0aDtcbiAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIHJldHVybiByZWN0O1xuICB9O1xuXG4gIHJldHVybiBSZXNpemVPYnNlcnZhdGlvbjtcbn0oKTtcblxudmFyIFJlc2l6ZU9ic2VydmVyRW50cnkgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlc2l6ZU9ic2VydmVyRW50cnkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdGhhdCBpcyBiZWluZyBvYnNlcnZlZC5cclxuICAgKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIERhdGEgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJFbnRyeSh0YXJnZXQsIHJlY3RJbml0KSB7XG4gICAgdmFyIGNvbnRlbnRSZWN0ID0gY3JlYXRlUmVhZE9ubHlSZWN0KHJlY3RJbml0KTsgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGVcbiAgICAvLyBhbmQgYXJlIGFsc28gbm90IGVudW1lcmFibGUgaW4gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAvL1xuICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycyBhcmUgbm90IGJlaW5nIHVzZWQgYXMgdGhleSdkIHJlcXVpcmUgdG8gZGVmaW5lIGFcbiAgICAvLyBwcml2YXRlIFdlYWtNYXAgc3RvcmFnZSB3aGljaCBtYXkgY2F1c2UgbWVtb3J5IGxlYWtzIGluIGJyb3dzZXJzIHRoYXRcbiAgICAvLyBkb24ndCBzdXBwb3J0IHRoaXMgdHlwZSBvZiBjb2xsZWN0aW9ucy5cblxuICAgIGRlZmluZUNvbmZpZ3VyYWJsZSh0aGlzLCB7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIGNvbnRlbnRSZWN0OiBjb250ZW50UmVjdFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyRW50cnk7XG59KCk7XG5cbnZhciBSZXNpemVPYnNlcnZlclNQSSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkXHJcbiAgICogICAgICB3aGVuIG9uZSBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlcyBpdCdzIGNvbnRlbnQgZGltZW5zaW9ucy5cclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcn0gY29udHJvbGxlciAtIENvbnRyb2xsZXIgaW5zdGFuY2Ugd2hpY2hcclxuICAgKiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgdXBkYXRlcyBvZiBvYnNlcnZlci5cclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyfSBjYWxsYmFja0N0eCAtIFJlZmVyZW5jZSB0byB0aGUgcHVibGljXHJcbiAgICogICAgICBSZXNpemVPYnNlcnZlciBpbnN0YW5jZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBjYWxsYmFjayBmdW5jdGlvbi5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIGNhbGxiYWNrQ3R4KSB7XG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0aW9uIG9mIHJlc2l6ZSBvYnNlcnZhdGlvbnMgdGhhdCBoYXZlIGRldGVjdGVkIGNoYW5nZXMgaW4gZGltZW5zaW9uc1xyXG4gICAgICogb2YgZWxlbWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAqL1xuICAgIHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXyA9IFtdO1xuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cnkgb2YgdGhlIFJlc2l6ZU9ic2VydmF0aW9uIGluc3RhbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7TWFwPEVsZW1lbnQsIFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5vYnNlcnZhdGlvbnNfID0gbmV3IE1hcFNoaW0oKTtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjYWxsYmFjayBwcm92aWRlZCBhcyBwYXJhbWV0ZXIgMSBpcyBub3QgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxiYWNrXyA9IGNhbGxiYWNrO1xuICAgIHRoaXMuY29udHJvbGxlcl8gPSBjb250cm9sbGVyO1xuICAgIHRoaXMuY2FsbGJhY2tDdHhfID0gY2FsbGJhY2tDdHg7XG4gIH1cbiAgLyoqXHJcbiAgICogU3RhcnRzIG9ic2VydmluZyBwcm92aWRlZCBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XG4gICAgfSAvLyBEbyBub3RoaW5nIGlmIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndCBoYXZlIHRoZSBFbGVtZW50IGludGVyZmFjZS5cblxuXG4gICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XG4gICAgfVxuXG4gICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXzsgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQuXG5cbiAgICBpZiAob2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2JzZXJ2YXRpb25zLnNldCh0YXJnZXQsIG5ldyBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpKTtcbiAgICB0aGlzLmNvbnRyb2xsZXJfLmFkZE9ic2VydmVyKHRoaXMpOyAvLyBGb3JjZSB0aGUgdXBkYXRlIG9mIG9ic2VydmF0aW9ucy5cblxuICAgIHRoaXMuY29udHJvbGxlcl8ucmVmcmVzaCgpO1xuICB9O1xuICAvKipcclxuICAgKiBTdG9wcyBvYnNlcnZpbmcgcHJvdmlkZWQgZWxlbWVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBzdG9wIG9ic2VydmluZy5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XG4gICAgfSAvLyBEbyBub3RoaW5nIGlmIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndCBoYXZlIHRoZSBFbGVtZW50IGludGVyZmFjZS5cblxuXG4gICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XG4gICAgfVxuXG4gICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXzsgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIG5vdCBiZWluZyBvYnNlcnZlZC5cblxuICAgIGlmICghb2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2JzZXJ2YXRpb25zLmRlbGV0ZSh0YXJnZXQpO1xuXG4gICAgaWYgKCFvYnNlcnZhdGlvbnMuc2l6ZSkge1xuICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFN0b3BzIG9ic2VydmluZyBhbGwgZWxlbWVudHMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICB0aGlzLm9ic2VydmF0aW9uc18uY2xlYXIoKTtcbiAgICB0aGlzLmNvbnRyb2xsZXJfLnJlbW92ZU9ic2VydmVyKHRoaXMpO1xuICB9O1xuICAvKipcclxuICAgKiBDb2xsZWN0cyBvYnNlcnZhdGlvbiBpbnN0YW5jZXMgdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBvZiB3aGljaCBoYXMgY2hhbmdlZFxyXG4gICAqIGl0J3MgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5nYXRoZXJBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICB0aGlzLm9ic2VydmF0aW9uc18uZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcbiAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIF90aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ucHVzaChvYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIEludm9rZXMgaW5pdGlhbCBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGEgbGlzdCBvZiBSZXNpemVPYnNlcnZlckVudHJ5XHJcbiAgICogaW5zdGFuY2VzIGNvbGxlY3RlZCBmcm9tIGFjdGl2ZSByZXNpemUgb2JzZXJ2YXRpb25zLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuYnJvYWRjYXN0QWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIERvIG5vdGhpbmcgaWYgb2JzZXJ2ZXIgZG9lc24ndCBoYXZlIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXG4gICAgaWYgKCF0aGlzLmhhc0FjdGl2ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGN0eCA9IHRoaXMuY2FsbGJhY2tDdHhfOyAvLyBDcmVhdGUgUmVzaXplT2JzZXJ2ZXJFbnRyeSBpbnN0YW5jZSBmb3IgZXZlcnkgYWN0aXZlIG9ic2VydmF0aW9uLlxuXG4gICAgdmFyIGVudHJpZXMgPSB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubWFwKGZ1bmN0aW9uIChvYnNlcnZhdGlvbikge1xuICAgICAgcmV0dXJuIG5ldyBSZXNpemVPYnNlcnZlckVudHJ5KG9ic2VydmF0aW9uLnRhcmdldCwgb2JzZXJ2YXRpb24uYnJvYWRjYXN0UmVjdCgpKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhbGxiYWNrXy5jYWxsKGN0eCwgZW50cmllcywgY3R4KTtcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENsZWFycyB0aGUgY29sbGVjdGlvbiBvZiBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuY2xlYXJBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLnNwbGljZSgwKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogVGVsbHMgd2hldGhlciBvYnNlcnZlciBoYXMgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmhhc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLmxlbmd0aCA+IDA7XG4gIH07XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyU1BJO1xufSgpOyAvLyBSZWdpc3RyeSBvZiBpbnRlcm5hbCBvYnNlcnZlcnMuIElmIFdlYWtNYXAgaXMgbm90IGF2YWlsYWJsZSB1c2UgY3VycmVudCBzaGltXG4vLyBmb3IgdGhlIE1hcCBjb2xsZWN0aW9uIGFzIGl0IGhhcyBhbGwgcmVxdWlyZWQgbWV0aG9kcyBhbmQgYmVjYXVzZSBXZWFrTWFwXG4vLyBjYW4ndCBiZSBmdWxseSBwb2x5ZmlsbGVkIGFueXdheS5cblxuXG52YXIgb2JzZXJ2ZXJzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnID8gbmV3IFdlYWtNYXAoKSA6IG5ldyBNYXBTaGltKCk7XG4vKipcclxuICogUmVzaXplT2JzZXJ2ZXIgQVBJLiBFbmNhcHN1bGF0ZXMgdGhlIFJlc2l6ZU9ic2VydmVyIFNQSSBpbXBsZW1lbnRhdGlvblxyXG4gKiBleHBvc2luZyBvbmx5IHRob3NlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc3BlYy5cclxuICovXG5cbnZhciBSZXNpemVPYnNlcnZlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW5cclxuICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIGVsZW1lbnRzIGNoYW5nZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRyb2xsZXIgPSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIG9ic2VydmVycy5zZXQodGhpcywgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xufSgpOyAvLyBFeHBvc2UgcHVibGljIG1ldGhvZHMgb2YgUmVzaXplT2JzZXJ2ZXIuXG5cblxuWydvYnNlcnZlJywgJ3Vub2JzZXJ2ZScsICdkaXNjb25uZWN0J10uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIFJlc2l6ZU9ic2VydmVyLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHJldHVybiAoX2EgPSBvYnNlcnZlcnMuZ2V0KHRoaXMpKVttZXRob2RdLmFwcGx5KF9hLCBhcmd1bWVudHMpO1xuICB9O1xufSk7XG5cbnZhciBpbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRXhwb3J0IGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZS5cbiAgaWYgKHR5cGVvZiBnbG9iYWwkMS5SZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsJDEuUmVzaXplT2JzZXJ2ZXI7XG4gIH1cblxuICByZXR1cm4gUmVzaXplT2JzZXJ2ZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGluZGV4OyIsInZhciB3aW5kb3dfID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWw7XG52YXIgZ2xvYmFsXyA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93O1xudmFyIGRvY3VtZW50XyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHt9O1xuZXhwb3J0IHsgd2luZG93XyBhcyB3aW5kb3csIGdsb2JhbF8gYXMgZ2xvYmFsLCBkb2N1bWVudF8gYXMgZG9jdW1lbnQgfTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChpdCkgbyA9IGl0O1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBvW2krK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiBlKF9lKSB7XG4gICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgICAgZGlkRXJyID0gZmFsc2UsXG4gICAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gcygpIHtcbiAgICAgIGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiBlKF9lMikge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IF9lMjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uIGYoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG52YXIgcmVmUHJvcHMgPSBbJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsICdtaW56b29tJywgJ21heHpvb20nLCAnZmlsdGVyJywgJ2xheW91dCddO1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlKHN0eWxlKSB7XG4gIGlmICghc3R5bGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG5cbiAgaWYgKHN0eWxlLnRvSlMpIHtcbiAgICBzdHlsZSA9IHN0eWxlLnRvSlMoKTtcbiAgfVxuXG4gIHZhciBsYXllckluZGV4ID0ge307XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN0eWxlLmxheWVycyksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgbGF5ZXIgPSBfc3RlcC52YWx1ZTtcbiAgICAgIGxheWVySW5kZXhbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICB2YXIgbGF5ZXJzID0gc3R5bGUubGF5ZXJzLm1hcChmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICB2YXIgbGF5ZXJSZWYgPSBsYXllckluZGV4W2xheWVyLnJlZl07XG4gICAgdmFyIG5vcm1hbGl6ZWRMYXllciA9IG51bGw7XG5cbiAgICBpZiAoJ2ludGVyYWN0aXZlJyBpbiBsYXllcikge1xuICAgICAgbm9ybWFsaXplZExheWVyID0gX29iamVjdFNwcmVhZCh7fSwgbGF5ZXIpO1xuICAgICAgZGVsZXRlIG5vcm1hbGl6ZWRMYXllci5pbnRlcmFjdGl2ZTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJSZWYpIHtcbiAgICAgIG5vcm1hbGl6ZWRMYXllciA9IG5vcm1hbGl6ZWRMYXllciB8fCBfb2JqZWN0U3ByZWFkKHt9LCBsYXllcik7XG4gICAgICBkZWxldGUgbm9ybWFsaXplZExheWVyLnJlZjtcblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyZWZQcm9wcyksXG4gICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBwcm9wTmFtZSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgIGlmIChwcm9wTmFtZSBpbiBsYXllclJlZikge1xuICAgICAgICAgICAgbm9ybWFsaXplZExheWVyW3Byb3BOYW1lXSA9IGxheWVyUmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkTGF5ZXIgfHwgbGF5ZXI7XG4gIH0pO1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgbGF5ZXJzOiBsYXllcnNcbiAgfSk7XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVN0eWxlIH0gZnJvbSAnLi4vdXRpbHMvc3R5bGUtdXRpbHMnO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IoZXZlbnQpIHtcbiAgaWYgKGV2ZW50KSB7XG4gICAgY29uc29sZS5lcnJvcihldmVudC5lcnJvcik7XG4gIH1cbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29udGFpbmVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICBnbDogUHJvcFR5cGVzLm9iamVjdCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IFByb3BUeXBlcy5zdHJpbmcsXG4gIG1hcGJveEFwaVVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgYXR0cmlidXRpb25Db250cm9sOiBQcm9wVHlwZXMuYm9vbCxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgcmV1c2VNYXBzOiBQcm9wVHlwZXMuYm9vbCxcbiAgdHJhbnNmb3JtUmVxdWVzdDogUHJvcFR5cGVzLmZ1bmMsXG4gIG1hcE9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG1hcFN0eWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIHByZXZlbnRTdHlsZURpZmZpbmc6IFByb3BUeXBlcy5ib29sLFxuICB2aXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgYXN5bmNSZW5kZXI6IFByb3BUeXBlcy5ib29sLFxuICBvbkxvYWQ6IFByb3BUeXBlcy5mdW5jLFxuICBvbkVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlcixcbiAgdmlld1N0YXRlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIsXG4gIGxhdGl0dWRlOiBQcm9wVHlwZXMubnVtYmVyLFxuICB6b29tOiBQcm9wVHlwZXMubnVtYmVyLFxuICBiZWFyaW5nOiBQcm9wVHlwZXMubnVtYmVyLFxuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcbiAgYWx0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXJcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb250YWluZXI6IGRvY3VtZW50LmJvZHksXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBnZXRBY2Nlc3NUb2tlbigpLFxuICBtYXBib3hBcGlVcmw6ICdodHRwczovL2FwaS5tYXBib3guY29tJyxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuICByZXVzZU1hcHM6IGZhbHNlLFxuICBtYXBPcHRpb25zOiB7fSxcbiAgbWFwU3R5bGU6ICdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY4JyxcbiAgcHJldmVudFN0eWxlRGlmZmluZzogZmFsc2UsXG4gIHZpc2libGU6IHRydWUsXG4gIGFzeW5jUmVuZGVyOiBmYWxzZSxcbiAgb25Mb2FkOiBub29wLFxuICBvbkVycm9yOiBkZWZhdWx0T25FcnJvcixcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgbG9uZ2l0dWRlOiAwLFxuICBsYXRpdHVkZTogMCxcbiAgem9vbTogMCxcbiAgYmVhcmluZzogMCxcbiAgcGl0Y2g6IDAsXG4gIGFsdGl0dWRlOiAxLjVcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oKSB7XG4gIHZhciBhY2Nlc3NUb2tlbiA9IG51bGw7XG5cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhdGlvbikge1xuICAgIHZhciBtYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXFwvXSopLyk7XG4gICAgYWNjZXNzVG9rZW4gPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgfVxuXG4gIGlmICghYWNjZXNzVG9rZW4gJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbiB8fCBwcm9jZXNzLmVudi5NYXBib3hBY2Nlc3NUb2tlbiB8fCBwcm9jZXNzLmVudi5SRUFDVF9BUFBfTUFQQk9YX0FDQ0VTU19UT0tFTjtcbiAgfVxuXG4gIHJldHVybiBhY2Nlc3NUb2tlbiB8fCAnbm8tdG9rZW4nO1xufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyhwcm9wcykge1xuICB2YXIgY29tcG9uZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnY29tcG9uZW50JztcblxuICBpZiAocHJvcHMuZGVidWcpIHtcbiAgICBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBwcm9wcywgJ3Byb3AnLCBjb21wb25lbnQpO1xuICB9XG59XG5cbnZhciBNYXBib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcGJveChwcm9wcykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFwYm94KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInByb3BzXCIsIGRlZmF1bHRQcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ3aWR0aFwiLCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhlaWdodFwiLCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9maXJlTG9hZEV2ZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnByb3BzLm9uTG9hZCh7XG4gICAgICAgIHR5cGU6ICdsb2FkJyxcbiAgICAgICAgdGFyZ2V0OiBfdGhpcy5fbWFwXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICghcHJvcHMubWFwYm94Z2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWFwYm94IG5vdCBhdmFpbGFibGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcGJveGdsID0gcHJvcHMubWFwYm94Z2w7XG5cbiAgICBpZiAoIU1hcGJveC5pbml0aWFsaXplZCkge1xuICAgICAgTWFwYm94LmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fY2hlY2tTdHlsZVNoZWV0KHRoaXMubWFwYm94Z2wudmVyc2lvbik7XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZShwcm9wcyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWFwYm94LCBbe1xuICAgIGtleTogXCJmaW5hbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5hbGl6ZSgpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3koKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFByb3BzKHByb3BzKSB7XG4gICAgICB0aGlzLl91cGRhdGUodGhpcy5wcm9wcywgcHJvcHMpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVkcmF3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgIGlmIChtYXAuc3R5bGUpIHtcbiAgICAgICAgaWYgKG1hcC5fZnJhbWUpIHtcbiAgICAgICAgICBtYXAuX2ZyYW1lLmNhbmNlbCgpO1xuXG4gICAgICAgICAgbWFwLl9mcmFtZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuX3JlbmRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWFwKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3JldXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXVzZShwcm9wcykge1xuICAgICAgdGhpcy5fbWFwID0gTWFwYm94LnNhdmVkTWFwO1xuXG4gICAgICB2YXIgb2xkQ29udGFpbmVyID0gdGhpcy5fbWFwLmdldENvbnRhaW5lcigpO1xuXG4gICAgICB2YXIgbmV3Q29udGFpbmVyID0gcHJvcHMuY29udGFpbmVyO1xuICAgICAgbmV3Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLW1hcCcpO1xuXG4gICAgICB3aGlsZSAob2xkQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdDb250YWluZXIuYXBwZW5kQ2hpbGQob2xkQ29udGFpbmVyLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tYXAuX2NvbnRhaW5lciA9IG5ld0NvbnRhaW5lcjtcbiAgICAgIE1hcGJveC5zYXZlZE1hcCA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wcy5tYXBTdHlsZSkge1xuICAgICAgICB0aGlzLl9tYXAuc2V0U3R5bGUobm9ybWFsaXplU3R5bGUocHJvcHMubWFwU3R5bGUpLCB7XG4gICAgICAgICAgZGlmZjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9tYXAuaXNTdHlsZUxvYWRlZCgpKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVMb2FkRXZlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX21hcC5vbmNlKCdzdHlsZWRhdGEnLCB0aGlzLl9maXJlTG9hZEV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY3JlYXRlKHByb3BzKSB7XG4gICAgICBpZiAocHJvcHMucmV1c2VNYXBzICYmIE1hcGJveC5zYXZlZE1hcCkge1xuICAgICAgICB0aGlzLl9yZXVzZShwcm9wcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvcHMuZ2wpIHtcbiAgICAgICAgICB2YXIgZ2V0Q29udGV4dCA9IEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS5nZXRDb250ZXh0O1xuXG4gICAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBIVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29udGV4dCA9IGdldENvbnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZ2w7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXBPcHRpb25zID0ge1xuICAgICAgICAgIGNvbnRhaW5lcjogcHJvcHMuY29udGFpbmVyLFxuICAgICAgICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAgICAgIHpvb206IDgsXG4gICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgYmVhcmluZzogMCxcbiAgICAgICAgICBtYXhab29tOiAyNCxcbiAgICAgICAgICBzdHlsZTogbm9ybWFsaXplU3R5bGUocHJvcHMubWFwU3R5bGUpLFxuICAgICAgICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICB0cmFja1Jlc2l6ZTogZmFsc2UsXG4gICAgICAgICAgYXR0cmlidXRpb25Db250cm9sOiBwcm9wcy5hdHRyaWJ1dGlvbkNvbnRyb2wsXG4gICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBwcm9wcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocHJvcHMudHJhbnNmb3JtUmVxdWVzdCkge1xuICAgICAgICAgIG1hcE9wdGlvbnMudHJhbnNmb3JtUmVxdWVzdCA9IHByb3BzLnRyYW5zZm9ybVJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgdGhpcy5tYXBib3hnbC5NYXAoT2JqZWN0LmFzc2lnbih7fSwgbWFwT3B0aW9ucywgcHJvcHMubWFwT3B0aW9ucykpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbmNlKCdsb2FkJywgcHJvcHMub25Mb2FkKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ2Vycm9yJywgcHJvcHMub25FcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVzdHJveSgpIHtcbiAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFNYXBib3guc2F2ZWRNYXApIHtcbiAgICAgICAgTWFwYm94LnNhdmVkTWFwID0gdGhpcy5fbWFwO1xuXG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ2xvYWQnLCB0aGlzLnByb3BzLm9uTG9hZCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignZXJyb3InLCB0aGlzLnByb3BzLm9uRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3N0eWxlZGF0YScsIHRoaXMuX2ZpcmVMb2FkRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdGlhbGl6ZShwcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFByb3BzLCBwcm9wcyk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wcywgJ01hcGJveCcpO1xuICAgICAgdGhpcy5tYXBib3hnbC5hY2Nlc3NUb2tlbiA9IHByb3BzLm1hcGJveEFwaUFjY2Vzc1Rva2VuIHx8IGRlZmF1bHRQcm9wcy5tYXBib3hBcGlBY2Nlc3NUb2tlbjtcbiAgICAgIHRoaXMubWFwYm94Z2wuYmFzZUFwaVVybCA9IHByb3BzLm1hcGJveEFwaVVybDtcblxuICAgICAgdGhpcy5fY3JlYXRlKHByb3BzKTtcblxuICAgICAgdmFyIF9wcm9wcyA9IHByb3BzLFxuICAgICAgICAgIGNvbnRhaW5lciA9IF9wcm9wcy5jb250YWluZXI7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAnb2Zmc2V0V2lkdGgnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIud2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgJ2NsaWVudFdpZHRoJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLndpZHRoO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICdvZmZzZXRIZWlnaHQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICdjbGllbnRIZWlnaHQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX21hcC5nZXRDYW52YXMoKTtcblxuICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICBjYW52YXMuc3R5bGUub3V0bGluZSA9ICdub25lJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlTWFwVmlld3BvcnQoe30sIHByb3BzKTtcblxuICAgICAgdGhpcy5fdXBkYXRlTWFwU2l6ZSh7fSwgcHJvcHMpO1xuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV3UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCBuZXdQcm9wcyk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhuZXdQcm9wcywgJ01hcGJveCcpO1xuXG4gICAgICB2YXIgdmlld3BvcnRDaGFuZ2VkID0gdGhpcy5fdXBkYXRlTWFwVmlld3BvcnQob2xkUHJvcHMsIG5ld1Byb3BzKTtcblxuICAgICAgdmFyIHNpemVDaGFuZ2VkID0gdGhpcy5fdXBkYXRlTWFwU2l6ZShvbGRQcm9wcywgbmV3UHJvcHMpO1xuXG4gICAgICB0aGlzLl91cGRhdGVNYXBTdHlsZShvbGRQcm9wcywgbmV3UHJvcHMpO1xuXG4gICAgICBpZiAoIW5ld1Byb3BzLmFzeW5jUmVuZGVyICYmICh2aWV3cG9ydENoYW5nZWQgfHwgc2l6ZUNoYW5nZWQpKSB7XG4gICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvcHMgPSBuZXdQcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZU1hcFN0eWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVNYXBTdHlsZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBzdHlsZUNoYW5nZWQgPSBvbGRQcm9wcy5tYXBTdHlsZSAhPT0gbmV3UHJvcHMubWFwU3R5bGU7XG5cbiAgICAgIGlmIChzdHlsZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5fbWFwLnNldFN0eWxlKG5vcm1hbGl6ZVN0eWxlKG5ld1Byb3BzLm1hcFN0eWxlKSwge1xuICAgICAgICAgIGRpZmY6ICFuZXdQcm9wcy5wcmV2ZW50U3R5bGVEaWZmaW5nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlTWFwU2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWFwU2l6ZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBzaXplQ2hhbmdlZCA9IG9sZFByb3BzLndpZHRoICE9PSBuZXdQcm9wcy53aWR0aCB8fCBvbGRQcm9wcy5oZWlnaHQgIT09IG5ld1Byb3BzLmhlaWdodDtcblxuICAgICAgaWYgKHNpemVDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSBuZXdQcm9wcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBuZXdQcm9wcy5oZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5fbWFwLnJlc2l6ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2l6ZUNoYW5nZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVNYXBWaWV3cG9ydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWFwVmlld3BvcnQob2xkUHJvcHMsIG5ld1Byb3BzKSB7XG4gICAgICB2YXIgb2xkVmlld1N0YXRlID0gdGhpcy5fZ2V0Vmlld1N0YXRlKG9sZFByb3BzKTtcblxuICAgICAgdmFyIG5ld1ZpZXdTdGF0ZSA9IHRoaXMuX2dldFZpZXdTdGF0ZShuZXdQcm9wcyk7XG5cbiAgICAgIHZhciB2aWV3cG9ydENoYW5nZWQgPSBuZXdWaWV3U3RhdGUubGF0aXR1ZGUgIT09IG9sZFZpZXdTdGF0ZS5sYXRpdHVkZSB8fCBuZXdWaWV3U3RhdGUubG9uZ2l0dWRlICE9PSBvbGRWaWV3U3RhdGUubG9uZ2l0dWRlIHx8IG5ld1ZpZXdTdGF0ZS56b29tICE9PSBvbGRWaWV3U3RhdGUuem9vbSB8fCBuZXdWaWV3U3RhdGUucGl0Y2ggIT09IG9sZFZpZXdTdGF0ZS5waXRjaCB8fCBuZXdWaWV3U3RhdGUuYmVhcmluZyAhPT0gb2xkVmlld1N0YXRlLmJlYXJpbmcgfHwgbmV3Vmlld1N0YXRlLmFsdGl0dWRlICE9PSBvbGRWaWV3U3RhdGUuYWx0aXR1ZGU7XG5cbiAgICAgIGlmICh2aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh0aGlzLl92aWV3U3RhdGVUb01hcGJveFByb3BzKG5ld1ZpZXdTdGF0ZSkpO1xuXG4gICAgICAgIGlmIChuZXdWaWV3U3RhdGUuYWx0aXR1ZGUgIT09IG9sZFZpZXdTdGF0ZS5hbHRpdHVkZSkge1xuICAgICAgICAgIHRoaXMuX21hcC50cmFuc2Zvcm0uYWx0aXR1ZGUgPSBuZXdWaWV3U3RhdGUuYWx0aXR1ZGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0Q2hhbmdlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFZpZXdTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0Vmlld1N0YXRlKHByb3BzKSB7XG4gICAgICB2YXIgX3JlZiA9IHByb3BzLnZpZXdTdGF0ZSB8fCBwcm9wcyxcbiAgICAgICAgICBsb25naXR1ZGUgPSBfcmVmLmxvbmdpdHVkZSxcbiAgICAgICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICAgICAgem9vbSA9IF9yZWYuem9vbSxcbiAgICAgICAgICBfcmVmJHBpdGNoID0gX3JlZi5waXRjaCxcbiAgICAgICAgICBwaXRjaCA9IF9yZWYkcGl0Y2ggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHBpdGNoLFxuICAgICAgICAgIF9yZWYkYmVhcmluZyA9IF9yZWYuYmVhcmluZyxcbiAgICAgICAgICBiZWFyaW5nID0gX3JlZiRiZWFyaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRiZWFyaW5nLFxuICAgICAgICAgIF9yZWYkYWx0aXR1ZGUgPSBfcmVmLmFsdGl0dWRlLFxuICAgICAgICAgIGFsdGl0dWRlID0gX3JlZiRhbHRpdHVkZSA9PT0gdm9pZCAwID8gMS41IDogX3JlZiRhbHRpdHVkZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICBiZWFyaW5nOiBiZWFyaW5nLFxuICAgICAgICBhbHRpdHVkZTogYWx0aXR1ZGVcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jaGVja1N0eWxlU2hlZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NoZWNrU3R5bGVTaGVldCgpIHtcbiAgICAgIHZhciBtYXBib3hWZXJzaW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnMC40Ny4wJztcblxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVzdEVsZW1lbnQuY2xhc3NOYW1lID0gJ21hcGJveGdsLW1hcCc7XG4gICAgICAgIHRlc3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdEVsZW1lbnQpO1xuICAgICAgICB2YXIgaXNDc3NMb2FkZWQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZXN0RWxlbWVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnO1xuXG4gICAgICAgIGlmICghaXNDc3NMb2FkZWQpIHtcbiAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgXCJodHRwczovL2FwaS50aWxlcy5tYXBib3guY29tL21hcGJveC1nbC1qcy92XCIuY29uY2F0KG1hcGJveFZlcnNpb24sIFwiL21hcGJveC1nbC5jc3NcIikpO1xuICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdmlld1N0YXRlVG9NYXBib3hQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdmlld1N0YXRlVG9NYXBib3hQcm9wcyh2aWV3U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNlbnRlcjogW3ZpZXdTdGF0ZS5sb25naXR1ZGUsIHZpZXdTdGF0ZS5sYXRpdHVkZV0sXG4gICAgICAgIHpvb206IHZpZXdTdGF0ZS56b29tLFxuICAgICAgICBiZWFyaW5nOiB2aWV3U3RhdGUuYmVhcmluZyxcbiAgICAgICAgcGl0Y2g6IHZpZXdTdGF0ZS5waXRjaFxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFwYm94O1xufSgpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWFwYm94LCBcImluaXRpYWxpemVkXCIsIGZhbHNlKTtcblxuX2RlZmluZVByb3BlcnR5KE1hcGJveCwgXCJwcm9wVHlwZXNcIiwgcHJvcFR5cGVzKTtcblxuX2RlZmluZVByb3BlcnR5KE1hcGJveCwgXCJkZWZhdWx0UHJvcHNcIiwgZGVmYXVsdFByb3BzKTtcblxuX2RlZmluZVByb3BlcnR5KE1hcGJveCwgXCJzYXZlZE1hcFwiLCBudWxsKTtcblxuZXhwb3J0IHsgTWFwYm94IGFzIGRlZmF1bHQgfTsiLCJ2YXIgRVBTSUxPTiA9IDFlLTc7XG5cbmZ1bmN0aW9uIGlzQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICghZXF1YWxzKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gRVBTSUxPTjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAoYSwgYiwgdCkge1xuICBpZiAoaXNBcnJheShhKSkge1xuICAgIHJldHVybiBhLm1hcChmdW5jdGlvbiAoYWksIGkpIHtcbiAgICAgIHJldHVybiBsZXJwKGFpLCBiW2ldLCB0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0ICogYiArICgxIC0gdCkgKiBhO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCAncmVhY3QtbWFwLWdsOiBhc3NlcnRpb24gZmFpbGVkLicpO1xuICB9XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQsIHsgbm9ybWFsaXplVmlld3BvcnRQcm9wcyB9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuL2Fzc2VydCc7XG5leHBvcnQgdmFyIE1BUEJPWF9MSU1JVFMgPSB7XG4gIG1pblpvb206IDAsXG4gIG1heFpvb206IDI0LFxuICBtaW5QaXRjaDogMCxcbiAgbWF4UGl0Y2g6IDg1XG59O1xudmFyIERFRkFVTFRfU1RBVEUgPSB7XG4gIHBpdGNoOiAwLFxuICBiZWFyaW5nOiAwLFxuICBhbHRpdHVkZTogMS41XG59O1xudmFyIFBJVENIX01PVVNFX1RIUkVTSE9MRCA9IDU7XG52YXIgUElUQ0hfQUNDRUwgPSAxLjI7XG5cbnZhciBNYXBTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFwU3RhdGUoX3JlZikge1xuICAgIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICAgIGxvbmdpdHVkZSA9IF9yZWYubG9uZ2l0dWRlLFxuICAgICAgICB6b29tID0gX3JlZi56b29tLFxuICAgICAgICBfcmVmJGJlYXJpbmcgPSBfcmVmLmJlYXJpbmcsXG4gICAgICAgIGJlYXJpbmcgPSBfcmVmJGJlYXJpbmcgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RBVEUuYmVhcmluZyA6IF9yZWYkYmVhcmluZyxcbiAgICAgICAgX3JlZiRwaXRjaCA9IF9yZWYucGl0Y2gsXG4gICAgICAgIHBpdGNoID0gX3JlZiRwaXRjaCA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEFURS5waXRjaCA6IF9yZWYkcGl0Y2gsXG4gICAgICAgIF9yZWYkYWx0aXR1ZGUgPSBfcmVmLmFsdGl0dWRlLFxuICAgICAgICBhbHRpdHVkZSA9IF9yZWYkYWx0aXR1ZGUgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RBVEUuYWx0aXR1ZGUgOiBfcmVmJGFsdGl0dWRlLFxuICAgICAgICBfcmVmJG1heFpvb20gPSBfcmVmLm1heFpvb20sXG4gICAgICAgIG1heFpvb20gPSBfcmVmJG1heFpvb20gPT09IHZvaWQgMCA/IE1BUEJPWF9MSU1JVFMubWF4Wm9vbSA6IF9yZWYkbWF4Wm9vbSxcbiAgICAgICAgX3JlZiRtaW5ab29tID0gX3JlZi5taW5ab29tLFxuICAgICAgICBtaW5ab29tID0gX3JlZiRtaW5ab29tID09PSB2b2lkIDAgPyBNQVBCT1hfTElNSVRTLm1pblpvb20gOiBfcmVmJG1pblpvb20sXG4gICAgICAgIF9yZWYkbWF4UGl0Y2ggPSBfcmVmLm1heFBpdGNoLFxuICAgICAgICBtYXhQaXRjaCA9IF9yZWYkbWF4UGl0Y2ggPT09IHZvaWQgMCA/IE1BUEJPWF9MSU1JVFMubWF4UGl0Y2ggOiBfcmVmJG1heFBpdGNoLFxuICAgICAgICBfcmVmJG1pblBpdGNoID0gX3JlZi5taW5QaXRjaCxcbiAgICAgICAgbWluUGl0Y2ggPSBfcmVmJG1pblBpdGNoID09PSB2b2lkIDAgPyBNQVBCT1hfTElNSVRTLm1pblBpdGNoIDogX3JlZiRtaW5QaXRjaCxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gX3JlZi50cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgIHRyYW5zaXRpb25FYXNpbmcgPSBfcmVmLnRyYW5zaXRpb25FYXNpbmcsXG4gICAgICAgIHRyYW5zaXRpb25JbnRlcnBvbGF0b3IgPSBfcmVmLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IsXG4gICAgICAgIHRyYW5zaXRpb25JbnRlcnJ1cHRpb24gPSBfcmVmLnRyYW5zaXRpb25JbnRlcnJ1cHRpb24sXG4gICAgICAgIHN0YXJ0UGFuTG5nTGF0ID0gX3JlZi5zdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgc3RhcnRab29tTG5nTGF0ID0gX3JlZi5zdGFydFpvb21MbmdMYXQsXG4gICAgICAgIHN0YXJ0Um90YXRlUG9zID0gX3JlZi5zdGFydFJvdGF0ZVBvcyxcbiAgICAgICAgc3RhcnRCZWFyaW5nID0gX3JlZi5zdGFydEJlYXJpbmcsXG4gICAgICAgIHN0YXJ0UGl0Y2ggPSBfcmVmLnN0YXJ0UGl0Y2gsXG4gICAgICAgIHN0YXJ0Wm9vbSA9IF9yZWYuc3RhcnRab29tO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcFN0YXRlKTtcblxuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUod2lkdGgpLCAnYHdpZHRoYCBtdXN0IGJlIHN1cHBsaWVkJyk7XG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShoZWlnaHQpLCAnYGhlaWdodGAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUobG9uZ2l0dWRlKSwgJ2Bsb25naXR1ZGVgIG11c3QgYmUgc3VwcGxpZWQnKTtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxhdGl0dWRlKSwgJ2BsYXRpdHVkZWAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoem9vbSksICdgem9vbWAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIHRoaXMuX3ZpZXdwb3J0UHJvcHMgPSB0aGlzLl9hcHBseUNvbnN0cmFpbnRzKHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICB6b29tOiB6b29tLFxuICAgICAgYmVhcmluZzogYmVhcmluZyxcbiAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgIGFsdGl0dWRlOiBhbHRpdHVkZSxcbiAgICAgIG1heFpvb206IG1heFpvb20sXG4gICAgICBtaW5ab29tOiBtaW5ab29tLFxuICAgICAgbWF4UGl0Y2g6IG1heFBpdGNoLFxuICAgICAgbWluUGl0Y2g6IG1pblBpdGNoLFxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICB0cmFuc2l0aW9uRWFzaW5nOiB0cmFuc2l0aW9uRWFzaW5nLFxuICAgICAgdHJhbnNpdGlvbkludGVycG9sYXRvcjogdHJhbnNpdGlvbkludGVycG9sYXRvcixcbiAgICAgIHRyYW5zaXRpb25JbnRlcnJ1cHRpb246IHRyYW5zaXRpb25JbnRlcnJ1cHRpb25cbiAgICB9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHtcbiAgICAgIHN0YXJ0UGFuTG5nTGF0OiBzdGFydFBhbkxuZ0xhdCxcbiAgICAgIHN0YXJ0Wm9vbUxuZ0xhdDogc3RhcnRab29tTG5nTGF0LFxuICAgICAgc3RhcnRSb3RhdGVQb3M6IHN0YXJ0Um90YXRlUG9zLFxuICAgICAgc3RhcnRCZWFyaW5nOiBzdGFydEJlYXJpbmcsXG4gICAgICBzdGFydFBpdGNoOiBzdGFydFBpdGNoLFxuICAgICAgc3RhcnRab29tOiBzdGFydFpvb21cbiAgICB9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcFN0YXRlLCBbe1xuICAgIGtleTogXCJnZXRWaWV3cG9ydFByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZpZXdwb3J0UHJvcHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRQcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhblN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhblN0YXJ0KF9yZWYyKSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjIucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0UGFuTG5nTGF0OiB0aGlzLl91bnByb2plY3QocG9zKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYW4oX3JlZjMpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmMy5wb3MsXG4gICAgICAgICAgc3RhcnRQb3MgPSBfcmVmMy5zdGFydFBvcztcblxuICAgICAgdmFyIHN0YXJ0UGFuTG5nTGF0ID0gdGhpcy5fc3RhdGUuc3RhcnRQYW5MbmdMYXQgfHwgdGhpcy5fdW5wcm9qZWN0KHN0YXJ0UG9zKTtcblxuICAgICAgaWYgKCFzdGFydFBhbkxuZ0xhdCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJF9jYWxjdWxhdGVOZXdMbiA9IHRoaXMuX2NhbGN1bGF0ZU5ld0xuZ0xhdCh7XG4gICAgICAgIHN0YXJ0UGFuTG5nTGF0OiBzdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pLFxuICAgICAgICAgIF90aGlzJF9jYWxjdWxhdGVOZXdMbjIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRfY2FsY3VsYXRlTmV3TG4sIDIpLFxuICAgICAgICAgIGxvbmdpdHVkZSA9IF90aGlzJF9jYWxjdWxhdGVOZXdMbjJbMF0sXG4gICAgICAgICAgbGF0aXR1ZGUgPSBfdGhpcyRfY2FsY3VsYXRlTmV3TG4yWzFdO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhbkVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYW5FbmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgc3RhcnRQYW5MbmdMYXQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyb3RhdGVTdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByb3RhdGVTdGFydChfcmVmNCkge1xuICAgICAgdmFyIHBvcyA9IF9yZWY0LnBvcztcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydFJvdGF0ZVBvczogcG9zLFxuICAgICAgICBzdGFydEJlYXJpbmc6IHRoaXMuX3ZpZXdwb3J0UHJvcHMuYmVhcmluZyxcbiAgICAgICAgc3RhcnRQaXRjaDogdGhpcy5fdmlld3BvcnRQcm9wcy5waXRjaFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJvdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByb3RhdGUoX3JlZjUpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmNS5wb3MsXG4gICAgICAgICAgX3JlZjUkZGVsdGFBbmdsZVggPSBfcmVmNS5kZWx0YUFuZ2xlWCxcbiAgICAgICAgICBkZWx0YUFuZ2xlWCA9IF9yZWY1JGRlbHRhQW5nbGVYID09PSB2b2lkIDAgPyAwIDogX3JlZjUkZGVsdGFBbmdsZVgsXG4gICAgICAgICAgX3JlZjUkZGVsdGFBbmdsZVkgPSBfcmVmNS5kZWx0YUFuZ2xlWSxcbiAgICAgICAgICBkZWx0YUFuZ2xlWSA9IF9yZWY1JGRlbHRhQW5nbGVZID09PSB2b2lkIDAgPyAwIDogX3JlZjUkZGVsdGFBbmdsZVk7XG4gICAgICB2YXIgX3RoaXMkX3N0YXRlID0gdGhpcy5fc3RhdGUsXG4gICAgICAgICAgc3RhcnRSb3RhdGVQb3MgPSBfdGhpcyRfc3RhdGUuc3RhcnRSb3RhdGVQb3MsXG4gICAgICAgICAgc3RhcnRCZWFyaW5nID0gX3RoaXMkX3N0YXRlLnN0YXJ0QmVhcmluZyxcbiAgICAgICAgICBzdGFydFBpdGNoID0gX3RoaXMkX3N0YXRlLnN0YXJ0UGl0Y2g7XG5cbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHN0YXJ0QmVhcmluZykgfHwgIU51bWJlci5pc0Zpbml0ZShzdGFydFBpdGNoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld1JvdGF0aW9uO1xuXG4gICAgICBpZiAocG9zKSB7XG4gICAgICAgIG5ld1JvdGF0aW9uID0gdGhpcy5fY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5fZ2V0Um90YXRpb25QYXJhbXMocG9zLCBzdGFydFJvdGF0ZVBvcykpLCB7fSwge1xuICAgICAgICAgIHN0YXJ0QmVhcmluZzogc3RhcnRCZWFyaW5nLFxuICAgICAgICAgIHN0YXJ0UGl0Y2g6IHN0YXJ0UGl0Y2hcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Um90YXRpb24gPSB7XG4gICAgICAgICAgYmVhcmluZzogc3RhcnRCZWFyaW5nICsgZGVsdGFBbmdsZVgsXG4gICAgICAgICAgcGl0Y2g6IHN0YXJ0UGl0Y2ggKyBkZWx0YUFuZ2xlWVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKG5ld1JvdGF0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicm90YXRlRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJvdGF0ZUVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydEJlYXJpbmc6IG51bGwsXG4gICAgICAgIHN0YXJ0UGl0Y2g6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ6b29tU3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gem9vbVN0YXJ0KF9yZWY2KSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjYucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0Wm9vbUxuZ0xhdDogdGhpcy5fdW5wcm9qZWN0KHBvcyksXG4gICAgICAgIHN0YXJ0Wm9vbTogdGhpcy5fdmlld3BvcnRQcm9wcy56b29tXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiem9vbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB6b29tKF9yZWY3KSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjcucG9zLFxuICAgICAgICAgIHN0YXJ0UG9zID0gX3JlZjcuc3RhcnRQb3MsXG4gICAgICAgICAgc2NhbGUgPSBfcmVmNy5zY2FsZTtcbiAgICAgIGFzc2VydChzY2FsZSA+IDAsICdgc2NhbGVgIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgICAgIHZhciBfdGhpcyRfc3RhdGUyID0gdGhpcy5fc3RhdGUsXG4gICAgICAgICAgc3RhcnRab29tID0gX3RoaXMkX3N0YXRlMi5zdGFydFpvb20sXG4gICAgICAgICAgc3RhcnRab29tTG5nTGF0ID0gX3RoaXMkX3N0YXRlMi5zdGFydFpvb21MbmdMYXQ7XG5cbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHN0YXJ0Wm9vbSkpIHtcbiAgICAgICAgc3RhcnRab29tID0gdGhpcy5fdmlld3BvcnRQcm9wcy56b29tO1xuICAgICAgICBzdGFydFpvb21MbmdMYXQgPSB0aGlzLl91bnByb2plY3Qoc3RhcnRQb3MpIHx8IHRoaXMuX3VucHJvamVjdChwb3MpO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQoc3RhcnRab29tTG5nTGF0LCAnYHN0YXJ0Wm9vbUxuZ0xhdGAgcHJvcCBpcyByZXF1aXJlZCAnICsgJ2ZvciB6b29tIGJlaGF2aW9yIHRvIGNhbGN1bGF0ZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUgbWFwLicpO1xuXG4gICAgICB2YXIgem9vbSA9IHRoaXMuX2NhbGN1bGF0ZU5ld1pvb20oe1xuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIHN0YXJ0Wm9vbTogc3RhcnRab29tIHx8IDBcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgem9vbWVkVmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChPYmplY3QuYXNzaWduKHt9LCB0aGlzLl92aWV3cG9ydFByb3BzLCB7XG4gICAgICAgIHpvb206IHpvb21cbiAgICAgIH0pKTtcblxuICAgICAgdmFyIF96b29tZWRWaWV3cG9ydCRnZXRNYSA9IHpvb21lZFZpZXdwb3J0LmdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oe1xuICAgICAgICBsbmdMYXQ6IHN0YXJ0Wm9vbUxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pLFxuICAgICAgICAgIF96b29tZWRWaWV3cG9ydCRnZXRNYTIgPSBfc2xpY2VkVG9BcnJheShfem9vbWVkVmlld3BvcnQkZ2V0TWEsIDIpLFxuICAgICAgICAgIGxvbmdpdHVkZSA9IF96b29tZWRWaWV3cG9ydCRnZXRNYTJbMF0sXG4gICAgICAgICAgbGF0aXR1ZGUgPSBfem9vbWVkVmlld3BvcnQkZ2V0TWEyWzFdO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInpvb21FbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gem9vbUVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydFpvb21MbmdMYXQ6IG51bGwsXG4gICAgICAgIHN0YXJ0Wm9vbTogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRVcGRhdGVkTWFwU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFVwZGF0ZWRNYXBTdGF0ZShuZXdQcm9wcykge1xuICAgICAgcmV0dXJuIG5ldyBNYXBTdGF0ZShPYmplY3QuYXNzaWduKHt9LCB0aGlzLl92aWV3cG9ydFByb3BzLCB0aGlzLl9zdGF0ZSwgbmV3UHJvcHMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2FwcGx5Q29uc3RyYWludHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FwcGx5Q29uc3RyYWludHMocHJvcHMpIHtcbiAgICAgIHZhciBtYXhab29tID0gcHJvcHMubWF4Wm9vbSxcbiAgICAgICAgICBtaW5ab29tID0gcHJvcHMubWluWm9vbSxcbiAgICAgICAgICB6b29tID0gcHJvcHMuem9vbTtcbiAgICAgIHByb3BzLnpvb20gPSBjbGFtcCh6b29tLCBtaW5ab29tLCBtYXhab29tKTtcbiAgICAgIHZhciBtYXhQaXRjaCA9IHByb3BzLm1heFBpdGNoLFxuICAgICAgICAgIG1pblBpdGNoID0gcHJvcHMubWluUGl0Y2gsXG4gICAgICAgICAgcGl0Y2ggPSBwcm9wcy5waXRjaDtcbiAgICAgIHByb3BzLnBpdGNoID0gY2xhbXAocGl0Y2gsIG1pblBpdGNoLCBtYXhQaXRjaCk7XG4gICAgICBPYmplY3QuYXNzaWduKHByb3BzLCBub3JtYWxpemVWaWV3cG9ydFByb3BzKHByb3BzKSk7XG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91bnByb2plY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VucHJvamVjdChwb3MpIHtcbiAgICAgIHZhciB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHRoaXMuX3ZpZXdwb3J0UHJvcHMpO1xuICAgICAgcmV0dXJuIHBvcyAmJiB2aWV3cG9ydC51bnByb2plY3QocG9zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NhbGN1bGF0ZU5ld0xuZ0xhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3TG5nTGF0KF9yZWY4KSB7XG4gICAgICB2YXIgc3RhcnRQYW5MbmdMYXQgPSBfcmVmOC5zdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgICBwb3MgPSBfcmVmOC5wb3M7XG4gICAgICB2YXIgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh0aGlzLl92aWV3cG9ydFByb3BzKTtcbiAgICAgIHJldHVybiB2aWV3cG9ydC5nZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uKHtcbiAgICAgICAgbG5nTGF0OiBzdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2FsY3VsYXRlTmV3Wm9vbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3Wm9vbShfcmVmOSkge1xuICAgICAgdmFyIHNjYWxlID0gX3JlZjkuc2NhbGUsXG4gICAgICAgICAgc3RhcnRab29tID0gX3JlZjkuc3RhcnRab29tO1xuICAgICAgdmFyIF90aGlzJF92aWV3cG9ydFByb3BzID0gdGhpcy5fdmlld3BvcnRQcm9wcyxcbiAgICAgICAgICBtYXhab29tID0gX3RoaXMkX3ZpZXdwb3J0UHJvcHMubWF4Wm9vbSxcbiAgICAgICAgICBtaW5ab29tID0gX3RoaXMkX3ZpZXdwb3J0UHJvcHMubWluWm9vbTtcbiAgICAgIHZhciB6b29tID0gc3RhcnRab29tICsgTWF0aC5sb2cyKHNjYWxlKTtcbiAgICAgIHJldHVybiBjbGFtcCh6b29tLCBtaW5ab29tLCBtYXhab29tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NhbGN1bGF0ZU5ld1BpdGNoQW5kQmVhcmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nKF9yZWYxMCkge1xuICAgICAgdmFyIGRlbHRhU2NhbGVYID0gX3JlZjEwLmRlbHRhU2NhbGVYLFxuICAgICAgICAgIGRlbHRhU2NhbGVZID0gX3JlZjEwLmRlbHRhU2NhbGVZLFxuICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IF9yZWYxMC5zdGFydEJlYXJpbmcsXG4gICAgICAgICAgc3RhcnRQaXRjaCA9IF9yZWYxMC5zdGFydFBpdGNoO1xuICAgICAgZGVsdGFTY2FsZVkgPSBjbGFtcChkZWx0YVNjYWxlWSwgLTEsIDEpO1xuICAgICAgdmFyIF90aGlzJF92aWV3cG9ydFByb3BzMiA9IHRoaXMuX3ZpZXdwb3J0UHJvcHMsXG4gICAgICAgICAgbWluUGl0Y2ggPSBfdGhpcyRfdmlld3BvcnRQcm9wczIubWluUGl0Y2gsXG4gICAgICAgICAgbWF4UGl0Y2ggPSBfdGhpcyRfdmlld3BvcnRQcm9wczIubWF4UGl0Y2g7XG4gICAgICB2YXIgYmVhcmluZyA9IHN0YXJ0QmVhcmluZyArIDE4MCAqIGRlbHRhU2NhbGVYO1xuICAgICAgdmFyIHBpdGNoID0gc3RhcnRQaXRjaDtcblxuICAgICAgaWYgKGRlbHRhU2NhbGVZID4gMCkge1xuICAgICAgICBwaXRjaCA9IHN0YXJ0UGl0Y2ggKyBkZWx0YVNjYWxlWSAqIChtYXhQaXRjaCAtIHN0YXJ0UGl0Y2gpO1xuICAgICAgfSBlbHNlIGlmIChkZWx0YVNjYWxlWSA8IDApIHtcbiAgICAgICAgcGl0Y2ggPSBzdGFydFBpdGNoIC0gZGVsdGFTY2FsZVkgKiAobWluUGl0Y2ggLSBzdGFydFBpdGNoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Um90YXRpb25QYXJhbXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFJvdGF0aW9uUGFyYW1zKHBvcywgc3RhcnRQb3MpIHtcbiAgICAgIHZhciBkZWx0YVggPSBwb3NbMF0gLSBzdGFydFBvc1swXTtcbiAgICAgIHZhciBkZWx0YVkgPSBwb3NbMV0gLSBzdGFydFBvc1sxXTtcbiAgICAgIHZhciBjZW50ZXJZID0gcG9zWzFdO1xuICAgICAgdmFyIHN0YXJ0WSA9IHN0YXJ0UG9zWzFdO1xuICAgICAgdmFyIF90aGlzJF92aWV3cG9ydFByb3BzMyA9IHRoaXMuX3ZpZXdwb3J0UHJvcHMsXG4gICAgICAgICAgd2lkdGggPSBfdGhpcyRfdmlld3BvcnRQcm9wczMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkX3ZpZXdwb3J0UHJvcHMzLmhlaWdodDtcbiAgICAgIHZhciBkZWx0YVNjYWxlWCA9IGRlbHRhWCAvIHdpZHRoO1xuICAgICAgdmFyIGRlbHRhU2NhbGVZID0gMDtcblxuICAgICAgaWYgKGRlbHRhWSA+IDApIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGhlaWdodCAtIHN0YXJ0WSkgPiBQSVRDSF9NT1VTRV9USFJFU0hPTEQpIHtcbiAgICAgICAgICBkZWx0YVNjYWxlWSA9IGRlbHRhWSAvIChzdGFydFkgLSBoZWlnaHQpICogUElUQ0hfQUNDRUw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgMCkge1xuICAgICAgICBpZiAoc3RhcnRZID4gUElUQ0hfTU9VU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgZGVsdGFTY2FsZVkgPSAxIC0gY2VudGVyWSAvIHN0YXJ0WTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZWx0YVNjYWxlWSA9IE1hdGgubWluKDEsIE1hdGgubWF4KC0xLCBkZWx0YVNjYWxlWSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVsdGFTY2FsZVg6IGRlbHRhU2NhbGVYLFxuICAgICAgICBkZWx0YVNjYWxlWTogZGVsdGFTY2FsZVlcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hcFN0YXRlO1xufSgpO1xuXG5leHBvcnQgeyBNYXBTdGF0ZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHsgTUFQQk9YX0xJTUlUUyB9IGZyb20gJy4vbWFwLXN0YXRlJztcblxuZnVuY3Rpb24gZGVjYXBpdGFsaXplKHMpIHtcbiAgcmV0dXJuIHNbMF0udG9Mb3dlckNhc2UoKSArIHMuc2xpY2UoMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Zpc2liaWxpdHlDb25zdHJhaW50cyhwcm9wcykge1xuICB2YXIgY29uc3RyYWludHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE1BUEJPWF9MSU1JVFM7XG5cbiAgZm9yICh2YXIgY29uc3RyYWludE5hbWUgaW4gY29uc3RyYWludHMpIHtcbiAgICB2YXIgdHlwZSA9IGNvbnN0cmFpbnROYW1lLnNsaWNlKDAsIDMpO1xuICAgIHZhciBwcm9wTmFtZSA9IGRlY2FwaXRhbGl6ZShjb25zdHJhaW50TmFtZS5zbGljZSgzKSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ21pbicgJiYgcHJvcHNbcHJvcE5hbWVdIDwgY29uc3RyYWludHNbY29uc3RyYWludE5hbWVdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdtYXgnICYmIHByb3BzW3Byb3BOYW1lXSA+IGNvbnN0cmFpbnRzW2NvbnN0cmFpbnROYW1lXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VTdGF0ZSwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbnZhciBNYXBDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gIHZpZXdwb3J0OiBudWxsLFxuICBtYXA6IG51bGwsXG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgb25WaWV3cG9ydENoYW5nZTogbnVsbCxcbiAgb25WaWV3U3RhdGVDaGFuZ2U6IG51bGwsXG4gIGV2ZW50TWFuYWdlcjogbnVsbFxufSk7XG5leHBvcnQgdmFyIE1hcENvbnRleHRQcm92aWRlciA9IE1hcENvbnRleHQuUHJvdmlkZXI7XG5cbmZ1bmN0aW9uIFdyYXBwZWRQcm92aWRlcihfcmVmKSB7XG4gIHZhciB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBtYXAgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0TWFwID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBzZXRNYXA6IHNldE1hcFxuICB9LCBjb250ZXh0KSwge30sIHtcbiAgICBtYXA6IGNvbnRleHQgJiYgY29udGV4dC5tYXAgfHwgbWFwXG4gIH0sIHZhbHVlKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFwQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuTWFwQ29udGV4dC5Qcm92aWRlciA9IFdyYXBwZWRQcm92aWRlcjtcbmV4cG9ydCBkZWZhdWx0IE1hcENvbnRleHQ7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuZXhwb3J0IGRlZmF1bHQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdDsiLCJleHBvcnQgZnVuY3Rpb24gZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIF9yZWYpIHtcbiAgdmFyIGxvbmdpdHVkZSA9IF9yZWYubG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGUgPSBfcmVmLmxhdGl0dWRlO1xuXG4gIGlmIChtYXAgJiYgbWFwLnF1ZXJ5VGVycmFpbkVsZXZhdGlvbikge1xuICAgIHJldHVybiBtYXAucXVlcnlUZXJyYWluRWxldmF0aW9uKFtsb25naXR1ZGUsIGxhdGl0dWRlXSkgfHwgMDtcbiAgfVxuXG4gIHJldHVybiAwO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBXZWJNZXJjYXRvclZpZXdwb3J0IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG5pbXBvcnQgTWFwYm94IGZyb20gJy4uL21hcGJveC9tYXBib3gnO1xuaW1wb3J0IG1hcGJveGdsIGZyb20gJy4uL3V0aWxzL21hcGJveGdsJztcbmltcG9ydCB7IGNoZWNrVmlzaWJpbGl0eUNvbnN0cmFpbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFwLWNvbnN0cmFpbnRzJztcbmltcG9ydCB7IE1BUEJPWF9MSU1JVFMgfSBmcm9tICcuLi91dGlscy9tYXAtc3RhdGUnO1xuaW1wb3J0IE1hcENvbnRleHQsIHsgTWFwQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9tYXAtY29udGV4dCc7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tICcuLi91dGlscy91c2UtaXNvbW9ycGhpYy1sYXlvdXQtZWZmZWN0JztcbmltcG9ydCB7IGdldFRlcnJhaW5FbGV2YXRpb24gfSBmcm9tICcuLi91dGlscy90ZXJyYWluJztcbnZhciBUT0tFTl9ET0NfVVJMID0gJ2h0dHBzOi8vdmlzZ2wuZ2l0aHViLmlvL3JlYWN0LW1hcC1nbC9kb2NzL2dldC1zdGFydGVkL21hcGJveC10b2tlbnMnO1xudmFyIE5PX1RPS0VOX1dBUk5JTkcgPSAnQSB2YWxpZCBBUEkgYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkIHRvIHVzZSBNYXBib3ggZGF0YSc7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnQoX3JlZikge1xuICB2YXIgbWFwID0gX3JlZi5tYXAsXG4gICAgICBwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICB2YXIgdmlld3BvcnRQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHByb3BzLnZpZXdTdGF0ZSksIHt9LCB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pO1xuXG4gIHZpZXdwb3J0UHJvcHMucG9zaXRpb24gPSBbMCwgMCwgZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIHZpZXdwb3J0UHJvcHMpXTtcbiAgcmV0dXJuIG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHZpZXdwb3J0UHJvcHMpO1xufVxudmFyIFVOQVVUSE9SSVpFRF9FUlJPUl9DT0RFID0gNDAxO1xudmFyIENPTlRBSU5FUl9TVFlMRSA9IHtcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gIHdpZHRoOiAnMTAwJScsXG4gIGhlaWdodDogJzEwMCUnLFxuICBvdmVyZmxvdzogJ2hpZGRlbidcbn07XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgTWFwYm94LmRlZmF1bHRQcm9wcywge1xuICBkaXNhYmxlVG9rZW5XYXJuaW5nOiBmYWxzZSxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgb25SZXNpemU6IG5vb3AsXG4gIGNsYXNzTmFtZTogJycsXG4gIHN0eWxlOiBudWxsLFxuICB2aXNpYmlsaXR5Q29uc3RyYWludHM6IE1BUEJPWF9MSU1JVFNcbn0pO1xuXG5mdW5jdGlvbiBOb1Rva2VuV2FybmluZygpIHtcbiAgdmFyIHN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwXG4gIH07XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwid2FybmluZ1wiLFxuICAgIGlkOiBcIm5vLXRva2VuLXdhcm5pbmdcIixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBrZXk6IFwiaGVhZGVyXCJcbiAgfSwgTk9fVE9LRU5fV0FSTklORyksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJ0ZXh0XCJcbiAgfSwgXCJGb3IgaW5mb3JtYXRpb24gb24gc2V0dGluZyB1cCB5b3VyIGJhc2VtYXAsIHJlYWRcIiksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBrZXk6IFwibGlua1wiLFxuICAgIGhyZWY6IFRPS0VOX0RPQ19VUkxcbiAgfSwgXCJOb3RlIG9uIE1hcCBUb2tlbnNcIikpO1xufVxuXG5mdW5jdGlvbiBnZXRSZWZIYW5kbGVzKG1hcGJveFJlZikge1xuICByZXR1cm4ge1xuICAgIGdldE1hcDogZnVuY3Rpb24gZ2V0TWFwKCkge1xuICAgICAgcmV0dXJuIG1hcGJveFJlZi5jdXJyZW50ICYmIG1hcGJveFJlZi5jdXJyZW50LmdldE1hcCgpO1xuICAgIH0sXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzOiBmdW5jdGlvbiBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnkpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBtYXAgPSBtYXBib3hSZWYuY3VycmVudCAmJiBtYXBib3hSZWYuY3VycmVudC5nZXRNYXAoKTtcbiAgICAgIHJldHVybiBtYXAgJiYgbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeSwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU3RhdGljTWFwID0gZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUodHJ1ZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGFjY2Vzc1Rva2VuVmFsaWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0VG9rZW5TdGF0ZSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSh7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH0pLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgc2l6ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRTaXplID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgbWFwYm94UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgbWFwRGl2UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgb3ZlcmxheVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIVN0YXRpY01hcC5zdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgbWFwYm94ID0gbmV3IE1hcGJveChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBzaXplKSwge30sIHtcbiAgICAgIG1hcGJveGdsOiBtYXBib3hnbCxcbiAgICAgIGNvbnRhaW5lcjogbWFwRGl2UmVmLmN1cnJlbnQsXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGV2dCkge1xuICAgICAgICB2YXIgc3RhdHVzQ29kZSA9IGV2dC5lcnJvciAmJiBldnQuZXJyb3Iuc3RhdHVzIHx8IGV2dC5zdGF0dXM7XG5cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IFVOQVVUSE9SSVpFRF9FUlJPUl9DT0RFICYmIGFjY2Vzc1Rva2VuVmFsaWQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKE5PX1RPS0VOX1dBUk5JTkcpO1xuICAgICAgICAgIHNldFRva2VuU3RhdGUoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvcHMub25FcnJvcihldnQpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBtYXBib3hSZWYuY3VycmVudCA9IG1hcGJveDtcblxuICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuc2V0TWFwKSB7XG4gICAgICBjb250ZXh0LnNldE1hcChtYXBib3guZ2V0TWFwKCkpO1xuICAgIH1cblxuICAgIHZhciByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgaWYgKGVudHJpZXNbMF0uY29udGVudFJlY3QpIHtcbiAgICAgICAgdmFyIF9lbnRyaWVzJDAkY29udGVudFJlYyA9IGVudHJpZXNbMF0uY29udGVudFJlY3QsXG4gICAgICAgICAgICBfd2lkdGggPSBfZW50cmllcyQwJGNvbnRlbnRSZWMud2lkdGgsXG4gICAgICAgICAgICBfaGVpZ2h0ID0gX2VudHJpZXMkMCRjb250ZW50UmVjLmhlaWdodDtcbiAgICAgICAgc2V0U2l6ZSh7XG4gICAgICAgICAgd2lkdGg6IF93aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IF9oZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIHByb3BzLm9uUmVzaXplKHtcbiAgICAgICAgICB3aWR0aDogX3dpZHRoLFxuICAgICAgICAgIGhlaWdodDogX2hlaWdodFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbWFwYm94LmZpbmFsaXplKCk7XG4gICAgICBtYXBib3hSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWFwYm94UmVmLmN1cnJlbnQpIHtcbiAgICAgIG1hcGJveFJlZi5jdXJyZW50LnNldFByb3BzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBzaXplKSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIG1hcCA9IG1hcGJveFJlZi5jdXJyZW50ICYmIG1hcGJveFJlZi5jdXJyZW50LmdldE1hcCgpO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRSZWZIYW5kbGVzKG1hcGJveFJlZik7XG4gIH0sIFtdKTtcbiAgdmFyIHByZXZlbnRTY3JvbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0O1xuXG4gICAgaWYgKHRhcmdldCA9PT0gb3ZlcmxheVJlZi5jdXJyZW50KSB7XG4gICAgICB0YXJnZXQuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHZhciBvdmVybGF5cyA9IG1hcCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KE1hcENvbnRleHRQcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbnRleHQpLCB7fSwge1xuICAgICAgdmlld3BvcnQ6IGNvbnRleHQudmlld3BvcnQgfHwgZ2V0Vmlld3BvcnQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIG1hcDogbWFwLFxuICAgICAgICBwcm9wczogcHJvcHNcbiAgICAgIH0sIHNpemUpKSxcbiAgICAgIG1hcDogbWFwLFxuICAgICAgY29udGFpbmVyOiBjb250ZXh0LmNvbnRhaW5lciB8fCBjb250YWluZXJSZWYuY3VycmVudFxuICAgIH0pXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJtYXAtb3ZlcmxheXNcIixcbiAgICBjbGFzc05hbWU6IFwib3ZlcmxheXNcIixcbiAgICByZWY6IG92ZXJsYXlSZWYsXG4gICAgc3R5bGU6IENPTlRBSU5FUl9TVFlMRSxcbiAgICBvblNjcm9sbDogcHJldmVudFNjcm9sbFxuICB9LCBwcm9wcy5jaGlsZHJlbikpO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICB2aXNpYmlsaXR5Q29uc3RyYWludHMgPSBwcm9wcy52aXNpYmlsaXR5Q29uc3RyYWludHM7XG4gIHZhciBtYXBDb250YWluZXJTdHlsZSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gIH0sIHN0eWxlLCB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pO1xuICB2YXIgdmlzaWJsZSA9IHByb3BzLnZpc2libGUgJiYgY2hlY2tWaXNpYmlsaXR5Q29uc3RyYWludHMocHJvcHMudmlld1N0YXRlIHx8IHByb3BzLCB2aXNpYmlsaXR5Q29uc3RyYWludHMpO1xuICB2YXIgbWFwU3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCBDT05UQUlORVJfU1RZTEUsIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlID8gJ2luaGVyaXQnIDogJ2hpZGRlbidcbiAgfSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwibWFwLWNvbnRhaW5lclwiLFxuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIHN0eWxlOiBtYXBDb250YWluZXJTdHlsZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwibWFwLW1hcGJveFwiLFxuICAgIHJlZjogbWFwRGl2UmVmLFxuICAgIHN0eWxlOiBtYXBTdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgb3ZlcmxheXMsICFhY2Nlc3NUb2tlblZhbGlkICYmICFwcm9wcy5kaXNhYmxlVG9rZW5XYXJuaW5nICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTm9Ub2tlbldhcm5pbmcsIG51bGwpKTtcbn0pO1xuXG5TdGF0aWNNYXAuc3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFwYm94Z2wgJiYgbWFwYm94Z2wuc3VwcG9ydGVkKCk7XG59O1xuXG5TdGF0aWNNYXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgU3RhdGljTWFwOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHtcbiAgdmFyIGl0O1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHZhciBGID0gZnVuY3Rpb24gRigpIHt9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgICAgIGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG9baSsrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIGUoX2UpIHtcbiAgICAgICAgICB0aHJvdyBfZTtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cblxuICB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsXG4gICAgICBkaWRFcnIgPSBmYWxzZSxcbiAgICAgIGVycjtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiBzKCkge1xuICAgICAgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0Lm5leHQoKTtcbiAgICAgIG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIGUoX2UyKSB7XG4gICAgICBkaWRFcnIgPSB0cnVlO1xuICAgICAgZXJyID0gX2UyO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24gZigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGRpZEVycikgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmltcG9ydCB7IGVxdWFscyB9IGZyb20gJy4uL21hdGgtdXRpbHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuLi9hc3NlcnQnO1xuXG52YXIgVHJhbnNpdGlvbkludGVycG9sYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHJhbnNpdGlvbkludGVycG9sYXRvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNpdGlvbkludGVycG9sYXRvcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJwcm9wTmFtZXNcIiwgW10pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zaXRpb25JbnRlcnBvbGF0b3IsIFt7XG4gICAga2V5OiBcImFyZVByb3BzRXF1YWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXJlUHJvcHNFcXVhbChjdXJyZW50UHJvcHMsIG5leHRQcm9wcykge1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMucHJvcE5hbWVzIHx8IFtdKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIWVxdWFscyhjdXJyZW50UHJvcHNba2V5XSwgbmV4dFByb3BzW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnRQcm9wcyxcbiAgICAgICAgZW5kOiBlbmRQcm9wc1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJwb2xhdGVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnBvbGF0ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdpbnRlcnBvbGF0ZVByb3BzIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcykge1xuICAgICAgcmV0dXJuIGVuZFByb3BzLnRyYW5zaXRpb25EdXJhdGlvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNpdGlvbkludGVycG9sYXRvcjtcbn0oKTtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbkludGVycG9sYXRvciBhcyBkZWZhdWx0IH07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn0iLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJ2YXIgV1JBUFBFRF9BTkdVTEFSX1BST1BTID0ge1xuICBsb25naXR1ZGU6IDEsXG4gIGJlYXJpbmc6IDFcbn07XG5leHBvcnQgZnVuY3Rpb24gbW9kKHZhbHVlLCBkaXZpc29yKSB7XG4gIHZhciBtb2R1bHVzID0gdmFsdWUgJSBkaXZpc29yO1xuICByZXR1cm4gbW9kdWx1cyA8IDAgPyBkaXZpc29yICsgbW9kdWx1cyA6IG1vZHVsdXM7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZChwcm9wKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHJvcCkgfHwgQXJyYXkuaXNBcnJheShwcm9wKTtcbn1cblxuZnVuY3Rpb24gaXNXcmFwcGVkQW5ndWxhclByb3AocHJvcE5hbWUpIHtcbiAgcmV0dXJuIHByb3BOYW1lIGluIFdSQVBQRURfQU5HVUxBUl9QUk9QUztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGgocHJvcE5hbWUsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKSB7XG4gIGlmIChpc1dyYXBwZWRBbmd1bGFyUHJvcChwcm9wTmFtZSkgJiYgTWF0aC5hYnMoZW5kVmFsdWUgLSBzdGFydFZhbHVlKSA+IDE4MCkge1xuICAgIGVuZFZhbHVlID0gZW5kVmFsdWUgPCAwID8gZW5kVmFsdWUgKyAzNjAgOiBlbmRWYWx1ZSAtIDM2MDtcbiAgfVxuXG4gIHJldHVybiBlbmRWYWx1ZTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkge1xuICB2YXIgaXQ7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoaXQpIG8gPSBpdDtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHM6IEYsXG4gICAgICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gZShfZSkge1xuICAgICAgICAgIHRocm93IF9lO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSxcbiAgICAgIGRpZEVyciA9IGZhbHNlLFxuICAgICAgZXJyO1xuICByZXR1cm4ge1xuICAgIHM6IGZ1bmN0aW9uIHMoKSB7XG4gICAgICBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgIHZhciBzdGVwID0gaXQubmV4dCgpO1xuICAgICAgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTtcbiAgICAgIHJldHVybiBzdGVwO1xuICAgIH0sXG4gICAgZTogZnVuY3Rpb24gZShfZTIpIHtcbiAgICAgIGRpZEVyciA9IHRydWU7XG4gICAgICBlcnIgPSBfZTI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiBmKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHtcbiAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkge1xuICAgIHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHtcbiAgICAgIHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7XG5cbiAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW1wb3J0IGFzc2VydCBmcm9tICcuLi9hc3NlcnQnO1xuaW1wb3J0IFRyYW5zaXRpb25JbnRlcnBvbGF0b3IgZnJvbSAnLi90cmFuc2l0aW9uLWludGVycG9sYXRvcic7XG5pbXBvcnQgeyBmbHlUb1ZpZXdwb3J0LCBnZXRGbHlUb0R1cmF0aW9uIH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQgeyBpc1ZhbGlkLCBnZXRFbmRWYWx1ZUJ5U2hvcnRlc3RQYXRoIH0gZnJvbSAnLi90cmFuc2l0aW9uLXV0aWxzJztcbmltcG9ydCB7IGxlcnAgfSBmcm9tICcuLi9tYXRoLXV0aWxzJztcbnZhciBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTID0gWydsb25naXR1ZGUnLCAnbGF0aXR1ZGUnLCAnem9vbScsICdiZWFyaW5nJywgJ3BpdGNoJ107XG52YXIgUkVRVUlSRURfUFJPUFMgPSBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZScsICd6b29tJywgJ3dpZHRoJywgJ2hlaWdodCddO1xudmFyIExJTkVBUkxZX0lOVEVSUE9MQVRFRF9QUk9QUyA9IFsnYmVhcmluZycsICdwaXRjaCddO1xudmFyIERFRkFVTFRfT1BUUyA9IHtcbiAgc3BlZWQ6IDEuMixcbiAgY3VydmU6IDEuNDE0XG59O1xuXG52YXIgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciA9IGZ1bmN0aW9uIChfVHJhbnNpdGlvbkludGVycG9sYXQpIHtcbiAgX2luaGVyaXRzKFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IsIF9UcmFuc2l0aW9uSW50ZXJwb2xhdCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yKTtcblxuICBmdW5jdGlvbiBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInByb3BOYW1lc1wiLCBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTKTtcblxuICAgIF90aGlzLnByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRTLCBwcm9wcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IsIFt7XG4gICAga2V5OiBcImluaXRpYWxpemVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgICAgIHZhciBzdGFydFZpZXdwb3J0UHJvcHMgPSB7fTtcbiAgICAgIHZhciBlbmRWaWV3cG9ydFByb3BzID0ge307XG5cbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihSRVFVSVJFRF9QUk9QUyksXG4gICAgICAgICAgX3N0ZXA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIHZhciBzdGFydFZhbHVlID0gc3RhcnRQcm9wc1trZXldO1xuICAgICAgICAgIHZhciBlbmRWYWx1ZSA9IGVuZFByb3BzW2tleV07XG4gICAgICAgICAgYXNzZXJ0KGlzVmFsaWQoc3RhcnRWYWx1ZSkgJiYgaXNWYWxpZChlbmRWYWx1ZSksIFwiXCIuY29uY2F0KGtleSwgXCIgbXVzdCBiZSBzdXBwbGllZCBmb3IgdHJhbnNpdGlvblwiKSk7XG4gICAgICAgICAgc3RhcnRWaWV3cG9ydFByb3BzW2tleV0gPSBzdGFydFZhbHVlO1xuICAgICAgICAgIGVuZFZpZXdwb3J0UHJvcHNba2V5XSA9IGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGgoa2V5LCBzdGFydFZhbHVlLCBlbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihMSU5FQVJMWV9JTlRFUlBPTEFURURfUFJPUFMpLFxuICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX2tleSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgIHZhciBfc3RhcnRWYWx1ZSA9IHN0YXJ0UHJvcHNbX2tleV0gfHwgMDtcblxuICAgICAgICAgIHZhciBfZW5kVmFsdWUgPSBlbmRQcm9wc1tfa2V5XSB8fCAwO1xuXG4gICAgICAgICAgc3RhcnRWaWV3cG9ydFByb3BzW19rZXldID0gX3N0YXJ0VmFsdWU7XG4gICAgICAgICAgZW5kVmlld3BvcnRQcm9wc1tfa2V5XSA9IGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGgoX2tleSwgX3N0YXJ0VmFsdWUsIF9lbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnRWaWV3cG9ydFByb3BzLFxuICAgICAgICBlbmQ6IGVuZFZpZXdwb3J0UHJvcHNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVycG9sYXRlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJwb2xhdGVQcm9wcyhzdGFydFByb3BzLCBlbmRQcm9wcywgdCkge1xuICAgICAgdmFyIHZpZXdwb3J0ID0gZmx5VG9WaWV3cG9ydChzdGFydFByb3BzLCBlbmRQcm9wcywgdCwgdGhpcy5wcm9wcyk7XG5cbiAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoTElORUFSTFlfSU5URVJQT0xBVEVEX1BST1BTKSxcbiAgICAgICAgICBfc3RlcDM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgICB2aWV3cG9ydFtrZXldID0gbGVycChzdGFydFByb3BzW2tleV0sIGVuZFByb3BzW2tleV0sIHQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IzLmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcykge1xuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IGVuZFByb3BzLnRyYW5zaXRpb25EdXJhdGlvbjtcblxuICAgICAgaWYgKHRyYW5zaXRpb25EdXJhdGlvbiA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbiA9IGdldEZseVRvRHVyYXRpb24oc3RhcnRQcm9wcywgZW5kUHJvcHMsIHRoaXMucHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yO1xufShUcmFuc2l0aW9uSW50ZXJwb2xhdG9yKTtcblxuZXhwb3J0IHsgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChpdCkgbyA9IGl0O1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBvW2krK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiBlKF9lKSB7XG4gICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgICAgZGlkRXJyID0gZmFsc2UsXG4gICAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gcygpIHtcbiAgICAgIGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiBlKF9lMikge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IF9lMjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uIGYoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkge1xuICB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtcblxuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vYXNzZXJ0JztcbmltcG9ydCBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yIGZyb20gJy4vdHJhbnNpdGlvbi1pbnRlcnBvbGF0b3InO1xuaW1wb3J0IHsgaXNWYWxpZCwgZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aCB9IGZyb20gJy4vdHJhbnNpdGlvbi11dGlscyc7XG5pbXBvcnQgeyBsZXJwIH0gZnJvbSAnLi4vbWF0aC11dGlscyc7XG52YXIgVklFV1BPUlRfVFJBTlNJVElPTl9QUk9QUyA9IFsnbG9uZ2l0dWRlJywgJ2xhdGl0dWRlJywgJ3pvb20nLCAnYmVhcmluZycsICdwaXRjaCddO1xuXG52YXIgTGluZWFySW50ZXJwb2xhdG9yID0gZnVuY3Rpb24gKF9UcmFuc2l0aW9uSW50ZXJwb2xhdCkge1xuICBfaW5oZXJpdHMoTGluZWFySW50ZXJwb2xhdG9yLCBfVHJhbnNpdGlvbkludGVycG9sYXQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTGluZWFySW50ZXJwb2xhdG9yKTtcblxuICBmdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGF0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpbmVhckludGVycG9sYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cykpIHtcbiAgICAgIG9wdHMgPSB7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wczogb3B0c1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBfdGhpcy5wcm9wTmFtZXMgPSBvcHRzLnRyYW5zaXRpb25Qcm9wcyB8fCBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTO1xuXG4gICAgaWYgKG9wdHMuYXJvdW5kKSB7XG4gICAgICBfdGhpcy5hcm91bmQgPSBvcHRzLmFyb3VuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGluZWFySW50ZXJwb2xhdG9yLCBbe1xuICAgIGtleTogXCJpbml0aWFsaXplUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gICAgICB2YXIgc3RhcnRWaWV3cG9ydFByb3BzID0ge307XG4gICAgICB2YXIgZW5kVmlld3BvcnRQcm9wcyA9IHt9O1xuXG4gICAgICBpZiAodGhpcy5hcm91bmQpIHtcbiAgICAgICAgc3RhcnRWaWV3cG9ydFByb3BzLmFyb3VuZCA9IHRoaXMuYXJvdW5kO1xuICAgICAgICB2YXIgYXJvdW5kTG5nTGF0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoc3RhcnRQcm9wcykudW5wcm9qZWN0KHRoaXMuYXJvdW5kKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbmRWaWV3cG9ydFByb3BzLCBlbmRQcm9wcywge1xuICAgICAgICAgIGFyb3VuZDogbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoZW5kUHJvcHMpLnByb2plY3QoYXJvdW5kTG5nTGF0KSxcbiAgICAgICAgICBhcm91bmRMbmdMYXQ6IGFyb3VuZExuZ0xhdFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMucHJvcE5hbWVzKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFByb3BzW2tleV07XG4gICAgICAgICAgdmFyIGVuZFZhbHVlID0gZW5kUHJvcHNba2V5XTtcbiAgICAgICAgICBhc3NlcnQoaXNWYWxpZChzdGFydFZhbHVlKSAmJiBpc1ZhbGlkKGVuZFZhbHVlKSwgXCJcIi5jb25jYXQoa2V5LCBcIiBtdXN0IGJlIHN1cHBsaWVkIGZvciB0cmFuc2l0aW9uXCIpKTtcbiAgICAgICAgICBzdGFydFZpZXdwb3J0UHJvcHNba2V5XSA9IHN0YXJ0VmFsdWU7XG4gICAgICAgICAgZW5kVmlld3BvcnRQcm9wc1trZXldID0gZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aChrZXksIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnRWaWV3cG9ydFByb3BzLFxuICAgICAgICBlbmQ6IGVuZFZpZXdwb3J0UHJvcHNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVycG9sYXRlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJwb2xhdGVQcm9wcyhzdGFydFByb3BzLCBlbmRQcm9wcywgdCkge1xuICAgICAgdmFyIHZpZXdwb3J0ID0ge307XG5cbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5wcm9wTmFtZXMpLFxuICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIHZpZXdwb3J0W2tleV0gPSBsZXJwKHN0YXJ0UHJvcHNba2V5XSwgZW5kUHJvcHNba2V5XSwgdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5kUHJvcHMuYXJvdW5kKSB7XG4gICAgICAgIHZhciBfV2ViTWVyY2F0b3JWaWV3cG9ydCQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChPYmplY3QuYXNzaWduKHt9LCBlbmRQcm9wcywgdmlld3BvcnQpKS5nZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uKHtcbiAgICAgICAgICBsbmdMYXQ6IGVuZFByb3BzLmFyb3VuZExuZ0xhdCxcbiAgICAgICAgICBwb3M6IGxlcnAoc3RhcnRQcm9wcy5hcm91bmQsIGVuZFByb3BzLmFyb3VuZCwgdClcbiAgICAgICAgfSksXG4gICAgICAgICAgICBfV2ViTWVyY2F0b3JWaWV3cG9ydCQyID0gX3NsaWNlZFRvQXJyYXkoX1dlYk1lcmNhdG9yVmlld3BvcnQkLCAyKSxcbiAgICAgICAgICAgIGxvbmdpdHVkZSA9IF9XZWJNZXJjYXRvclZpZXdwb3J0JDJbMF0sXG4gICAgICAgICAgICBsYXRpdHVkZSA9IF9XZWJNZXJjYXRvclZpZXdwb3J0JDJbMV07XG5cbiAgICAgICAgdmlld3BvcnQubG9uZ2l0dWRlID0gbG9uZ2l0dWRlO1xuICAgICAgICB2aWV3cG9ydC5sYXRpdHVkZSA9IGxhdGl0dWRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmlld3BvcnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmVhckludGVycG9sYXRvcjtcbn0oVHJhbnNpdGlvbkludGVycG9sYXRvcik7XG5cbmV4cG9ydCB7IExpbmVhckludGVycG9sYXRvciBhcyBkZWZhdWx0IH07IiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yIH0gZnJvbSAnLi90cmFuc2l0aW9uLWludGVycG9sYXRvcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IgfSBmcm9tICcuL3ZpZXdwb3J0LWZseS10by1pbnRlcnBvbGF0b3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaW5lYXJJbnRlcnBvbGF0b3IgfSBmcm9tICcuL2xpbmVhci1pbnRlcnBvbGF0b3InOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi9hc3NlcnQnO1xuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhdG9yIH0gZnJvbSAnLi90cmFuc2l0aW9uJztcbmltcG9ydCBNYXBTdGF0ZSBmcm9tICcuL21hcC1zdGF0ZSc7XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JvcEVhc2luZ0Z1bmN0aW9uKGVhc2luZywgeDApIHtcbiAgdmFyIHkwID0gZWFzaW5nKHgwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIDEgLyAoMSAtIHkwKSAqIChlYXNpbmcodCAqICgxIC0geDApICsgeDApIC0geTApO1xuICB9O1xufVxuZXhwb3J0IHZhciBUUkFOU0lUSU9OX0VWRU5UUyA9IHtcbiAgQlJFQUs6IDEsXG4gIFNOQVBfVE9fRU5EOiAyLFxuICBJR05PUkU6IDMsXG4gIFVQREFURTogNFxufTtcbnZhciBERUZBVUxUX1BST1BTID0ge1xuICB0cmFuc2l0aW9uRHVyYXRpb246IDAsXG4gIHRyYW5zaXRpb25FYXNpbmc6IGZ1bmN0aW9uIHRyYW5zaXRpb25FYXNpbmcodCkge1xuICAgIHJldHVybiB0O1xuICB9LFxuICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKCksXG4gIHRyYW5zaXRpb25JbnRlcnJ1cHRpb246IFRSQU5TSVRJT05fRVZFTlRTLkJSRUFLLFxuICBvblRyYW5zaXRpb25TdGFydDogbm9vcCxcbiAgb25UcmFuc2l0aW9uSW50ZXJydXB0OiBub29wLFxuICBvblRyYW5zaXRpb25FbmQ6IG5vb3Bcbn07XG5cbnZhciBUcmFuc2l0aW9uTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHJhbnNpdGlvbk1hbmFnZXIoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2l0aW9uTWFuYWdlcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfYW5pbWF0aW9uRnJhbWVcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfb25UcmFuc2l0aW9uRnJhbWVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX2FuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLl9vblRyYW5zaXRpb25GcmFtZSk7XG5cbiAgICAgIF90aGlzLl91cGRhdGVWaWV3cG9ydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9wcyA9IG51bGw7XG4gICAgdGhpcy5vblZpZXdwb3J0Q2hhbmdlID0gb3B0cy5vblZpZXdwb3J0Q2hhbmdlIHx8IG5vb3A7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gb3B0cy5vblN0YXRlQ2hhbmdlIHx8IG5vb3A7XG4gICAgdGhpcy50aW1lID0gb3B0cy5nZXRUaW1lIHx8IERhdGUubm93O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zaXRpb25NYW5hZ2VyLCBbe1xuICAgIGtleTogXCJnZXRWaWV3cG9ydEluVHJhbnNpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWV3cG9ydEluVHJhbnNpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hbmltYXRpb25GcmFtZSA/IHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9jZXNzVmlld3BvcnRDaGFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2Vzc1ZpZXdwb3J0Q2hhbmdlKG5leHRQcm9wcykge1xuICAgICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLnByb3BzID0gbmV4dFByb3BzO1xuXG4gICAgICBpZiAoIWN1cnJlbnRQcm9wcyB8fCB0aGlzLl9zaG91bGRJZ25vcmVWaWV3cG9ydENoYW5nZShjdXJyZW50UHJvcHMsIG5leHRQcm9wcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uRW5hYmxlZChuZXh0UHJvcHMpKSB7XG4gICAgICAgIHZhciBzdGFydFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudFByb3BzKTtcbiAgICAgICAgdmFyIGVuZFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbmV4dFByb3BzKTtcblxuICAgICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uSW5Qcm9ncmVzcygpKSB7XG4gICAgICAgICAgY3VycmVudFByb3BzLm9uVHJhbnNpdGlvbkludGVycnVwdCgpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaW50ZXJydXB0aW9uID09PSBUUkFOU0lUSU9OX0VWRU5UUy5TTkFQX1RPX0VORCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGFydFByb3BzLCB0aGlzLnN0YXRlLmVuZFByb3BzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGFydFByb3BzLCB0aGlzLnN0YXRlLnByb3BzSW5UcmFuc2l0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5pbnRlcnJ1cHRpb24gPT09IFRSQU5TSVRJT05fRVZFTlRTLlVQREFURSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gdGhpcy50aW1lKCk7XG4gICAgICAgICAgICB2YXIgeDAgPSAoY3VycmVudFRpbWUgLSB0aGlzLnN0YXRlLnN0YXJ0VGltZSkgLyB0aGlzLnN0YXRlLmR1cmF0aW9uO1xuICAgICAgICAgICAgZW5kUHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpcy5zdGF0ZS5kdXJhdGlvbiAtIChjdXJyZW50VGltZSAtIHRoaXMuc3RhdGUuc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIGVuZFByb3BzLnRyYW5zaXRpb25FYXNpbmcgPSBjcm9wRWFzaW5nRnVuY3Rpb24odGhpcy5zdGF0ZS5lYXNpbmcsIHgwKTtcbiAgICAgICAgICAgIGVuZFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IgPSBzdGFydFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZW5kUHJvcHMub25UcmFuc2l0aW9uU3RhcnQoKTtcblxuICAgICAgICB0aGlzLl90cmlnZ2VyVHJhbnNpdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25JblByb2dyZXNzKCkpIHtcbiAgICAgICAgY3VycmVudFByb3BzLm9uVHJhbnNpdGlvbkludGVycnVwdCgpO1xuXG4gICAgICAgIHRoaXMuX2VuZFRyYW5zaXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaXNUcmFuc2l0aW9uSW5Qcm9ncmVzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaXNUcmFuc2l0aW9uSW5Qcm9ncmVzcygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2FuaW1hdGlvbkZyYW1lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2lzVHJhbnNpdGlvbkVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2lzVHJhbnNpdGlvbkVuYWJsZWQocHJvcHMpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBwcm9wcy50cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgICAgdHJhbnNpdGlvbkludGVycG9sYXRvciA9IHByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3I7XG4gICAgICByZXR1cm4gKHRyYW5zaXRpb25EdXJhdGlvbiA+IDAgfHwgdHJhbnNpdGlvbkR1cmF0aW9uID09PSAnYXV0bycpICYmIEJvb2xlYW4odHJhbnNpdGlvbkludGVycG9sYXRvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1VwZGF0ZUR1ZVRvQ3VycmVudFRyYW5zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2lzVXBkYXRlRHVlVG9DdXJyZW50VHJhbnNpdGlvbihwcm9wcykge1xuICAgICAgaWYgKHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaW50ZXJwb2xhdG9yLmFyZVByb3BzRXF1YWwocHJvcHMsIHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zaG91bGRJZ25vcmVWaWV3cG9ydENoYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc2hvdWxkSWdub3JlVmlld3BvcnRDaGFuZ2UoY3VycmVudFByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghY3VycmVudFByb3BzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uSW5Qcm9ncmVzcygpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmludGVycnVwdGlvbiA9PT0gVFJBTlNJVElPTl9FVkVOVFMuSUdOT1JFIHx8IHRoaXMuX2lzVXBkYXRlRHVlVG9DdXJyZW50VHJhbnNpdGlvbihuZXh0UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uRW5hYmxlZChuZXh0UHJvcHMpKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvci5hcmVQcm9wc0VxdWFsKGN1cnJlbnRQcm9wcywgbmV4dFByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl90cmlnZ2VyVHJhbnNpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdHJpZ2dlclRyYW5zaXRpb24oc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgICAgIGFzc2VydCh0aGlzLl9pc1RyYW5zaXRpb25FbmFibGVkKGVuZFByb3BzKSk7XG5cbiAgICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yID0gZW5kUHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvcjtcbiAgICAgIHZhciBkdXJhdGlvbiA9IHRyYW5zaXRpb25JbnRlcnBvbGF0b3IuZ2V0RHVyYXRpb24gPyB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yLmdldER1cmF0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSA6IGVuZFByb3BzLnRyYW5zaXRpb25EdXJhdGlvbjtcblxuICAgICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGluaXRpYWxQcm9wcyA9IGVuZFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IuaW5pdGlhbGl6ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzKTtcbiAgICAgIHZhciBpbnRlcmFjdGlvblN0YXRlID0ge1xuICAgICAgICBpblRyYW5zaXRpb246IHRydWUsXG4gICAgICAgIGlzWm9vbWluZzogc3RhcnRQcm9wcy56b29tICE9PSBlbmRQcm9wcy56b29tLFxuICAgICAgICBpc1Bhbm5pbmc6IHN0YXJ0UHJvcHMubG9uZ2l0dWRlICE9PSBlbmRQcm9wcy5sb25naXR1ZGUgfHwgc3RhcnRQcm9wcy5sYXRpdHVkZSAhPT0gZW5kUHJvcHMubGF0aXR1ZGUsXG4gICAgICAgIGlzUm90YXRpbmc6IHN0YXJ0UHJvcHMuYmVhcmluZyAhPT0gZW5kUHJvcHMuYmVhcmluZyB8fCBzdGFydFByb3BzLnBpdGNoICE9PSBlbmRQcm9wcy5waXRjaFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZWFzaW5nOiBlbmRQcm9wcy50cmFuc2l0aW9uRWFzaW5nLFxuICAgICAgICBpbnRlcnBvbGF0b3I6IGVuZFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IsXG4gICAgICAgIGludGVycnVwdGlvbjogZW5kUHJvcHMudHJhbnNpdGlvbkludGVycnVwdGlvbixcbiAgICAgICAgc3RhcnRUaW1lOiB0aGlzLnRpbWUoKSxcbiAgICAgICAgc3RhcnRQcm9wczogaW5pdGlhbFByb3BzLnN0YXJ0LFxuICAgICAgICBlbmRQcm9wczogaW5pdGlhbFByb3BzLmVuZCxcbiAgICAgICAgYW5pbWF0aW9uOiBudWxsLFxuICAgICAgICBwcm9wc0luVHJhbnNpdGlvbjoge31cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX29uVHJhbnNpdGlvbkZyYW1lKCk7XG5cbiAgICAgIHRoaXMub25TdGF0ZUNoYW5nZShpbnRlcmFjdGlvblN0YXRlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2VuZFRyYW5zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2VuZFRyYW5zaXRpb24oKSB7XG4gICAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSh7XG4gICAgICAgIGluVHJhbnNpdGlvbjogZmFsc2UsXG4gICAgICAgIGlzWm9vbWluZzogZmFsc2UsXG4gICAgICAgIGlzUGFubmluZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZVZpZXdwb3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVWaWV3cG9ydCgpIHtcbiAgICAgIHZhciBjdXJyZW50VGltZSA9IHRoaXMudGltZSgpO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBzdGFydFRpbWUgPSBfdGhpcyRzdGF0ZS5zdGFydFRpbWUsXG4gICAgICAgICAgZHVyYXRpb24gPSBfdGhpcyRzdGF0ZS5kdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmcgPSBfdGhpcyRzdGF0ZS5lYXNpbmcsXG4gICAgICAgICAgaW50ZXJwb2xhdG9yID0gX3RoaXMkc3RhdGUuaW50ZXJwb2xhdG9yLFxuICAgICAgICAgIHN0YXJ0UHJvcHMgPSBfdGhpcyRzdGF0ZS5zdGFydFByb3BzLFxuICAgICAgICAgIGVuZFByb3BzID0gX3RoaXMkc3RhdGUuZW5kUHJvcHM7XG4gICAgICB2YXIgc2hvdWxkRW5kID0gZmFsc2U7XG4gICAgICB2YXIgdCA9IChjdXJyZW50VGltZSAtIHN0YXJ0VGltZSkgLyBkdXJhdGlvbjtcblxuICAgICAgaWYgKHQgPj0gMSkge1xuICAgICAgICB0ID0gMTtcbiAgICAgICAgc2hvdWxkRW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdCA9IGVhc2luZyh0KTtcbiAgICAgIHZhciB2aWV3cG9ydCA9IGludGVycG9sYXRvci5pbnRlcnBvbGF0ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KTtcbiAgICAgIHZhciBtYXBTdGF0ZSA9IG5ldyBNYXBTdGF0ZShPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCB2aWV3cG9ydCkpO1xuICAgICAgdGhpcy5zdGF0ZS5wcm9wc0luVHJhbnNpdGlvbiA9IG1hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKTtcbiAgICAgIHRoaXMub25WaWV3cG9ydENoYW5nZSh0aGlzLnN0YXRlLnByb3BzSW5UcmFuc2l0aW9uLCB0aGlzLnByb3BzKTtcblxuICAgICAgaWYgKHNob3VsZEVuZCkge1xuICAgICAgICB0aGlzLl9lbmRUcmFuc2l0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vblRyYW5zaXRpb25FbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNpdGlvbk1hbmFnZXI7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShUcmFuc2l0aW9uTWFuYWdlciwgXCJkZWZhdWx0UHJvcHNcIiwgREVGQVVMVF9QUk9QUyk7XG5cbmV4cG9ydCB7IFRyYW5zaXRpb25NYW5hZ2VyIGFzIGRlZmF1bHQgfTsiLCJ2YXIgSU5QVVRfU1RBUlQgPSAxO1xudmFyIElOUFVUX01PVkUgPSAyO1xudmFyIElOUFVUX0VORCA9IDQ7XG52YXIgTU9VU0VfSU5QVVRfTUFQID0ge1xuICBtb3VzZWRvd246IElOUFVUX1NUQVJULFxuICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gIG1vdXNldXA6IElOUFVUX0VORFxufTtcblxuZnVuY3Rpb24gc29tZShhcnJheSwgcHJlZGljdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHByZWRpY3QoYXJyYXlbaV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmhhbmNlUG9pbnRlckV2ZW50SW5wdXQoUG9pbnRlckV2ZW50SW5wdXQpIHtcbiAgdmFyIG9sZEhhbmRsZXIgPSBQb2ludGVyRXZlbnRJbnB1dC5wcm90b3R5cGUuaGFuZGxlcjtcblxuICBQb2ludGVyRXZlbnRJbnB1dC5wcm90b3R5cGUuaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoZXYpIHtcbiAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuXG4gICAgaWYgKGV2LmJ1dHRvbiA+IDAgJiYgZXYudHlwZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuICAgICAgaWYgKCFzb21lKHN0b3JlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5wb2ludGVySWQgPT09IGV2LnBvaW50ZXJJZDtcbiAgICAgIH0pKSB7XG4gICAgICAgIHN0b3JlLnB1c2goZXYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9sZEhhbmRsZXIuY2FsbCh0aGlzLCBldik7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZW5oYW5jZU1vdXNlSW5wdXQoTW91c2VJbnB1dCkge1xuICBNb3VzZUlucHV0LnByb3RvdHlwZS5oYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihldikge1xuICAgIHZhciBldmVudFR5cGUgPSBNT1VTRV9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgZXYuYnV0dG9uID49IDApIHtcbiAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggPT09IDApIHtcbiAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgIHBvaW50ZXJzOiBbZXZdLFxuICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICBzcmNFdmVudDogZXZcbiAgICB9KTtcbiAgfTtcbn0iLCJpbXBvcnQgaGFtbWVyanMgZnJvbSAnaGFtbWVyanMnO1xuaW1wb3J0IHsgZW5oYW5jZVBvaW50ZXJFdmVudElucHV0LCBlbmhhbmNlTW91c2VJbnB1dCB9IGZyb20gJy4vaGFtbWVyLW92ZXJyaWRlcyc7XG5lbmhhbmNlUG9pbnRlckV2ZW50SW5wdXQoaGFtbWVyanMuUG9pbnRlckV2ZW50SW5wdXQpO1xuZW5oYW5jZU1vdXNlSW5wdXQoaGFtbWVyanMuTW91c2VJbnB1dCk7XG5leHBvcnQgdmFyIE1hbmFnZXIgPSBoYW1tZXJqcy5NYW5hZ2VyO1xuZXhwb3J0IGRlZmF1bHQgaGFtbWVyanM7IiwiaW1wb3J0IEhhbW1lciBmcm9tICcuL3V0aWxzL2hhbW1lcic7XG5leHBvcnQgdmFyIFJFQ09HTklaRVJTID0gSGFtbWVyID8gW1tIYW1tZXIuUGFuLCB7XG4gIGV2ZW50OiAndHJpcGFuJyxcbiAgcG9pbnRlcnM6IDMsXG4gIHRocmVzaG9sZDogMCxcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuUm90YXRlLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlBpbmNoLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlN3aXBlLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlBhbiwge1xuICB0aHJlc2hvbGQ6IDAsXG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlByZXNzLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlRhcCwge1xuICBldmVudDogJ2RvdWJsZXRhcCcsXG4gIHRhcHM6IDIsXG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlRhcCwge1xuICBldmVudDogJ2FueXRhcCcsXG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlRhcCwge1xuICBlbmFibGU6IGZhbHNlXG59XV0gOiBudWxsO1xuZXhwb3J0IHZhciBSRUNPR05JWkVSX0NPTVBBVElCTEVfTUFQID0ge1xuICB0cmlwYW46IFsncm90YXRlJywgJ3BpbmNoJywgJ3BhbiddLFxuICByb3RhdGU6IFsncGluY2gnXSxcbiAgcGluY2g6IFsncGFuJ10sXG4gIHBhbjogWydwcmVzcycsICdkb3VibGV0YXAnLCAnYW55dGFwJywgJ3RhcCddLFxuICBkb3VibGV0YXA6IFsnYW55dGFwJ10sXG4gIGFueXRhcDogWyd0YXAnXVxufTtcbmV4cG9ydCB2YXIgUkVDT0dOSVpFUl9GQUxMQkFDS19NQVAgPSB7XG4gIGRvdWJsZXRhcDogWyd0YXAnXVxufTtcbmV4cG9ydCB2YXIgQkFTSUNfRVZFTlRfQUxJQVNFUyA9IHtcbiAgcG9pbnRlcmRvd246ICdwb2ludGVyZG93bicsXG4gIHBvaW50ZXJtb3ZlOiAncG9pbnRlcm1vdmUnLFxuICBwb2ludGVydXA6ICdwb2ludGVydXAnLFxuICB0b3VjaHN0YXJ0OiAncG9pbnRlcmRvd24nLFxuICB0b3VjaG1vdmU6ICdwb2ludGVybW92ZScsXG4gIHRvdWNoZW5kOiAncG9pbnRlcnVwJyxcbiAgbW91c2Vkb3duOiAncG9pbnRlcmRvd24nLFxuICBtb3VzZW1vdmU6ICdwb2ludGVybW92ZScsXG4gIG1vdXNldXA6ICdwb2ludGVydXAnXG59O1xuZXhwb3J0IHZhciBJTlBVVF9FVkVOVF9UWVBFUyA9IHtcbiAgS0VZX0VWRU5UUzogWydrZXlkb3duJywgJ2tleXVwJ10sXG4gIE1PVVNFX0VWRU5UUzogWydtb3VzZWRvd24nLCAnbW91c2Vtb3ZlJywgJ21vdXNldXAnLCAnbW91c2VvdmVyJywgJ21vdXNlb3V0JywgJ21vdXNlbGVhdmUnXSxcbiAgV0hFRUxfRVZFTlRTOiBbJ3doZWVsJywgJ21vdXNld2hlZWwnXVxufTtcbmV4cG9ydCB2YXIgRVZFTlRfUkVDT0dOSVpFUl9NQVAgPSB7XG4gIHRhcDogJ3RhcCcsXG4gIGFueXRhcDogJ2FueXRhcCcsXG4gIGRvdWJsZXRhcDogJ2RvdWJsZXRhcCcsXG4gIHByZXNzOiAncHJlc3MnLFxuICBwaW5jaDogJ3BpbmNoJyxcbiAgcGluY2hpbjogJ3BpbmNoJyxcbiAgcGluY2hvdXQ6ICdwaW5jaCcsXG4gIHBpbmNoc3RhcnQ6ICdwaW5jaCcsXG4gIHBpbmNobW92ZTogJ3BpbmNoJyxcbiAgcGluY2hlbmQ6ICdwaW5jaCcsXG4gIHBpbmNoY2FuY2VsOiAncGluY2gnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByb3RhdGVzdGFydDogJ3JvdGF0ZScsXG4gIHJvdGF0ZW1vdmU6ICdyb3RhdGUnLFxuICByb3RhdGVlbmQ6ICdyb3RhdGUnLFxuICByb3RhdGVjYW5jZWw6ICdyb3RhdGUnLFxuICB0cmlwYW46ICd0cmlwYW4nLFxuICB0cmlwYW5zdGFydDogJ3RyaXBhbicsXG4gIHRyaXBhbm1vdmU6ICd0cmlwYW4nLFxuICB0cmlwYW51cDogJ3RyaXBhbicsXG4gIHRyaXBhbmRvd246ICd0cmlwYW4nLFxuICB0cmlwYW5sZWZ0OiAndHJpcGFuJyxcbiAgdHJpcGFucmlnaHQ6ICd0cmlwYW4nLFxuICB0cmlwYW5lbmQ6ICd0cmlwYW4nLFxuICB0cmlwYW5jYW5jZWw6ICd0cmlwYW4nLFxuICBwYW46ICdwYW4nLFxuICBwYW5zdGFydDogJ3BhbicsXG4gIHBhbm1vdmU6ICdwYW4nLFxuICBwYW51cDogJ3BhbicsXG4gIHBhbmRvd246ICdwYW4nLFxuICBwYW5sZWZ0OiAncGFuJyxcbiAgcGFucmlnaHQ6ICdwYW4nLFxuICBwYW5lbmQ6ICdwYW4nLFxuICBwYW5jYW5jZWw6ICdwYW4nLFxuICBzd2lwZTogJ3N3aXBlJyxcbiAgc3dpcGVsZWZ0OiAnc3dpcGUnLFxuICBzd2lwZXJpZ2h0OiAnc3dpcGUnLFxuICBzd2lwZXVwOiAnc3dpcGUnLFxuICBzd2lwZWRvd246ICdzd2lwZSdcbn07XG5leHBvcnQgdmFyIEdFU1RVUkVfRVZFTlRfQUxJQVNFUyA9IHtcbiAgY2xpY2s6ICd0YXAnLFxuICBhbnljbGljazogJ2FueXRhcCcsXG4gIGRibGNsaWNrOiAnZG91YmxldGFwJyxcbiAgbW91c2Vkb3duOiAncG9pbnRlcmRvd24nLFxuICBtb3VzZW1vdmU6ICdwb2ludGVybW92ZScsXG4gIG1vdXNldXA6ICdwb2ludGVydXAnLFxuICBtb3VzZW92ZXI6ICdwb2ludGVyb3ZlcicsXG4gIG1vdXNlb3V0OiAncG9pbnRlcm91dCcsXG4gIG1vdXNlbGVhdmU6ICdwb2ludGVybGVhdmUnXG59OyIsImV4cG9ydCB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCA/IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSA6ICcnO1xudmFyIHdpbmRvd18gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbnZhciBnbG9iYWxfID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3c7XG52YXIgZG9jdW1lbnRfID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDoge307XG5leHBvcnQgeyB3aW5kb3dfIGFzIHdpbmRvdywgZ2xvYmFsXyBhcyBnbG9iYWwsIGRvY3VtZW50XyBhcyBkb2N1bWVudCB9O1xudmFyIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgZ2V0IHBhc3NpdmUoKSB7XG4gICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICB9O1xuICB3aW5kb3dfLmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgd2luZG93Xy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG59IGNhdGNoIChlcnIpIHt9XG5cbmV4cG9ydCB7IHBhc3NpdmVTdXBwb3J0ZWQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBJTlBVVF9FVkVOVF9UWVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB3aW5kb3csIHVzZXJBZ2VudCwgcGFzc2l2ZVN1cHBvcnRlZCB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xudmFyIGZpcmVmb3ggPSB1c2VyQWdlbnQuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMTtcbnZhciBXSEVFTF9FVkVOVFMgPSBJTlBVVF9FVkVOVF9UWVBFUy5XSEVFTF9FVkVOVFM7XG52YXIgRVZFTlRfVFlQRSA9ICd3aGVlbCc7XG52YXIgV0hFRUxfREVMVEFfTUFHSUNfU0NBTEVSID0gNC4wMDAyNDQxNDA2MjU7XG52YXIgV0hFRUxfREVMVEFfUEVSX0xJTkUgPSA0MDtcbnZhciBTSElGVF9NVUxUSVBMSUVSID0gMC4yNTtcblxudmFyIFdoZWVsSW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBXaGVlbElucHV0KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXaGVlbElucHV0KTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZW5hYmxlOiB0cnVlXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdGhpcy5ldmVudHMgPSBXSEVFTF9FVkVOVFMuY29uY2F0KG9wdGlvbnMuZXZlbnRzIHx8IFtdKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpcy5oYW5kbGVFdmVudCwgcGFzc2l2ZVN1cHBvcnRlZCA/IHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0gOiBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2hlZWxJbnB1dCwgW3tcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpczIuaGFuZGxlRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZUV2ZW50VHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudFR5cGUoZXZlbnRUeXBlLCBlbmFibGVkKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBFVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBlbmFibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gZXZlbnQuZGVsdGFZO1xuXG4gICAgICBpZiAod2luZG93LldoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKGZpcmVmb3ggJiYgZXZlbnQuZGVsdGFNb2RlID09PSB3aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUwpIHtcbiAgICAgICAgICB2YWx1ZSAvPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWx0YU1vZGUgPT09IHdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FKSB7XG4gICAgICAgICAgdmFsdWUgKj0gV0hFRUxfREVMVEFfUEVSX0xJTkU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHdoZWVsUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgIH07XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiB2YWx1ZSAlIFdIRUVMX0RFTFRBX01BR0lDX1NDQUxFUiA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUgLyBXSEVFTF9ERUxUQV9NQUdJQ19TQ0FMRVIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIFNISUZUX01VTFRJUExJRVI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uV2hlZWwoZXZlbnQsIC12YWx1ZSwgd2hlZWxQb3NpdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vbldoZWVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbldoZWVsKHNyY0V2ZW50LCBkZWx0YSwgcG9zaXRpb24pIHtcbiAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICB0eXBlOiBFVkVOVF9UWVBFLFxuICAgICAgICBjZW50ZXI6IHBvc2l0aW9uLFxuICAgICAgICBkZWx0YTogZGVsdGEsXG4gICAgICAgIHNyY0V2ZW50OiBzcmNFdmVudCxcbiAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgIHRhcmdldDogc3JjRXZlbnQudGFyZ2V0XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gV2hlZWxJbnB1dDtcbn0oKTtcblxuZXhwb3J0IHsgV2hlZWxJbnB1dCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgSU5QVVRfRVZFTlRfVFlQRVMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xudmFyIE1PVVNFX0VWRU5UUyA9IElOUFVUX0VWRU5UX1RZUEVTLk1PVVNFX0VWRU5UUztcbnZhciBNT1ZFX0VWRU5UX1RZUEUgPSAncG9pbnRlcm1vdmUnO1xudmFyIE9WRVJfRVZFTlRfVFlQRSA9ICdwb2ludGVyb3Zlcic7XG52YXIgT1VUX0VWRU5UX1RZUEUgPSAncG9pbnRlcm91dCc7XG52YXIgTEVBVkVfRVZFTlRfVFlQRSA9ICdwb2ludGVybGVhdmUnO1xuXG52YXIgTW92ZUlucHV0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTW92ZUlucHV0KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb3ZlSW5wdXQpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmVuYWJsZU1vdmVFdmVudCA9IHRoaXMub3B0aW9ucy5lbmFibGU7XG4gICAgdGhpcy5lbmFibGVMZWF2ZUV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmVuYWJsZU91dEV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmVuYWJsZU92ZXJFdmVudCA9IHRoaXMub3B0aW9ucy5lbmFibGU7XG4gICAgdGhpcy5ldmVudHMgPSBNT1VTRV9FVkVOVFMuY29uY2F0KG9wdGlvbnMuZXZlbnRzIHx8IFtdKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTW92ZUlucHV0LCBbe1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIF90aGlzMi5oYW5kbGVFdmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5hYmxlRXZlbnRUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50VHlwZShldmVudFR5cGUsIGVuYWJsZWQpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09IE1PVkVfRVZFTlRfVFlQRSkge1xuICAgICAgICB0aGlzLmVuYWJsZU1vdmVFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFR5cGUgPT09IE9WRVJfRVZFTlRfVFlQRSkge1xuICAgICAgICB0aGlzLmVuYWJsZU92ZXJFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFR5cGUgPT09IE9VVF9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlT3V0RXZlbnQgPSBlbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBMRUFWRV9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlTGVhdmVFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZU92ZXJFdmVudChldmVudCk7XG4gICAgICB0aGlzLmhhbmRsZU91dEV2ZW50KGV2ZW50KTtcbiAgICAgIHRoaXMuaGFuZGxlTGVhdmVFdmVudChldmVudCk7XG4gICAgICB0aGlzLmhhbmRsZU1vdmVFdmVudChldmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZU92ZXJFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVPdmVyRXZlbnQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZU92ZXJFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlb3ZlcicpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHR5cGU6IE9WRVJfRVZFTlRfVFlQRSxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVPdXRFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVPdXRFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlT3V0RXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHR5cGU6IE9VVF9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUxlYXZlRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlTGVhdmVFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlTGVhdmVFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgICB0eXBlOiBMRUFWRV9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZU1vdmVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVNb3ZlRXZlbnQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZU1vdmVFdmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA+PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICAgICAgICAgIGlmIChldmVudC53aGljaCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgdHlwZTogTU9WRV9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICBwb2ludGVyVHlwZTogJ21vdXNlJyxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1vdmVJbnB1dDtcbn0oKTtcblxuZXhwb3J0IHsgTW92ZUlucHV0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBJTlBVVF9FVkVOVF9UWVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG52YXIgS0VZX0VWRU5UUyA9IElOUFVUX0VWRU5UX1RZUEVTLktFWV9FVkVOVFM7XG52YXIgRE9XTl9FVkVOVF9UWVBFID0gJ2tleWRvd24nO1xudmFyIFVQX0VWRU5UX1RZUEUgPSAna2V5dXAnO1xuXG52YXIgS2V5SW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBLZXlJbnB1dChlbGVtZW50LCBjYWxsYmFjaykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgS2V5SW5wdXQpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmVuYWJsZURvd25FdmVudCA9IHRoaXMub3B0aW9ucy5lbmFibGU7XG4gICAgdGhpcy5lbmFibGVVcEV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmV2ZW50cyA9IEtFWV9FVkVOVFMuY29uY2F0KG9wdGlvbnMuZXZlbnRzIHx8IFtdKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIGVsZW1lbnQudGFiSW5kZXggPSBvcHRpb25zLnRhYkluZGV4IHx8IDA7XG4gICAgZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoS2V5SW5wdXQsIFt7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgX3RoaXMyLmhhbmRsZUV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmFibGVFdmVudFR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlRXZlbnRUeXBlKGV2ZW50VHlwZSwgZW5hYmxlZCkge1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gRE9XTl9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlRG93bkV2ZW50ID0gZW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gVVBfRVZFTlRfVFlQRSkge1xuICAgICAgICB0aGlzLmVuYWJsZVVwRXZlbnQgPSBlbmFibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgdmFyIHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcblxuICAgICAgaWYgKHRhcmdldEVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiB0YXJnZXRFbGVtZW50LnR5cGUgPT09ICd0ZXh0JyB8fCB0YXJnZXRFbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbmFibGVEb3duRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICAgIHR5cGU6IERPV05fRVZFTlRfVFlQRSxcbiAgICAgICAgICBzcmNFdmVudDogZXZlbnQsXG4gICAgICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVuYWJsZVVwRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICB0eXBlOiBVUF9FVkVOVF9UWVBFLFxuICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gS2V5SW5wdXQ7XG59KCk7XG5cbmV4cG9ydCB7IEtleUlucHV0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG52YXIgRVZFTlRfVFlQRSA9ICdjb250ZXh0bWVudSc7XG5cbnZhciBDb250ZXh0bWVudUlucHV0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29udGV4dG1lbnVJbnB1dChlbGVtZW50LCBjYWxsYmFjaykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb250ZXh0bWVudUlucHV0KTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZW5hYmxlOiB0cnVlXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVFdmVudCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29udGV4dG1lbnVJbnB1dCwgW3tcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZUV2ZW50VHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudFR5cGUoZXZlbnRUeXBlLCBlbmFibGVkKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBFVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBlbmFibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIHR5cGU6IEVWRU5UX1RZUEUsXG4gICAgICAgIGNlbnRlcjoge1xuICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgICB9LFxuICAgICAgICBzcmNFdmVudDogZXZlbnQsXG4gICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbnRleHRtZW51SW5wdXQ7XG59KCk7XG5cbmV4cG9ydCB7IENvbnRleHRtZW51SW5wdXQgYXMgZGVmYXVsdCB9OyIsInZhciBET1dOX0VWRU5UID0gMTtcbnZhciBNT1ZFX0VWRU5UID0gMjtcbnZhciBVUF9FVkVOVCA9IDQ7XG52YXIgTU9VU0VfRVZFTlRTID0ge1xuICBwb2ludGVyZG93bjogRE9XTl9FVkVOVCxcbiAgcG9pbnRlcm1vdmU6IE1PVkVfRVZFTlQsXG4gIHBvaW50ZXJ1cDogVVBfRVZFTlQsXG4gIG1vdXNlZG93bjogRE9XTl9FVkVOVCxcbiAgbW91c2Vtb3ZlOiBNT1ZFX0VWRU5ULFxuICBtb3VzZXVwOiBVUF9FVkVOVFxufTtcbnZhciBNT1VTRV9FVkVOVF9XSElDSF9MRUZUID0gMTtcbnZhciBNT1VTRV9FVkVOVF9XSElDSF9NSURETEUgPSAyO1xudmFyIE1PVVNFX0VWRU5UX1dISUNIX1JJR0hUID0gMztcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05fTEVGVCA9IDA7XG52YXIgTU9VU0VfRVZFTlRfQlVUVE9OX01JRERMRSA9IDE7XG52YXIgTU9VU0VfRVZFTlRfQlVUVE9OX1JJR0hUID0gMjtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05TX0xFRlRfTUFTSyA9IDE7XG52YXIgTU9VU0VfRVZFTlRfQlVUVE9OU19SSUdIVF9NQVNLID0gMjtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05TX01JRERMRV9NQVNLID0gNDtcbmV4cG9ydCBmdW5jdGlvbiB3aGljaEJ1dHRvbnMoZXZlbnQpIHtcbiAgdmFyIGV2ZW50VHlwZSA9IE1PVVNFX0VWRU5UU1tldmVudC5zcmNFdmVudC50eXBlXTtcblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIF9ldmVudCRzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50LFxuICAgICAgYnV0dG9ucyA9IF9ldmVudCRzcmNFdmVudC5idXR0b25zLFxuICAgICAgYnV0dG9uID0gX2V2ZW50JHNyY0V2ZW50LmJ1dHRvbixcbiAgICAgIHdoaWNoID0gX2V2ZW50JHNyY0V2ZW50LndoaWNoO1xuICB2YXIgbGVmdEJ1dHRvbiA9IGZhbHNlO1xuICB2YXIgbWlkZGxlQnV0dG9uID0gZmFsc2U7XG4gIHZhciByaWdodEJ1dHRvbiA9IGZhbHNlO1xuXG4gIGlmIChldmVudFR5cGUgPT09IFVQX0VWRU5UIHx8IGV2ZW50VHlwZSA9PT0gTU9WRV9FVkVOVCAmJiAhTnVtYmVyLmlzRmluaXRlKGJ1dHRvbnMpKSB7XG4gICAgbGVmdEJ1dHRvbiA9IHdoaWNoID09PSBNT1VTRV9FVkVOVF9XSElDSF9MRUZUO1xuICAgIG1pZGRsZUJ1dHRvbiA9IHdoaWNoID09PSBNT1VTRV9FVkVOVF9XSElDSF9NSURETEU7XG4gICAgcmlnaHRCdXR0b24gPSB3aGljaCA9PT0gTU9VU0VfRVZFTlRfV0hJQ0hfUklHSFQ7XG4gIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBNT1ZFX0VWRU5UKSB7XG4gICAgbGVmdEJ1dHRvbiA9IEJvb2xlYW4oYnV0dG9ucyAmIE1PVVNFX0VWRU5UX0JVVFRPTlNfTEVGVF9NQVNLKTtcbiAgICBtaWRkbGVCdXR0b24gPSBCb29sZWFuKGJ1dHRvbnMgJiBNT1VTRV9FVkVOVF9CVVRUT05TX01JRERMRV9NQVNLKTtcbiAgICByaWdodEJ1dHRvbiA9IEJvb2xlYW4oYnV0dG9ucyAmIE1PVVNFX0VWRU5UX0JVVFRPTlNfUklHSFRfTUFTSyk7XG4gIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBET1dOX0VWRU5UKSB7XG4gICAgbGVmdEJ1dHRvbiA9IGJ1dHRvbiA9PT0gTU9VU0VfRVZFTlRfQlVUVE9OX0xFRlQ7XG4gICAgbWlkZGxlQnV0dG9uID0gYnV0dG9uID09PSBNT1VTRV9FVkVOVF9CVVRUT05fTUlERExFO1xuICAgIHJpZ2h0QnV0dG9uID0gYnV0dG9uID09PSBNT1VTRV9FVkVOVF9CVVRUT05fUklHSFQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxlZnRCdXR0b246IGxlZnRCdXR0b24sXG4gICAgbWlkZGxlQnV0dG9uOiBtaWRkbGVCdXR0b24sXG4gICAgcmlnaHRCdXR0b246IHJpZ2h0QnV0dG9uXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T2Zmc2V0UG9zaXRpb24oZXZlbnQsIHJvb3RFbGVtZW50KSB7XG4gIHZhciBzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50O1xuXG4gIGlmICghZXZlbnQuY2VudGVyICYmICFOdW1iZXIuaXNGaW5pdGUoc3JjRXZlbnQuY2xpZW50WCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBjZW50ZXIgPSBldmVudC5jZW50ZXIgfHwge1xuICAgIHg6IHNyY0V2ZW50LmNsaWVudFgsXG4gICAgeTogc3JjRXZlbnQuY2xpZW50WVxuICB9O1xuICB2YXIgcmVjdCA9IHJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcmVjdC53aWR0aCAvIHJvb3RFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByZWN0LmhlaWdodCAvIHJvb3RFbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICB2YXIgb2Zmc2V0Q2VudGVyID0ge1xuICAgIHg6IChjZW50ZXIueCAtIHJlY3QubGVmdCAtIHJvb3RFbGVtZW50LmNsaWVudExlZnQpIC8gc2NhbGVYLFxuICAgIHk6IChjZW50ZXIueSAtIHJlY3QudG9wIC0gcm9vdEVsZW1lbnQuY2xpZW50VG9wKSAvIHNjYWxlWVxuICB9O1xuICByZXR1cm4ge1xuICAgIGNlbnRlcjogY2VudGVyLFxuICAgIG9mZnNldENlbnRlcjogb2Zmc2V0Q2VudGVyXG4gIH07XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgd2hpY2hCdXR0b25zLCBnZXRPZmZzZXRQb3NpdGlvbiB9IGZyb20gJy4vZXZlbnQtdXRpbHMnO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgc3JjRWxlbWVudDogJ3Jvb3QnLFxuICBwcmlvcml0eTogMFxufTtcblxudmFyIEV2ZW50UmVnaXN0cmFyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRSZWdpc3RyYXIoZXZlbnRNYW5hZ2VyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50UmVnaXN0cmFyKTtcblxuICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gZXZlbnRNYW5hZ2VyO1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB0aGlzLmhhbmRsZXJzQnlFbGVtZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRSZWdpc3RyYXIsIFt7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5fYWN0aXZlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHR5cGUsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHZhciBvbmNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgICAgIHZhciBwYXNzaXZlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBmYWxzZTtcbiAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMsXG4gICAgICAgICAgaGFuZGxlcnNCeUVsZW1lbnQgPSB0aGlzLmhhbmRsZXJzQnlFbGVtZW50O1xuXG4gICAgICBpZiAob3B0cyAmJiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnIHx8IG9wdHMuYWRkRXZlbnRMaXN0ZW5lcikpIHtcbiAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICBzcmNFbGVtZW50OiBvcHRzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG9wdHMgPSBvcHRzID8gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRzKSA6IERFRkFVTFRfT1BUSU9OUztcbiAgICAgIHZhciBlbnRyaWVzID0gaGFuZGxlcnNCeUVsZW1lbnQuZ2V0KG9wdHMuc3JjRWxlbWVudCk7XG5cbiAgICAgIGlmICghZW50cmllcykge1xuICAgICAgICBlbnRyaWVzID0gW107XG4gICAgICAgIGhhbmRsZXJzQnlFbGVtZW50LnNldChvcHRzLnNyY0VsZW1lbnQsIGVudHJpZXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICAgIHNyY0VsZW1lbnQ6IG9wdHMuc3JjRWxlbWVudCxcbiAgICAgICAgcHJpb3JpdHk6IG9wdHMucHJpb3JpdHlcbiAgICAgIH07XG5cbiAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgIGVudHJ5Lm9uY2UgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFzc2l2ZSkge1xuICAgICAgICBlbnRyeS5wYXNzaXZlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlcnMucHVzaChlbnRyeSk7XG4gICAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgIWVudHJ5LnBhc3NpdmU7XG4gICAgICB2YXIgaW5zZXJ0UG9zaXRpb24gPSBlbnRyaWVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChpbnNlcnRQb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgIGlmIChlbnRyaWVzW2luc2VydFBvc2l0aW9uXS5wcmlvcml0eSA+PSBlbnRyeS5wcmlvcml0eSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zZXJ0UG9zaXRpb24tLTtcbiAgICAgIH1cblxuICAgICAgZW50cmllcy5zcGxpY2UoaW5zZXJ0UG9zaXRpb24gKyAxLCAwLCBlbnRyeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUodHlwZSwgaGFuZGxlcikge1xuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycyxcbiAgICAgICAgICBoYW5kbGVyc0J5RWxlbWVudCA9IHRoaXMuaGFuZGxlcnNCeUVsZW1lbnQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSBoYW5kbGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgZW50cnkgPSBoYW5kbGVyc1tpXTtcblxuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gdHlwZSAmJiBlbnRyeS5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHZhciBlbnRyaWVzID0gaGFuZGxlcnNCeUVsZW1lbnQuZ2V0KGVudHJ5LnNyY0VsZW1lbnQpO1xuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGVudHJpZXMuaW5kZXhPZihlbnRyeSksIDEpO1xuXG4gICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoYW5kbGVyc0J5RWxlbWVudC5kZWxldGUoZW50cnkuc3JjRWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGhhbmRsZXJzLnNvbWUoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAhZW50cnkucGFzc2l2ZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1qb2xuaXJFdmVudCA9IHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2ZW50KTtcblxuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnNyY0V2ZW50LnRhcmdldDtcblxuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IG1qb2xuaXJFdmVudC5yb290RWxlbWVudCkge1xuICAgICAgICB0aGlzLl9lbWl0KG1qb2xuaXJFdmVudCwgdGFyZ2V0KTtcblxuICAgICAgICBpZiAobWpvbG5pckV2ZW50LmhhbmRsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZW1pdChtam9sbmlyRXZlbnQsICdyb290Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9lbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9lbWl0KGV2ZW50LCBzcmNFbGVtZW50KSB7XG4gICAgICB2YXIgZW50cmllcyA9IHRoaXMuaGFuZGxlcnNCeUVsZW1lbnQuZ2V0KHNyY0VsZW1lbnQpO1xuXG4gICAgICBpZiAoZW50cmllcykge1xuICAgICAgICB2YXIgaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICBldmVudC5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gZnVuY3Rpb24gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgIGV2ZW50LmhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgIGltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGVudHJpZXNUb1JlbW92ZSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBfZW50cmllcyRpID0gZW50cmllc1tpXSxcbiAgICAgICAgICAgICAgdHlwZSA9IF9lbnRyaWVzJGkudHlwZSxcbiAgICAgICAgICAgICAgaGFuZGxlciA9IF9lbnRyaWVzJGkuaGFuZGxlcixcbiAgICAgICAgICAgICAgb25jZSA9IF9lbnRyaWVzJGkub25jZTtcbiAgICAgICAgICBoYW5kbGVyKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBzdG9wUHJvcGFnYXRpb24sXG4gICAgICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvblxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyaWVzW2ldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBfZW50cmllc1RvUmVtb3ZlJF9pID0gZW50cmllc1RvUmVtb3ZlW19pXSxcbiAgICAgICAgICAgICAgX3R5cGUgPSBfZW50cmllc1RvUmVtb3ZlJF9pLnR5cGUsXG4gICAgICAgICAgICAgIF9oYW5kbGVyID0gX2VudHJpZXNUb1JlbW92ZSRfaS5oYW5kbGVyO1xuICAgICAgICAgIHRoaXMucmVtb3ZlKF90eXBlLCBfaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX25vcm1hbGl6ZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9ub3JtYWxpemVFdmVudChldmVudCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gdGhpcy5ldmVudE1hbmFnZXIuZWxlbWVudDtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBldmVudCwgd2hpY2hCdXR0b25zKGV2ZW50KSwgZ2V0T2Zmc2V0UG9zaXRpb24oZXZlbnQsIHJvb3RFbGVtZW50KSwge1xuICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgcm9vdEVsZW1lbnQ6IHJvb3RFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRSZWdpc3RyYXI7XG59KCk7XG5cbmV4cG9ydCB7IEV2ZW50UmVnaXN0cmFyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tICcuL3V0aWxzL2hhbW1lcic7XG5pbXBvcnQgV2hlZWxJbnB1dCBmcm9tICcuL2lucHV0cy93aGVlbC1pbnB1dCc7XG5pbXBvcnQgTW92ZUlucHV0IGZyb20gJy4vaW5wdXRzL21vdmUtaW5wdXQnO1xuaW1wb3J0IEtleUlucHV0IGZyb20gJy4vaW5wdXRzL2tleS1pbnB1dCc7XG5pbXBvcnQgQ29udGV4dG1lbnVJbnB1dCBmcm9tICcuL2lucHV0cy9jb250ZXh0bWVudS1pbnB1dCc7XG5pbXBvcnQgRXZlbnRSZWdpc3RyYXIgZnJvbSAnLi91dGlscy9ldmVudC1yZWdpc3RyYXInO1xuaW1wb3J0IHsgQkFTSUNfRVZFTlRfQUxJQVNFUywgRVZFTlRfUkVDT0dOSVpFUl9NQVAsIEdFU1RVUkVfRVZFTlRfQUxJQVNFUywgUkVDT0dOSVpFUlMsIFJFQ09HTklaRVJfQ09NUEFUSUJMRV9NQVAsIFJFQ09HTklaRVJfRkFMTEJBQ0tfTUFQIH0gZnJvbSAnLi9jb25zdGFudHMnO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgZXZlbnRzOiBudWxsLFxuICByZWNvZ25pemVyczogbnVsbCxcbiAgcmVjb2duaXplck9wdGlvbnM6IHt9LFxuICBNYW5hZ2VyOiBNYW5hZ2VyLFxuICB0b3VjaEFjdGlvbjogJ25vbmUnLFxuICB0YWJJbmRleDogMFxufTtcblxudmFyIEV2ZW50TWFuYWdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50TWFuYWdlcigpIHtcbiAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRNYW5hZ2VyKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb25CYXNpY0lucHV0ID0gdGhpcy5fb25CYXNpY0lucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25PdGhlckV2ZW50ID0gdGhpcy5fb25PdGhlckV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgIHZhciBldmVudHMgPSBvcHRpb25zLmV2ZW50cztcblxuICAgIGlmIChldmVudHMpIHtcbiAgICAgIHRoaXMub24oZXZlbnRzKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJzZXRFbGVtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgTWFuYWdlckNsYXNzID0gb3B0aW9ucy5NYW5hZ2VyO1xuICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IE1hbmFnZXJDbGFzcyhlbGVtZW50LCB7XG4gICAgICAgIHRvdWNoQWN0aW9uOiBvcHRpb25zLnRvdWNoQWN0aW9uLFxuICAgICAgICByZWNvZ25pemVyczogb3B0aW9ucy5yZWNvZ25pemVycyB8fCBSRUNPR05JWkVSU1xuICAgICAgfSkub24oJ2hhbW1lci5pbnB1dCcsIHRoaXMuX29uQmFzaWNJbnB1dCk7XG5cbiAgICAgIGlmICghb3B0aW9ucy5yZWNvZ25pemVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhSRUNPR05JWkVSX0NPTVBBVElCTEVfTUFQKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgdmFyIHJlY29nbml6ZXIgPSBfdGhpcy5tYW5hZ2VyLmdldChuYW1lKTtcblxuICAgICAgICAgIGlmIChyZWNvZ25pemVyKSB7XG4gICAgICAgICAgICBSRUNPR05JWkVSX0NPTVBBVElCTEVfTUFQW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKG90aGVyTmFtZSkge1xuICAgICAgICAgICAgICByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgob3RoZXJOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHJlY29nbml6ZXJOYW1lIGluIG9wdGlvbnMucmVjb2duaXplck9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHJlY29nbml6ZXIgPSB0aGlzLm1hbmFnZXIuZ2V0KHJlY29nbml6ZXJOYW1lKTtcblxuICAgICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICAgIHZhciByZWNvZ25pemVyT3B0aW9uID0gb3B0aW9ucy5yZWNvZ25pemVyT3B0aW9uc1tyZWNvZ25pemVyTmFtZV07XG4gICAgICAgICAgZGVsZXRlIHJlY29nbml6ZXJPcHRpb24uZW5hYmxlO1xuICAgICAgICAgIHJlY29nbml6ZXIuc2V0KHJlY29nbml6ZXJPcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2hlZWxJbnB1dCA9IG5ldyBXaGVlbElucHV0KGVsZW1lbnQsIHRoaXMuX29uT3RoZXJFdmVudCwge1xuICAgICAgICBlbmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMubW92ZUlucHV0ID0gbmV3IE1vdmVJbnB1dChlbGVtZW50LCB0aGlzLl9vbk90aGVyRXZlbnQsIHtcbiAgICAgICAgZW5hYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLmtleUlucHV0ID0gbmV3IEtleUlucHV0KGVsZW1lbnQsIHRoaXMuX29uT3RoZXJFdmVudCwge1xuICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICB0YWJJbmRleDogb3B0aW9ucy50YWJJbmRleFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbnRleHRtZW51SW5wdXQgPSBuZXcgQ29udGV4dG1lbnVJbnB1dChlbGVtZW50LCB0aGlzLl9vbk90aGVyRXZlbnQsIHtcbiAgICAgICAgZW5hYmxlOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmV2ZW50cyksXG4gICAgICAgICAgX3N0ZXA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIF9zdGVwJHZhbHVlID0gX3NsaWNlZFRvQXJyYXkoX3N0ZXAudmFsdWUsIDIpLFxuICAgICAgICAgICAgICBldmVudEFsaWFzID0gX3N0ZXAkdmFsdWVbMF0sXG4gICAgICAgICAgICAgIGV2ZW50UmVnaXN0cmFyID0gX3N0ZXAkdmFsdWVbMV07XG5cbiAgICAgICAgICBpZiAoIWV2ZW50UmVnaXN0cmFyLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlUmVjb2duaXplcihldmVudFJlZ2lzdHJhci5yZWNvZ25pemVyTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5vbihldmVudEFsaWFzLCBldmVudFJlZ2lzdHJhci5oYW5kbGVFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy53aGVlbElucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3ZlSW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmtleUlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb250ZXh0bWVudUlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy53aGVlbElucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3ZlSW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLmtleUlucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb250ZXh0bWVudUlucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHRoaXMuX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgZmFsc2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHRoaXMuX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdhdGNoKGV2ZW50LCBoYW5kbGVyLCBvcHRzKSB7XG4gICAgICB0aGlzLl9hZGRFdmVudEhhbmRsZXIoZXZlbnQsIGhhbmRsZXIsIG9wdHMsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib2ZmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9mZihldmVudCwgaGFuZGxlcikge1xuICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRIYW5kbGVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3RvZ2dsZVJlY29nbml6ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3RvZ2dsZVJlY29nbml6ZXIobmFtZSwgZW5hYmxlZCkge1xuICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7XG5cbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvZ25pemVyID0gbWFuYWdlci5nZXQobmFtZSk7XG5cbiAgICAgIGlmIChyZWNvZ25pemVyICYmIHJlY29nbml6ZXIub3B0aW9ucy5lbmFibGUgIT09IGVuYWJsZWQpIHtcbiAgICAgICAgcmVjb2duaXplci5zZXQoe1xuICAgICAgICAgIGVuYWJsZTogZW5hYmxlZFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGZhbGxiYWNrUmVjb2duaXplcnMgPSBSRUNPR05JWkVSX0ZBTExCQUNLX01BUFtuYW1lXTtcblxuICAgICAgICBpZiAoZmFsbGJhY2tSZWNvZ25pemVycyAmJiAhdGhpcy5vcHRpb25zLnJlY29nbml6ZXJzKSB7XG4gICAgICAgICAgZmFsbGJhY2tSZWNvZ25pemVycy5mb3JFYWNoKGZ1bmN0aW9uIChvdGhlck5hbWUpIHtcbiAgICAgICAgICAgIHZhciBvdGhlclJlY29nbml6ZXIgPSBtYW5hZ2VyLmdldChvdGhlck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICBvdGhlclJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUobmFtZSk7XG4gICAgICAgICAgICAgIHJlY29nbml6ZXIuZHJvcFJlcXVpcmVGYWlsdXJlKG90aGVyTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdGhlclJlY29nbml6ZXIuZHJvcFJlcXVpcmVGYWlsdXJlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2hlZWxJbnB1dC5lbmFibGVFdmVudFR5cGUobmFtZSwgZW5hYmxlZCk7XG4gICAgICB0aGlzLm1vdmVJbnB1dC5lbmFibGVFdmVudFR5cGUobmFtZSwgZW5hYmxlZCk7XG4gICAgICB0aGlzLmtleUlucHV0LmVuYWJsZUV2ZW50VHlwZShuYW1lLCBlbmFibGVkKTtcbiAgICAgIHRoaXMuY29udGV4dG1lbnVJbnB1dC5lbmFibGVFdmVudFR5cGUobmFtZSwgZW5hYmxlZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9hZGRFdmVudEhhbmRsZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgb25jZSwgcGFzc2l2ZSkge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3B0cyA9IGhhbmRsZXI7XG5cbiAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5fYWRkRXZlbnRIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRbZXZlbnROYW1lXSwgb3B0cywgb25jZSwgcGFzc2l2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBtYW5hZ2VyID0gdGhpcy5tYW5hZ2VyLFxuICAgICAgICAgIGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgICAgdmFyIGV2ZW50QWxpYXMgPSBHRVNUVVJFX0VWRU5UX0FMSUFTRVNbZXZlbnRdIHx8IGV2ZW50O1xuICAgICAgdmFyIGV2ZW50UmVnaXN0cmFyID0gZXZlbnRzLmdldChldmVudEFsaWFzKTtcblxuICAgICAgaWYgKCFldmVudFJlZ2lzdHJhcikge1xuICAgICAgICBldmVudFJlZ2lzdHJhciA9IG5ldyBFdmVudFJlZ2lzdHJhcih0aGlzKTtcbiAgICAgICAgZXZlbnRzLnNldChldmVudEFsaWFzLCBldmVudFJlZ2lzdHJhcik7XG4gICAgICAgIGV2ZW50UmVnaXN0cmFyLnJlY29nbml6ZXJOYW1lID0gRVZFTlRfUkVDT0dOSVpFUl9NQVBbZXZlbnRBbGlhc10gfHwgZXZlbnRBbGlhcztcblxuICAgICAgICBpZiAobWFuYWdlcikge1xuICAgICAgICAgIG1hbmFnZXIub24oZXZlbnRBbGlhcywgZXZlbnRSZWdpc3RyYXIuaGFuZGxlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50UmVnaXN0cmFyLmFkZChldmVudCwgaGFuZGxlciwgb3B0cywgb25jZSwgcGFzc2l2ZSk7XG5cbiAgICAgIGlmICghZXZlbnRSZWdpc3RyYXIuaXNFbXB0eSgpKSB7XG4gICAgICAgIHRoaXMuX3RvZ2dsZVJlY29nbml6ZXIoZXZlbnRSZWdpc3RyYXIucmVjb2duaXplck5hbWUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcmVtb3ZlRXZlbnRIYW5kbGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW1vdmVFdmVudEhhbmRsZXIoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudCkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUV2ZW50SGFuZGxlcihldmVudE5hbWUsIGV2ZW50W2V2ZW50TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgICB2YXIgZXZlbnRBbGlhcyA9IEdFU1RVUkVfRVZFTlRfQUxJQVNFU1tldmVudF0gfHwgZXZlbnQ7XG4gICAgICB2YXIgZXZlbnRSZWdpc3RyYXIgPSBldmVudHMuZ2V0KGV2ZW50QWxpYXMpO1xuXG4gICAgICBpZiAoIWV2ZW50UmVnaXN0cmFyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnRSZWdpc3RyYXIucmVtb3ZlKGV2ZW50LCBoYW5kbGVyKTtcblxuICAgICAgaWYgKGV2ZW50UmVnaXN0cmFyLmlzRW1wdHkoKSkge1xuICAgICAgICB2YXIgcmVjb2duaXplck5hbWUgPSBldmVudFJlZ2lzdHJhci5yZWNvZ25pemVyTmFtZTtcbiAgICAgICAgdmFyIGlzUmVjb2duaXplclVzZWQgPSBmYWxzZTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGV2ZW50cy52YWx1ZXMoKSksXG4gICAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGVoID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZWgucmVjb2duaXplck5hbWUgPT09IHJlY29nbml6ZXJOYW1lICYmICFlaC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgaXNSZWNvZ25pemVyVXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzUmVjb2duaXplclVzZWQpIHtcbiAgICAgICAgICB0aGlzLl90b2dnbGVSZWNvZ25pemVyKHJlY29nbml6ZXJOYW1lLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uQmFzaWNJbnB1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25CYXNpY0lucHV0KGV2ZW50KSB7XG4gICAgICB2YXIgc3JjRXZlbnQgPSBldmVudC5zcmNFdmVudDtcbiAgICAgIHZhciBhbGlhcyA9IEJBU0lDX0VWRU5UX0FMSUFTRVNbc3JjRXZlbnQudHlwZV07XG5cbiAgICAgIGlmIChhbGlhcykge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdChhbGlhcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25PdGhlckV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbk90aGVyRXZlbnQoZXZlbnQpIHtcbiAgICAgIHRoaXMubWFuYWdlci5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRNYW5hZ2VyO1xufSgpO1xuXG5leHBvcnQgeyBFdmVudE1hbmFnZXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgTWFwU3RhdGUgZnJvbSAnLi9tYXAtc3RhdGUnO1xuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhdG9yIH0gZnJvbSAnLi90cmFuc2l0aW9uJztcbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciwgeyBUUkFOU0lUSU9OX0VWRU5UUyB9IGZyb20gJy4vdHJhbnNpdGlvbi1tYW5hZ2VyJztcbnZhciBOT19UUkFOU0lUSU9OX1BST1BTID0ge1xuICB0cmFuc2l0aW9uRHVyYXRpb246IDBcbn07XG5leHBvcnQgdmFyIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTID0ge1xuICB0cmFuc2l0aW9uRHVyYXRpb246IDMwMCxcbiAgdHJhbnNpdGlvbkVhc2luZzogZnVuY3Rpb24gdHJhbnNpdGlvbkVhc2luZyh0KSB7XG4gICAgcmV0dXJuIHQ7XG4gIH0sXG4gIHRyYW5zaXRpb25JbnRlcnBvbGF0b3I6IG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSxcbiAgdHJhbnNpdGlvbkludGVycnVwdGlvbjogVFJBTlNJVElPTl9FVkVOVFMuQlJFQUtcbn07XG52YXIgREVGQVVMVF9JTkVSVElBID0gMzAwO1xuXG52YXIgSU5FUlRJQV9FQVNJTkcgPSBmdW5jdGlvbiBJTkVSVElBX0VBU0lORyh0KSB7XG4gIHJldHVybiAxIC0gKDEgLSB0KSAqICgxIC0gdCk7XG59O1xuXG52YXIgRVZFTlRfVFlQRVMgPSB7XG4gIFdIRUVMOiBbJ3doZWVsJ10sXG4gIFBBTjogWydwYW5zdGFydCcsICdwYW5tb3ZlJywgJ3BhbmVuZCddLFxuICBQSU5DSDogWydwaW5jaHN0YXJ0JywgJ3BpbmNobW92ZScsICdwaW5jaGVuZCddLFxuICBUUklQTEVfUEFOOiBbJ3RyaXBhbnN0YXJ0JywgJ3RyaXBhbm1vdmUnLCAndHJpcGFuZW5kJ10sXG4gIERPVUJMRV9UQVA6IFsnZG91YmxldGFwJ10sXG4gIEtFWUJPQVJEOiBbJ2tleWRvd24nXVxufTtcblxudmFyIE1hcENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcENvbnRyb2xsZXIoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXBDb250cm9sbGVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImV2ZW50c1wiLCBbXSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzY3JvbGxab29tXCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZHJhZ1BhblwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRyYWdSb3RhdGVcIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkb3VibGVDbGlja1pvb21cIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0b3VjaFpvb21cIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0b3VjaFJvdGF0ZVwiLCBmYWxzZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJrZXlib2FyZFwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9pbnRlcmFjdGlvblN0YXRlXCIsIHtcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfZXZlbnRzXCIsIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9zZXRJbnRlcmFjdGlvblN0YXRlXCIsIGZ1bmN0aW9uIChuZXdTdGF0ZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5faW50ZXJhY3Rpb25TdGF0ZSwgbmV3U3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMub25TdGF0ZUNoYW5nZSkge1xuICAgICAgICBfdGhpcy5vblN0YXRlQ2hhbmdlKF90aGlzLl9pbnRlcmFjdGlvblN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9vblRyYW5zaXRpb25cIiwgZnVuY3Rpb24gKG5ld1ZpZXdwb3J0LCBvbGRWaWV3cG9ydCkge1xuICAgICAgX3RoaXMub25WaWV3cG9ydENoYW5nZShuZXdWaWV3cG9ydCwgX3RoaXMuX2ludGVyYWN0aW9uU3RhdGUsIG9sZFZpZXdwb3J0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fdHJhbnNpdGlvbk1hbmFnZXIgPSBuZXcgVHJhbnNpdGlvbk1hbmFnZXIoe1xuICAgICAgb25WaWV3cG9ydENoYW5nZTogdGhpcy5fb25UcmFuc2l0aW9uLFxuICAgICAgb25TdGF0ZUNoYW5nZTogdGhpcy5fc2V0SW50ZXJhY3Rpb25TdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcENvbnRyb2xsZXIsIFt7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICB0aGlzLm1hcFN0YXRlID0gdGhpcy5nZXRNYXBTdGF0ZSgpO1xuICAgICAgdmFyIGV2ZW50U3RhcnRCbG9ja2VkID0gdGhpcy5fZXZlbnRTdGFydEJsb2NrZWQ7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdwYW5zdGFydCc6XG4gICAgICAgICAgcmV0dXJuIGV2ZW50U3RhcnRCbG9ja2VkID8gZmFsc2UgOiB0aGlzLl9vblBhblN0YXJ0KGV2ZW50KTtcblxuICAgICAgICBjYXNlICdwYW5tb3ZlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25QYW4oZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3BhbmVuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uUGFuRW5kKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdwaW5jaHN0YXJ0JzpcbiAgICAgICAgICByZXR1cm4gZXZlbnRTdGFydEJsb2NrZWQgPyBmYWxzZSA6IHRoaXMuX29uUGluY2hTdGFydChldmVudCk7XG5cbiAgICAgICAgY2FzZSAncGluY2htb3ZlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25QaW5jaChldmVudCk7XG5cbiAgICAgICAgY2FzZSAncGluY2hlbmQnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vblBpbmNoRW5kKGV2ZW50KTtcblxuICAgICAgICBjYXNlICd0cmlwYW5zdGFydCc6XG4gICAgICAgICAgcmV0dXJuIGV2ZW50U3RhcnRCbG9ja2VkID8gZmFsc2UgOiB0aGlzLl9vblRyaXBsZVBhblN0YXJ0KGV2ZW50KTtcblxuICAgICAgICBjYXNlICd0cmlwYW5tb3ZlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25UcmlwbGVQYW4oZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3RyaXBhbmVuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uVHJpcGxlUGFuRW5kKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdkb3VibGV0YXAnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vbkRvdWJsZVRhcChldmVudCk7XG5cbiAgICAgICAgY2FzZSAnd2hlZWwnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vbldoZWVsKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25LZXlEb3duKGV2ZW50KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2VudGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENlbnRlcihldmVudCkge1xuICAgICAgdmFyIF9ldmVudCRvZmZzZXRDZW50ZXIgPSBldmVudC5vZmZzZXRDZW50ZXIsXG4gICAgICAgICAgeCA9IF9ldmVudCRvZmZzZXRDZW50ZXIueCxcbiAgICAgICAgICB5ID0gX2V2ZW50JG9mZnNldENlbnRlci55O1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNGdW5jdGlvbktleVByZXNzZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNGdW5jdGlvbktleVByZXNzZWQoZXZlbnQpIHtcbiAgICAgIHZhciBzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50O1xuICAgICAgcmV0dXJuIEJvb2xlYW4oc3JjRXZlbnQubWV0YUtleSB8fCBzcmNFdmVudC5hbHRLZXkgfHwgc3JjRXZlbnQuY3RybEtleSB8fCBzcmNFdmVudC5zaGlmdEtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJsb2NrRXZlbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsb2NrRXZlbnRzKHRpbWVvdXQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMi5fZXZlbnRTdGFydEJsb2NrZWQgPT09IHRpbWVyKSB7XG4gICAgICAgICAgX3RoaXMyLl9ldmVudFN0YXJ0QmxvY2tlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgdGhpcy5fZXZlbnRTdGFydEJsb2NrZWQgPSB0aW1lcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlVmlld3BvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIGV4dHJhUHJvcHMsIGludGVyYWN0aW9uU3RhdGUpIHtcbiAgICAgIHZhciBvbGRWaWV3cG9ydCA9IHRoaXMubWFwU3RhdGUgaW5zdGFuY2VvZiBNYXBTdGF0ZSA/IHRoaXMubWFwU3RhdGUuZ2V0Vmlld3BvcnRQcm9wcygpIDogdGhpcy5tYXBTdGF0ZTtcblxuICAgICAgdmFyIG5ld1ZpZXdwb3J0ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBuZXdNYXBTdGF0ZS5nZXRWaWV3cG9ydFByb3BzKCkpLCBleHRyYVByb3BzKTtcblxuICAgICAgdmFyIHZpZXdTdGF0ZUNoYW5nZWQgPSBPYmplY3Qua2V5cyhuZXdWaWV3cG9ydCkuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBvbGRWaWV3cG9ydFtrZXldICE9PSBuZXdWaWV3cG9ydFtrZXldO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zdGF0ZSA9IG5ld01hcFN0YXRlLmdldFN0YXRlKCk7XG5cbiAgICAgIHRoaXMuX3NldEludGVyYWN0aW9uU3RhdGUoaW50ZXJhY3Rpb25TdGF0ZSk7XG5cbiAgICAgIGlmICh2aWV3U3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMub25WaWV3cG9ydENoYW5nZShuZXdWaWV3cG9ydCwgdGhpcy5faW50ZXJhY3Rpb25TdGF0ZSwgb2xkVmlld3BvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXBTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXBTdGF0ZShvdmVycmlkZXMpIHtcbiAgICAgIHJldHVybiBuZXcgTWFwU3RhdGUoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMubWFwU3RhdGVQcm9wcyksIHRoaXMuX3N0YXRlKSwgb3ZlcnJpZGVzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRHJhZ2dpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNEcmFnZ2luZygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGlvblN0YXRlLmlzRHJhZ2dpbmc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE9wdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICB2YXIgb25WaWV3cG9ydENoYW5nZSA9IG9wdGlvbnMub25WaWV3cG9ydENoYW5nZSxcbiAgICAgICAgICBvblN0YXRlQ2hhbmdlID0gb3B0aW9ucy5vblN0YXRlQ2hhbmdlLFxuICAgICAgICAgIF9vcHRpb25zJGV2ZW50TWFuYWdlciA9IG9wdGlvbnMuZXZlbnRNYW5hZ2VyLFxuICAgICAgICAgIGV2ZW50TWFuYWdlciA9IF9vcHRpb25zJGV2ZW50TWFuYWdlciA9PT0gdm9pZCAwID8gdGhpcy5ldmVudE1hbmFnZXIgOiBfb3B0aW9ucyRldmVudE1hbmFnZXIsXG4gICAgICAgICAgX29wdGlvbnMkaXNJbnRlcmFjdGl2ID0gb3B0aW9ucy5pc0ludGVyYWN0aXZlLFxuICAgICAgICAgIGlzSW50ZXJhY3RpdmUgPSBfb3B0aW9ucyRpc0ludGVyYWN0aXYgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRpc0ludGVyYWN0aXYsXG4gICAgICAgICAgX29wdGlvbnMkc2Nyb2xsWm9vbSA9IG9wdGlvbnMuc2Nyb2xsWm9vbSxcbiAgICAgICAgICBzY3JvbGxab29tID0gX29wdGlvbnMkc2Nyb2xsWm9vbSA9PT0gdm9pZCAwID8gdGhpcy5zY3JvbGxab29tIDogX29wdGlvbnMkc2Nyb2xsWm9vbSxcbiAgICAgICAgICBfb3B0aW9ucyRkcmFnUGFuID0gb3B0aW9ucy5kcmFnUGFuLFxuICAgICAgICAgIGRyYWdQYW4gPSBfb3B0aW9ucyRkcmFnUGFuID09PSB2b2lkIDAgPyB0aGlzLmRyYWdQYW4gOiBfb3B0aW9ucyRkcmFnUGFuLFxuICAgICAgICAgIF9vcHRpb25zJGRyYWdSb3RhdGUgPSBvcHRpb25zLmRyYWdSb3RhdGUsXG4gICAgICAgICAgZHJhZ1JvdGF0ZSA9IF9vcHRpb25zJGRyYWdSb3RhdGUgPT09IHZvaWQgMCA/IHRoaXMuZHJhZ1JvdGF0ZSA6IF9vcHRpb25zJGRyYWdSb3RhdGUsXG4gICAgICAgICAgX29wdGlvbnMkZG91YmxlQ2xpY2taID0gb3B0aW9ucy5kb3VibGVDbGlja1pvb20sXG4gICAgICAgICAgZG91YmxlQ2xpY2tab29tID0gX29wdGlvbnMkZG91YmxlQ2xpY2taID09PSB2b2lkIDAgPyB0aGlzLmRvdWJsZUNsaWNrWm9vbSA6IF9vcHRpb25zJGRvdWJsZUNsaWNrWixcbiAgICAgICAgICBfb3B0aW9ucyR0b3VjaFpvb20gPSBvcHRpb25zLnRvdWNoWm9vbSxcbiAgICAgICAgICB0b3VjaFpvb20gPSBfb3B0aW9ucyR0b3VjaFpvb20gPT09IHZvaWQgMCA/IHRoaXMudG91Y2hab29tIDogX29wdGlvbnMkdG91Y2hab29tLFxuICAgICAgICAgIF9vcHRpb25zJHRvdWNoUm90YXRlID0gb3B0aW9ucy50b3VjaFJvdGF0ZSxcbiAgICAgICAgICB0b3VjaFJvdGF0ZSA9IF9vcHRpb25zJHRvdWNoUm90YXRlID09PSB2b2lkIDAgPyB0aGlzLnRvdWNoUm90YXRlIDogX29wdGlvbnMkdG91Y2hSb3RhdGUsXG4gICAgICAgICAgX29wdGlvbnMka2V5Ym9hcmQgPSBvcHRpb25zLmtleWJvYXJkLFxuICAgICAgICAgIGtleWJvYXJkID0gX29wdGlvbnMka2V5Ym9hcmQgPT09IHZvaWQgMCA/IHRoaXMua2V5Ym9hcmQgOiBfb3B0aW9ucyRrZXlib2FyZDtcbiAgICAgIHRoaXMub25WaWV3cG9ydENoYW5nZSA9IG9uVmlld3BvcnRDaGFuZ2U7XG4gICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UgPSBvblN0YXRlQ2hhbmdlO1xuICAgICAgdmFyIHByZXZPcHRpb25zID0gdGhpcy5tYXBTdGF0ZVByb3BzIHx8IHt9O1xuICAgICAgdmFyIGRpbWVuc2lvbkNoYW5nZWQgPSBwcmV2T3B0aW9ucy5oZWlnaHQgIT09IG9wdGlvbnMuaGVpZ2h0IHx8IHByZXZPcHRpb25zLndpZHRoICE9PSBvcHRpb25zLndpZHRoO1xuICAgICAgdGhpcy5tYXBTdGF0ZVByb3BzID0gb3B0aW9ucztcblxuICAgICAgaWYgKGRpbWVuc2lvbkNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5tYXBTdGF0ZSA9IHByZXZPcHRpb25zO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ldyBNYXBTdGF0ZShvcHRpb25zKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyYW5zaXRpb25NYW5hZ2VyLnByb2Nlc3NWaWV3cG9ydENoYW5nZShvcHRpb25zKTtcblxuICAgICAgaWYgKHRoaXMuZXZlbnRNYW5hZ2VyICE9PSBldmVudE1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgICAgICB0aGlzLnRvZ2dsZUV2ZW50cyh0aGlzLmV2ZW50cywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9nZ2xlRXZlbnRzKEVWRU5UX1RZUEVTLldIRUVMLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oc2Nyb2xsWm9vbSkpO1xuICAgICAgdGhpcy50b2dnbGVFdmVudHMoRVZFTlRfVFlQRVMuUEFOLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oZHJhZ1BhbiB8fCBkcmFnUm90YXRlKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5QSU5DSCwgaXNJbnRlcmFjdGl2ZSAmJiBCb29sZWFuKHRvdWNoWm9vbSB8fCB0b3VjaFJvdGF0ZSkpO1xuICAgICAgdGhpcy50b2dnbGVFdmVudHMoRVZFTlRfVFlQRVMuVFJJUExFX1BBTiwgaXNJbnRlcmFjdGl2ZSAmJiBCb29sZWFuKHRvdWNoUm90YXRlKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5ET1VCTEVfVEFQLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oZG91YmxlQ2xpY2tab29tKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5LRVlCT0FSRCwgaXNJbnRlcmFjdGl2ZSAmJiBCb29sZWFuKGtleWJvYXJkKSk7XG4gICAgICB0aGlzLnNjcm9sbFpvb20gPSBzY3JvbGxab29tO1xuICAgICAgdGhpcy5kcmFnUGFuID0gZHJhZ1BhbjtcbiAgICAgIHRoaXMuZHJhZ1JvdGF0ZSA9IGRyYWdSb3RhdGU7XG4gICAgICB0aGlzLmRvdWJsZUNsaWNrWm9vbSA9IGRvdWJsZUNsaWNrWm9vbTtcbiAgICAgIHRoaXMudG91Y2hab29tID0gdG91Y2hab29tO1xuICAgICAgdGhpcy50b3VjaFJvdGF0ZSA9IHRvdWNoUm90YXRlO1xuICAgICAgdGhpcy5rZXlib2FyZCA9IGtleWJvYXJkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b2dnbGVFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9nZ2xlRXZlbnRzKGV2ZW50TmFtZXMsIGVuYWJsZWQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5ldmVudE1hbmFnZXIpIHtcbiAgICAgICAgZXZlbnROYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICBpZiAoX3RoaXMzLl9ldmVudHNbZXZlbnROYW1lXSAhPT0gZW5hYmxlZCkge1xuICAgICAgICAgICAgX3RoaXMzLl9ldmVudHNbZXZlbnROYW1lXSA9IGVuYWJsZWQ7XG5cbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgIF90aGlzMy5ldmVudE1hbmFnZXIub24oZXZlbnROYW1lLCBfdGhpczMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMzLmV2ZW50TWFuYWdlci5vZmYoZXZlbnROYW1lLCBfdGhpczMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhblN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBhblN0YXJ0KGV2ZW50KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdGhpcy5fcGFuUm90YXRlID0gdGhpcy5pc0Z1bmN0aW9uS2V5UHJlc3NlZChldmVudCkgfHwgZXZlbnQucmlnaHRCdXR0b247XG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLl9wYW5Sb3RhdGUgPyB0aGlzLm1hcFN0YXRlLnJvdGF0ZVN0YXJ0KHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pIDogdGhpcy5tYXBTdGF0ZS5wYW5TdGFydCh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBhbihldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9wYW5Sb3RhdGUgPyB0aGlzLl9vblBhblJvdGF0ZShldmVudCkgOiB0aGlzLl9vblBhbk1vdmUoZXZlbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QYW5FbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuRW5kKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3BhblJvdGF0ZSA/IHRoaXMuX29uUGFuUm90YXRlRW5kKGV2ZW50KSA6IHRoaXMuX29uUGFuTW92ZUVuZChldmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhbk1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuTW92ZShldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmRyYWdQYW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW4oe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzUGFubmluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuTW92ZUVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5Nb3ZlRW5kKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5kcmFnUGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyRkcmFnUGFuJGluZXJ0aWEgPSB0aGlzLmRyYWdQYW4uaW5lcnRpYSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSBfdGhpcyRkcmFnUGFuJGluZXJ0aWEgPT09IHZvaWQgMCA/IERFRkFVTFRfSU5FUlRJQSA6IF90aGlzJGRyYWdQYW4kaW5lcnRpYTtcblxuICAgICAgICBpZiAoaW5lcnRpYSAmJiBldmVudC52ZWxvY2l0eSkge1xuICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICAgICAgdmFyIGVuZFBvcyA9IFtwb3NbMF0gKyBldmVudC52ZWxvY2l0eVggKiBpbmVydGlhIC8gMiwgcG9zWzFdICsgZXZlbnQudmVsb2NpdHlZICogaW5lcnRpYSAvIDJdO1xuICAgICAgICAgIHZhciBuZXdDb250cm9sbGVyU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbih7XG4gICAgICAgICAgICBwb3M6IGVuZFBvc1xuICAgICAgICAgIH0pLnBhbkVuZCgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3Q29udHJvbGxlclN0YXRlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTKSwge30sIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogaW5lcnRpYSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25FYXNpbmc6IElORVJUSUFfRUFTSU5HXG4gICAgICAgICAgfSksIHtcbiAgICAgICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaXNQYW5uaW5nOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW5FbmQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIG51bGwsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIGlzUGFubmluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhblJvdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5Sb3RhdGUoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5kcmFnUm90YXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucm90YXRlKHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgTk9fVFJBTlNJVElPTl9QUk9QUywge1xuICAgICAgICBpc1JvdGF0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QYW5Sb3RhdGVFbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuUm90YXRlRW5kKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5kcmFnUm90YXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyRkcmFnUm90YXRlJGluZXIgPSB0aGlzLmRyYWdSb3RhdGUuaW5lcnRpYSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSBfdGhpcyRkcmFnUm90YXRlJGluZXIgPT09IHZvaWQgMCA/IERFRkFVTFRfSU5FUlRJQSA6IF90aGlzJGRyYWdSb3RhdGUkaW5lcjtcblxuICAgICAgICBpZiAoaW5lcnRpYSAmJiBldmVudC52ZWxvY2l0eSkge1xuICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICAgICAgdmFyIGVuZFBvcyA9IFtwb3NbMF0gKyBldmVudC52ZWxvY2l0eVggKiBpbmVydGlhIC8gMiwgcG9zWzFdICsgZXZlbnQudmVsb2NpdHlZICogaW5lcnRpYSAvIDJdO1xuICAgICAgICAgIHZhciBuZXdDb250cm9sbGVyU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZSh7XG4gICAgICAgICAgICBwb3M6IGVuZFBvc1xuICAgICAgICAgIH0pLnJvdGF0ZUVuZCgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3Q29udHJvbGxlclN0YXRlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTKSwge30sIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogaW5lcnRpYSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25FYXNpbmc6IElORVJUSUFfRUFTSU5HXG4gICAgICAgICAgfSksIHtcbiAgICAgICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaXNSb3RhdGluZzogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuRW5kKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBudWxsLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uV2hlZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uV2hlZWwoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5zY3JvbGxab29tKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJHNjcm9sbFpvb20gPSB0aGlzLnNjcm9sbFpvb20sXG4gICAgICAgICAgX3RoaXMkc2Nyb2xsWm9vbSRzcGVlID0gX3RoaXMkc2Nyb2xsWm9vbS5zcGVlZCxcbiAgICAgICAgICBzcGVlZCA9IF90aGlzJHNjcm9sbFpvb20kc3BlZSA9PT0gdm9pZCAwID8gMC4wMSA6IF90aGlzJHNjcm9sbFpvb20kc3BlZSxcbiAgICAgICAgICBfdGhpcyRzY3JvbGxab29tJHNtb28gPSBfdGhpcyRzY3JvbGxab29tLnNtb290aCxcbiAgICAgICAgICBzbW9vdGggPSBfdGhpcyRzY3JvbGxab29tJHNtb28gPT09IHZvaWQgMCA/IGZhbHNlIDogX3RoaXMkc2Nyb2xsWm9vbSRzbW9vO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICB2YXIgZGVsdGEgPSBldmVudC5kZWx0YTtcbiAgICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyhkZWx0YSAqIHNwZWVkKSkpO1xuXG4gICAgICBpZiAoZGVsdGEgPCAwICYmIHNjYWxlICE9PSAwKSB7XG4gICAgICAgIHNjYWxlID0gMSAvIHNjYWxlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnpvb20oe1xuICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgc2NhbGU6IHNjYWxlXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpLCB7fSwge1xuICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKHtcbiAgICAgICAgICBhcm91bmQ6IHBvc1xuICAgICAgICB9KSxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBzbW9vdGggPyAyNTAgOiAxXG4gICAgICB9KSwge1xuICAgICAgICBpc1Bhbm5pbmc6IHRydWUsXG4gICAgICAgIGlzWm9vbWluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGluY2hTdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QaW5jaFN0YXJ0KGV2ZW50KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS56b29tU3RhcnQoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSkucm90YXRlU3RhcnQoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zdGFydFBpbmNoUm90YXRpb24gPSBldmVudC5yb3RhdGlvbjtcbiAgICAgIHRoaXMuX2xhc3RQaW5jaEV2ZW50ID0gZXZlbnQ7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBpbmNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBpbmNoKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRvdWNoWm9vbSAmJiAhdGhpcy50b3VjaFJvdGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGU7XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoWm9vbSkge1xuICAgICAgICB2YXIgc2NhbGUgPSBldmVudC5zY2FsZTtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgICAgbmV3TWFwU3RhdGUgPSBuZXdNYXBTdGF0ZS56b29tKHtcbiAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICBzY2FsZTogc2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoUm90YXRlKSB7XG4gICAgICAgIHZhciByb3RhdGlvbiA9IGV2ZW50LnJvdGF0aW9uO1xuICAgICAgICBuZXdNYXBTdGF0ZSA9IG5ld01hcFN0YXRlLnJvdGF0ZSh7XG4gICAgICAgICAgZGVsdGFBbmdsZVg6IHRoaXMuX3N0YXJ0UGluY2hSb3RhdGlvbiAtIHJvdGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IHRydWUsXG4gICAgICAgIGlzUGFubmluZzogQm9vbGVhbih0aGlzLnRvdWNoWm9vbSksXG4gICAgICAgIGlzWm9vbWluZzogQm9vbGVhbih0aGlzLnRvdWNoWm9vbSksXG4gICAgICAgIGlzUm90YXRpbmc6IEJvb2xlYW4odGhpcy50b3VjaFJvdGF0ZSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbGFzdFBpbmNoRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QaW5jaEVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QaW5jaEVuZChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoWm9vbSkge1xuICAgICAgICB2YXIgX3RoaXMkdG91Y2hab29tJGluZXJ0ID0gdGhpcy50b3VjaFpvb20uaW5lcnRpYSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSBfdGhpcyR0b3VjaFpvb20kaW5lcnQgPT09IHZvaWQgMCA/IERFRkFVTFRfSU5FUlRJQSA6IF90aGlzJHRvdWNoWm9vbSRpbmVydDtcbiAgICAgICAgdmFyIF9sYXN0UGluY2hFdmVudCA9IHRoaXMuX2xhc3RQaW5jaEV2ZW50O1xuXG4gICAgICAgIGlmIChpbmVydGlhICYmIF9sYXN0UGluY2hFdmVudCAmJiBldmVudC5zY2FsZSAhPT0gX2xhc3RQaW5jaEV2ZW50LnNjYWxlKSB7XG4gICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcblxuICAgICAgICAgIHZhciBfbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZUVuZCgpO1xuXG4gICAgICAgICAgdmFyIHogPSBNYXRoLmxvZzIoZXZlbnQuc2NhbGUpO1xuXG4gICAgICAgICAgdmFyIHZlbG9jaXR5WiA9ICh6IC0gTWF0aC5sb2cyKF9sYXN0UGluY2hFdmVudC5zY2FsZSkpIC8gKGV2ZW50LmRlbHRhVGltZSAtIF9sYXN0UGluY2hFdmVudC5kZWx0YVRpbWUpO1xuXG4gICAgICAgICAgdmFyIGVuZFNjYWxlID0gTWF0aC5wb3coMiwgeiArIHZlbG9jaXR5WiAqIGluZXJ0aWEgLyAyKTtcbiAgICAgICAgICBfbmV3TWFwU3RhdGUgPSBfbmV3TWFwU3RhdGUuem9vbSh7XG4gICAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICAgIHNjYWxlOiBlbmRTY2FsZVxuICAgICAgICAgIH0pLnpvb21FbmQoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KF9uZXdNYXBTdGF0ZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyksIHt9LCB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKHtcbiAgICAgICAgICAgICAgYXJvdW5kOiBwb3NcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBpbmVydGlhLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVhc2luZzogSU5FUlRJQV9FQVNJTkdcbiAgICAgICAgICB9KSwge1xuICAgICAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBpc1Bhbm5pbmc6IEJvb2xlYW4odGhpcy50b3VjaFpvb20pLFxuICAgICAgICAgICAgaXNab29taW5nOiBCb29sZWFuKHRoaXMudG91Y2hab29tKSxcbiAgICAgICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5ibG9ja0V2ZW50cyhpbmVydGlhKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnpvb21FbmQoKS5yb3RhdGVFbmQoKTtcbiAgICAgIHRoaXMuX3N0YXRlLnN0YXJ0UGluY2hSb3RhdGlvbiA9IDA7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBudWxsLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICBpc1Bhbm5pbmc6IGZhbHNlLFxuICAgICAgICBpc1pvb21pbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9zdGFydFBpbmNoUm90YXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5fbGFzdFBpbmNoRXZlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblRyaXBsZVBhblN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblRyaXBsZVBhblN0YXJ0KGV2ZW50KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGVTdGFydCh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uVHJpcGxlUGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblRyaXBsZVBhbihldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy50b3VjaFJvdGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICBwb3NbMF0gLT0gZXZlbnQuZGVsdGFYO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGUoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzUm90YXRpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblRyaXBsZVBhbkVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25UcmlwbGVQYW5FbmQoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50b3VjaFJvdGF0ZSkge1xuICAgICAgICB2YXIgX3RoaXMkdG91Y2hSb3RhdGUkaW5lID0gdGhpcy50b3VjaFJvdGF0ZS5pbmVydGlhLFxuICAgICAgICAgICAgaW5lcnRpYSA9IF90aGlzJHRvdWNoUm90YXRlJGluZSA9PT0gdm9pZCAwID8gREVGQVVMVF9JTkVSVElBIDogX3RoaXMkdG91Y2hSb3RhdGUkaW5lO1xuXG4gICAgICAgIGlmIChpbmVydGlhICYmIGV2ZW50LnZlbG9jaXR5WSkge1xuICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICAgICAgdmFyIGVuZFBvcyA9IFtwb3NbMF0sIHBvc1sxXSArPSBldmVudC52ZWxvY2l0eVkgKiBpbmVydGlhIC8gMl07XG5cbiAgICAgICAgICB2YXIgX25ld01hcFN0YXRlMiA9IHRoaXMubWFwU3RhdGUucm90YXRlKHtcbiAgICAgICAgICAgIHBvczogZW5kUG9zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KF9uZXdNYXBTdGF0ZTIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpLCB7fSwge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBpbmVydGlhLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVhc2luZzogSU5FUlRJQV9FQVNJTkdcbiAgICAgICAgICB9KSwge1xuICAgICAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBpc1JvdGF0aW5nOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5ibG9ja0V2ZW50cyhpbmVydGlhKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGVFbmQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIG51bGwsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25Eb3VibGVUYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uRG91YmxlVGFwKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuZG91YmxlQ2xpY2tab29tKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgIHZhciBpc1pvb21PdXQgPSB0aGlzLmlzRnVuY3Rpb25LZXlQcmVzc2VkKGV2ZW50KTtcbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUuem9vbSh7XG4gICAgICAgIHBvczogcG9zLFxuICAgICAgICBzY2FsZTogaXNab29tT3V0ID8gMC41IDogMlxuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBPYmplY3QuYXNzaWduKHt9LCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUywge1xuICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKHtcbiAgICAgICAgICBhcm91bmQ6IHBvc1xuICAgICAgICB9KVxuICAgICAgfSksIHtcbiAgICAgICAgaXNab29taW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25LZXlEb3duXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5rZXlib2FyZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBmdW5jS2V5ID0gdGhpcy5pc0Z1bmN0aW9uS2V5UHJlc3NlZChldmVudCk7XG4gICAgICB2YXIgX3RoaXMka2V5Ym9hcmQgPSB0aGlzLmtleWJvYXJkLFxuICAgICAgICAgIF90aGlzJGtleWJvYXJkJHpvb21TcCA9IF90aGlzJGtleWJvYXJkLnpvb21TcGVlZCxcbiAgICAgICAgICB6b29tU3BlZWQgPSBfdGhpcyRrZXlib2FyZCR6b29tU3AgPT09IHZvaWQgMCA/IDIgOiBfdGhpcyRrZXlib2FyZCR6b29tU3AsXG4gICAgICAgICAgX3RoaXMka2V5Ym9hcmQkbW92ZVNwID0gX3RoaXMka2V5Ym9hcmQubW92ZVNwZWVkLFxuICAgICAgICAgIG1vdmVTcGVlZCA9IF90aGlzJGtleWJvYXJkJG1vdmVTcCA9PT0gdm9pZCAwID8gMTAwIDogX3RoaXMka2V5Ym9hcmQkbW92ZVNwLFxuICAgICAgICAgIF90aGlzJGtleWJvYXJkJHJvdGF0ZSA9IF90aGlzJGtleWJvYXJkLnJvdGF0ZVNwZWVkWCxcbiAgICAgICAgICByb3RhdGVTcGVlZFggPSBfdGhpcyRrZXlib2FyZCRyb3RhdGUgPT09IHZvaWQgMCA/IDE1IDogX3RoaXMka2V5Ym9hcmQkcm90YXRlLFxuICAgICAgICAgIF90aGlzJGtleWJvYXJkJHJvdGF0ZTIgPSBfdGhpcyRrZXlib2FyZC5yb3RhdGVTcGVlZFksXG4gICAgICAgICAgcm90YXRlU3BlZWRZID0gX3RoaXMka2V5Ym9hcmQkcm90YXRlMiA9PT0gdm9pZCAwID8gMTAgOiBfdGhpcyRrZXlib2FyZCRyb3RhdGUyO1xuICAgICAgdmFyIG1hcFN0YXRlUHJvcHMgPSB0aGlzLm1hcFN0YXRlUHJvcHM7XG4gICAgICB2YXIgbmV3TWFwU3RhdGU7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQuc3JjRXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE4OTpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgem9vbTogbWFwU3RhdGVQcm9wcy56b29tIC0gTWF0aC5sb2cyKHpvb21TcGVlZCkgLSAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgem9vbTogbWFwU3RhdGVQcm9wcy56b29tIC0gTWF0aC5sb2cyKHpvb21TcGVlZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg3OlxuICAgICAgICAgIGlmIChmdW5jS2V5KSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICB6b29tOiBtYXBTdGF0ZVByb3BzLnpvb20gKyBNYXRoLmxvZzIoem9vbVNwZWVkKSArIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICB6b29tOiBtYXBTdGF0ZVByb3BzLnpvb20gKyBNYXRoLmxvZzIoem9vbVNwZWVkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgYmVhcmluZzogbWFwU3RhdGVQcm9wcy5iZWFyaW5nIC0gcm90YXRlU3BlZWRYXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbih7XG4gICAgICAgICAgICAgIHBvczogW21vdmVTcGVlZCwgMF0sXG4gICAgICAgICAgICAgIHN0YXJ0UG9zOiBbMCwgMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgaWYgKGZ1bmNLZXkpIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5nZXRNYXBTdGF0ZSh7XG4gICAgICAgICAgICAgIGJlYXJpbmc6IG1hcFN0YXRlUHJvcHMuYmVhcmluZyArIHJvdGF0ZVNwZWVkWFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW4oe1xuICAgICAgICAgICAgICBwb3M6IFstbW92ZVNwZWVkLCAwXSxcbiAgICAgICAgICAgICAgc3RhcnRQb3M6IFswLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgcGl0Y2g6IG1hcFN0YXRlUHJvcHMucGl0Y2ggKyByb3RhdGVTcGVlZFlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuKHtcbiAgICAgICAgICAgICAgcG9zOiBbMCwgbW92ZVNwZWVkXSxcbiAgICAgICAgICAgICAgc3RhcnRQb3M6IFswLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgcGl0Y2g6IG1hcFN0YXRlUHJvcHMucGl0Y2ggLSByb3RhdGVTcGVlZFlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuKHtcbiAgICAgICAgICAgICAgcG9zOiBbMCwgLW1vdmVTcGVlZF0sXG4gICAgICAgICAgICAgIHN0YXJ0UG9zOiBbMCwgMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXBDb250cm9sbGVyO1xufSgpO1xuXG5leHBvcnQgeyBNYXBDb250cm9sbGVyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFN0YXRpY01hcCwgeyBnZXRWaWV3cG9ydCB9IGZyb20gJy4vc3RhdGljLW1hcCc7XG5pbXBvcnQgeyBNQVBCT1hfTElNSVRTIH0gZnJvbSAnLi4vdXRpbHMvbWFwLXN0YXRlJztcbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciBmcm9tICcuLi91dGlscy90cmFuc2l0aW9uLW1hbmFnZXInO1xuaW1wb3J0IE1hcENvbnRleHQsIHsgTWFwQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9tYXAtY29udGV4dCc7XG5pbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tICdtam9sbmlyLmpzJztcbmltcG9ydCBNYXBDb250cm9sbGVyIGZyb20gJy4uL3V0aWxzL21hcC1jb250cm9sbGVyJztcbmltcG9ydCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IGZyb20gJy4uL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QnO1xuaW1wb3J0IHsgZ2V0VGVycmFpbkVsZXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL3RlcnJhaW4nO1xudmFyIHByb3BUeXBlcyA9IE9iamVjdC5hc3NpZ24oe30sIFN0YXRpY01hcC5wcm9wVHlwZXMsIHtcbiAgbWF4Wm9vbTogUHJvcFR5cGVzLm51bWJlcixcbiAgbWluWm9vbTogUHJvcFR5cGVzLm51bWJlcixcbiAgbWF4UGl0Y2g6IFByb3BUeXBlcy5udW1iZXIsXG4gIG1pblBpdGNoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBvblZpZXdTdGF0ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uVmlld3BvcnRDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbkludGVyYWN0aW9uU3RhdGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICB0cmFuc2l0aW9uRHVyYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgdHJhbnNpdGlvbkludGVycG9sYXRvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgdHJhbnNpdGlvbkludGVycnVwdGlvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgdHJhbnNpdGlvbkVhc2luZzogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uVHJhbnNpdGlvblN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25UcmFuc2l0aW9uSW50ZXJydXB0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25UcmFuc2l0aW9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgc2Nyb2xsWm9vbTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgZHJhZ1BhbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgZHJhZ1JvdGF0ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgZG91YmxlQ2xpY2tab29tOiBQcm9wVHlwZXMuYm9vbCxcbiAgdG91Y2hab29tOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICB0b3VjaFJvdGF0ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAga2V5Ym9hcmQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIG9uSG92ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25EYmxDbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ29udGV4dE1lbnU6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlRG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VNb3ZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZVVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Ub3VjaFN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Ub3VjaE1vdmU6IFByb3BUeXBlcy5mdW5jLFxuICBvblRvdWNoRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZUVudGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZUxlYXZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZU91dDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uV2hlZWw6IFByb3BUeXBlcy5mdW5jLFxuICB0b3VjaEFjdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgZXZlbnRSZWNvZ25pemVyT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xpY2tSYWRpdXM6IFByb3BUeXBlcy5udW1iZXIsXG4gIGludGVyYWN0aXZlTGF5ZXJJZHM6IFByb3BUeXBlcy5hcnJheSxcbiAgZ2V0Q3Vyc29yOiBQcm9wVHlwZXMuZnVuYyxcbiAgY29udHJvbGxlcjogUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwQ29udHJvbGxlcilcbn0pO1xuXG52YXIgZ2V0RGVmYXVsdEN1cnNvciA9IGZ1bmN0aW9uIGdldERlZmF1bHRDdXJzb3IoX3JlZikge1xuICB2YXIgaXNEcmFnZ2luZyA9IF9yZWYuaXNEcmFnZ2luZyxcbiAgICAgIGlzSG92ZXJpbmcgPSBfcmVmLmlzSG92ZXJpbmc7XG4gIHJldHVybiBpc0RyYWdnaW5nID8gJ2dyYWJiaW5nJyA6IGlzSG92ZXJpbmcgPyAncG9pbnRlcicgOiAnZ3JhYic7XG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgU3RhdGljTWFwLmRlZmF1bHRQcm9wcywgTUFQQk9YX0xJTUlUUywgVHJhbnNpdGlvbk1hbmFnZXIuZGVmYXVsdFByb3BzLCB7XG4gIG9uVmlld1N0YXRlQ2hhbmdlOiBudWxsLFxuICBvblZpZXdwb3J0Q2hhbmdlOiBudWxsLFxuICBvbkNsaWNrOiBudWxsLFxuICBvbk5hdGl2ZUNsaWNrOiBudWxsLFxuICBvbkhvdmVyOiBudWxsLFxuICBvbkNvbnRleHRNZW51OiBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0sXG4gIHNjcm9sbFpvb206IHRydWUsXG4gIGRyYWdQYW46IHRydWUsXG4gIGRyYWdSb3RhdGU6IHRydWUsXG4gIGRvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcbiAgdG91Y2hab29tOiB0cnVlLFxuICB0b3VjaFJvdGF0ZTogZmFsc2UsXG4gIGtleWJvYXJkOiB0cnVlLFxuICB0b3VjaEFjdGlvbjogJ25vbmUnLFxuICBldmVudFJlY29nbml6ZXJPcHRpb25zOiB7fSxcbiAgY2xpY2tSYWRpdXM6IDAsXG4gIGdldEN1cnNvcjogZ2V0RGVmYXVsdEN1cnNvclxufSk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50KGV2ZW50KSB7XG4gIGlmIChldmVudC5sbmdMYXQgfHwgIWV2ZW50Lm9mZnNldENlbnRlcikge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIHZhciBfZXZlbnQkb2Zmc2V0Q2VudGVyID0gZXZlbnQub2Zmc2V0Q2VudGVyLFxuICAgICAgeCA9IF9ldmVudCRvZmZzZXRDZW50ZXIueCxcbiAgICAgIHkgPSBfZXZlbnQkb2Zmc2V0Q2VudGVyLnk7XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIHZhciBwb3MgPSBbeCwgeV07XG4gIGV2ZW50LnBvaW50ID0gcG9zO1xuICB2YXIgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0O1xuICB2YXIgbG9jYXRpb24gPSB2aWV3cG9ydC51bnByb2plY3QocG9zLCB7XG4gICAgdGFyZ2V0Wjogdmlld3BvcnQubWV0ZXJPZmZzZXRbMl1cbiAgfSk7XG4gIGV2ZW50LmxuZ0xhdCA9IFtsb2NhdGlvblswXSwgbG9jYXRpb25bMV1dO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEZlYXR1cmVzKHBvcykge1xuICB2YXIgbWFwID0gdGhpcy5tYXA7XG5cbiAgaWYgKCFtYXAgfHwgIXBvcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHF1ZXJ5UGFyYW1zID0ge307XG4gIHZhciBzaXplID0gdGhpcy5wcm9wcy5jbGlja1JhZGl1cztcblxuICBpZiAodGhpcy5wcm9wcy5pbnRlcmFjdGl2ZUxheWVySWRzKSB7XG4gICAgcXVlcnlQYXJhbXMubGF5ZXJzID0gdGhpcy5wcm9wcy5pbnRlcmFjdGl2ZUxheWVySWRzO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhzaXplID8gW1twb3NbMF0gLSBzaXplLCBwb3NbMV0gKyBzaXplXSwgW3Bvc1swXSArIHNpemUsIHBvc1sxXSAtIHNpemVdXSA6IHBvcywgcXVlcnlQYXJhbXMpO1xuICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25FdmVudChjYWxsYmFja05hbWUsIGV2ZW50KSB7XG4gIHZhciBmdW5jID0gdGhpcy5wcm9wc1tjYWxsYmFja05hbWVdO1xuXG4gIGlmIChmdW5jKSB7XG4gICAgZnVuYyhub3JtYWxpemVFdmVudC5jYWxsKHRoaXMsIGV2ZW50KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Qb2ludGVyRG93bihldmVudCkge1xuICBvbkV2ZW50LmNhbGwodGhpcywgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgPyAnb25Ub3VjaFN0YXJ0JyA6ICdvbk1vdXNlRG93bicsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gb25Qb2ludGVyVXAoZXZlbnQpIHtcbiAgb25FdmVudC5jYWxsKHRoaXMsIGV2ZW50LnBvaW50ZXJUeXBlID09PSAndG91Y2gnID8gJ29uVG91Y2hFbmQnIDogJ29uTW91c2VVcCcsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gb25Qb2ludGVyTW92ZShldmVudCkge1xuICBvbkV2ZW50LmNhbGwodGhpcywgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgPyAnb25Ub3VjaE1vdmUnIDogJ29uTW91c2VNb3ZlJywgZXZlbnQpO1xuXG4gIGlmICghdGhpcy5zdGF0ZS5pc0RyYWdnaW5nKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25Ib3ZlciA9IF90aGlzJHByb3BzLm9uSG92ZXIsXG4gICAgICAgIGludGVyYWN0aXZlTGF5ZXJJZHMgPSBfdGhpcyRwcm9wcy5pbnRlcmFjdGl2ZUxheWVySWRzO1xuICAgIHZhciBmZWF0dXJlcztcbiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50LmNhbGwodGhpcywgZXZlbnQpO1xuXG4gICAgaWYgKGludGVyYWN0aXZlTGF5ZXJJZHMgfHwgb25Ib3Zlcikge1xuICAgICAgZmVhdHVyZXMgPSBnZXRGZWF0dXJlcy5jYWxsKHRoaXMsIGV2ZW50LnBvaW50KTtcbiAgICB9XG5cbiAgICB2YXIgaXNIb3ZlcmluZyA9IEJvb2xlYW4oaW50ZXJhY3RpdmVMYXllcklkcyAmJiBmZWF0dXJlcyAmJiBmZWF0dXJlcy5sZW5ndGggPiAwKTtcbiAgICB2YXIgaXNFbnRlcmluZyA9IGlzSG92ZXJpbmcgJiYgIXRoaXMuc3RhdGUuaXNIb3ZlcmluZztcbiAgICB2YXIgaXNFeGl0aW5nID0gIWlzSG92ZXJpbmcgJiYgdGhpcy5zdGF0ZS5pc0hvdmVyaW5nO1xuXG4gICAgaWYgKG9uSG92ZXIgfHwgaXNFbnRlcmluZykge1xuICAgICAgZXZlbnQuZmVhdHVyZXMgPSBmZWF0dXJlcztcblxuICAgICAgaWYgKG9uSG92ZXIpIHtcbiAgICAgICAgb25Ib3ZlcihldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRW50ZXJpbmcpIHtcbiAgICAgIG9uRXZlbnQuY2FsbCh0aGlzLCAnb25Nb3VzZUVudGVyJywgZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0V4aXRpbmcpIHtcbiAgICAgIG9uRXZlbnQuY2FsbCh0aGlzLCAnb25Nb3VzZUxlYXZlJywgZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0VudGVyaW5nIHx8IGlzRXhpdGluZykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzSG92ZXJpbmc6IGlzSG92ZXJpbmdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvblBvaW50ZXJDbGljayhldmVudCkge1xuICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgIG9uQ2xpY2sgPSBfdGhpcyRwcm9wczIub25DbGljayxcbiAgICAgIG9uTmF0aXZlQ2xpY2sgPSBfdGhpcyRwcm9wczIub25OYXRpdmVDbGljayxcbiAgICAgIG9uRGJsQ2xpY2sgPSBfdGhpcyRwcm9wczIub25EYmxDbGljayxcbiAgICAgIGRvdWJsZUNsaWNrWm9vbSA9IF90aGlzJHByb3BzMi5kb3VibGVDbGlja1pvb207XG4gIHZhciBjYWxsYmFja3MgPSBbXTtcbiAgdmFyIGlzRG91YmxlQ2xpY2tFbmFibGVkID0gb25EYmxDbGljayB8fCBkb3VibGVDbGlja1pvb207XG5cbiAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgY2FzZSAnYW55Y2xpY2snOlxuICAgICAgY2FsbGJhY2tzLnB1c2gob25OYXRpdmVDbGljayk7XG5cbiAgICAgIGlmICghaXNEb3VibGVDbGlja0VuYWJsZWQpIHtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2gob25DbGljayk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgaWYgKGlzRG91YmxlQ2xpY2tFbmFibGVkKSB7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKG9uQ2xpY2spO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gIH1cblxuICBjYWxsYmFja3MgPSBjYWxsYmFja3MuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgZXZlbnQgPSBub3JtYWxpemVFdmVudC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICBldmVudC5mZWF0dXJlcyA9IGdldEZlYXR1cmVzLmNhbGwodGhpcywgZXZlbnQucG9pbnQpO1xuICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgcmV0dXJuIGNiKGV2ZW50KTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWZIYW5kbGVzKHN0YXRpY01hcFJlZikge1xuICByZXR1cm4ge1xuICAgIGdldE1hcDogc3RhdGljTWFwUmVmLmN1cnJlbnQgJiYgc3RhdGljTWFwUmVmLmN1cnJlbnQuZ2V0TWFwLFxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlczogc3RhdGljTWFwUmVmLmN1cnJlbnQgJiYgc3RhdGljTWFwUmVmLmN1cnJlbnQucXVlcnlSZW5kZXJlZEZlYXR1cmVzXG4gIH07XG59XG5cbnZhciBJbnRlcmFjdGl2ZU1hcCA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHBhcmVudENvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB2YXIgY29udHJvbGxlciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwcm9wcy5jb250cm9sbGVyIHx8IG5ldyBNYXBDb250cm9sbGVyKCk7XG4gIH0sIFtdKTtcbiAgdmFyIGV2ZW50TWFuYWdlciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRXZlbnRNYW5hZ2VyKG51bGwsIHtcbiAgICAgIHRvdWNoQWN0aW9uOiBwcm9wcy50b3VjaEFjdGlvbixcbiAgICAgIHJlY29nbml6ZXJPcHRpb25zOiBwcm9wcy5ldmVudFJlY29nbml6ZXJPcHRpb25zXG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdmFyIGV2ZW50Q2FudmFzUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgc3RhdGljTWFwUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHZhciBfdGhpc1JlZiA9IHVzZVJlZih7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHN0YXRlOiB7XG4gICAgICBpc0hvdmVyaW5nOiBmYWxzZSxcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfVxuICB9KTtcblxuICB2YXIgdGhpc1JlZiA9IF90aGlzUmVmLmN1cnJlbnQ7XG4gIHRoaXNSZWYucHJvcHMgPSBwcm9wcztcbiAgdGhpc1JlZi5tYXAgPSBzdGF0aWNNYXBSZWYuY3VycmVudCAmJiBzdGF0aWNNYXBSZWYuY3VycmVudC5nZXRNYXAoKTtcblxuICB0aGlzUmVmLnNldFN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG4gICAgdGhpc1JlZi5zdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpc1JlZi5zdGF0ZSksIG5ld1N0YXRlKTtcbiAgICBldmVudENhbnZhc1JlZi5jdXJyZW50LnN0eWxlLmN1cnNvciA9IHByb3BzLmdldEN1cnNvcih0aGlzUmVmLnN0YXRlKTtcbiAgfTtcblxuICB2YXIgaW5SZW5kZXIgPSB0cnVlO1xuICB2YXIgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQ7XG4gIHZhciBzdGF0ZVVwZGF0ZVJlcXVlc3RlZDtcblxuICB2YXIgaGFuZGxlVmlld3BvcnRDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVWaWV3cG9ydENoYW5nZSh2aWV3U3RhdGUsIGludGVyYWN0aW9uU3RhdGUsIG9sZFZpZXdTdGF0ZSkge1xuICAgIGlmIChpblJlbmRlcikge1xuICAgICAgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQgPSBbdmlld1N0YXRlLCBpbnRlcmFjdGlvblN0YXRlLCBvbGRWaWV3U3RhdGVdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBfdGhpc1JlZiRwcm9wcyA9IHRoaXNSZWYucHJvcHMsXG4gICAgICAgIG9uVmlld1N0YXRlQ2hhbmdlID0gX3RoaXNSZWYkcHJvcHMub25WaWV3U3RhdGVDaGFuZ2UsXG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UgPSBfdGhpc1JlZiRwcm9wcy5vblZpZXdwb3J0Q2hhbmdlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3U3RhdGUsICdwb3NpdGlvbicsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gWzAsIDAsIGdldFRlcnJhaW5FbGV2YXRpb24odGhpc1JlZi5tYXAsIHZpZXdTdGF0ZSldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG9uVmlld1N0YXRlQ2hhbmdlKSB7XG4gICAgICBvblZpZXdTdGF0ZUNoYW5nZSh7XG4gICAgICAgIHZpZXdTdGF0ZTogdmlld1N0YXRlLFxuICAgICAgICBpbnRlcmFjdGlvblN0YXRlOiBpbnRlcmFjdGlvblN0YXRlLFxuICAgICAgICBvbGRWaWV3U3RhdGU6IG9sZFZpZXdTdGF0ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9uVmlld3BvcnRDaGFuZ2UpIHtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2Uodmlld1N0YXRlLCBpbnRlcmFjdGlvblN0YXRlLCBvbGRWaWV3U3RhdGUpO1xuICAgIH1cbiAgfTtcblxuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRSZWZIYW5kbGVzKHN0YXRpY01hcFJlZik7XG4gIH0sIFtdKTtcbiAgdmFyIGNvbnRleHQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwYXJlbnRDb250ZXh0KSwge30sIHtcbiAgICAgIGV2ZW50TWFuYWdlcjogZXZlbnRNYW5hZ2VyLFxuICAgICAgY29udGFpbmVyOiBwYXJlbnRDb250ZXh0LmNvbnRhaW5lciB8fCBldmVudENhbnZhc1JlZi5jdXJyZW50XG4gICAgfSk7XG4gIH0sIFtwYXJlbnRDb250ZXh0LCBldmVudENhbnZhc1JlZi5jdXJyZW50XSk7XG4gIGNvbnRleHQub25WaWV3cG9ydENoYW5nZSA9IGhhbmRsZVZpZXdwb3J0Q2hhbmdlO1xuICBjb250ZXh0LnZpZXdwb3J0ID0gcGFyZW50Q29udGV4dC52aWV3cG9ydCB8fCBnZXRWaWV3cG9ydCh0aGlzUmVmKTtcbiAgdGhpc1JlZi52aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQ7XG5cbiAgdmFyIGhhbmRsZUludGVyYWN0aW9uU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVJbnRlcmFjdGlvblN0YXRlQ2hhbmdlKGludGVyYWN0aW9uU3RhdGUpIHtcbiAgICB2YXIgX2ludGVyYWN0aW9uU3RhdGUkaXNEID0gaW50ZXJhY3Rpb25TdGF0ZS5pc0RyYWdnaW5nLFxuICAgICAgICBpc0RyYWdnaW5nID0gX2ludGVyYWN0aW9uU3RhdGUkaXNEID09PSB2b2lkIDAgPyBmYWxzZSA6IF9pbnRlcmFjdGlvblN0YXRlJGlzRDtcblxuICAgIGlmIChpc0RyYWdnaW5nICE9PSB0aGlzUmVmLnN0YXRlLmlzRHJhZ2dpbmcpIHtcbiAgICAgIHRoaXNSZWYuc2V0U3RhdGUoe1xuICAgICAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaW5SZW5kZXIpIHtcbiAgICAgIHN0YXRlVXBkYXRlUmVxdWVzdGVkID0gaW50ZXJhY3Rpb25TdGF0ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb25JbnRlcmFjdGlvblN0YXRlQ2hhbmdlID0gdGhpc1JlZi5wcm9wcy5vbkludGVyYWN0aW9uU3RhdGVDaGFuZ2U7XG5cbiAgICBpZiAob25JbnRlcmFjdGlvblN0YXRlQ2hhbmdlKSB7XG4gICAgICBvbkludGVyYWN0aW9uU3RhdGVDaGFuZ2UoaW50ZXJhY3Rpb25TdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB1cGRhdGVDb250cm9sbGVyT3B0cyA9IGZ1bmN0aW9uIHVwZGF0ZUNvbnRyb2xsZXJPcHRzKCkge1xuICAgIGlmICh0aGlzUmVmLndpZHRoICYmIHRoaXNSZWYuaGVpZ2h0KSB7XG4gICAgICBjb250cm9sbGVyLnNldE9wdGlvbnMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXNSZWYucHJvcHMpLCB0aGlzUmVmLnByb3BzLnZpZXdTdGF0ZSksIHt9LCB7XG4gICAgICAgIGlzSW50ZXJhY3RpdmU6IEJvb2xlYW4odGhpc1JlZi5wcm9wcy5vblZpZXdTdGF0ZUNoYW5nZSB8fCB0aGlzUmVmLnByb3BzLm9uVmlld3BvcnRDaGFuZ2UpLFxuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlOiBoYW5kbGVWaWV3cG9ydENoYW5nZSxcbiAgICAgICAgb25TdGF0ZUNoYW5nZTogaGFuZGxlSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZSxcbiAgICAgICAgZXZlbnRNYW5hZ2VyOiBldmVudE1hbmFnZXIsXG4gICAgICAgIHdpZHRoOiB0aGlzUmVmLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXNSZWYuaGVpZ2h0XG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvblJlc2l6ZSA9IGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYyKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodDtcbiAgICB0aGlzUmVmLndpZHRoID0gd2lkdGg7XG4gICAgdGhpc1JlZi5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdXBkYXRlQ29udHJvbGxlck9wdHMoKTtcbiAgICB0aGlzUmVmLnByb3BzLm9uUmVzaXplKHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBldmVudE1hbmFnZXIuc2V0RWxlbWVudChldmVudENhbnZhc1JlZi5jdXJyZW50KTtcbiAgICBldmVudE1hbmFnZXIub24oe1xuICAgICAgcG9pbnRlcmRvd246IG9uUG9pbnRlckRvd24uYmluZCh0aGlzUmVmKSxcbiAgICAgIHBvaW50ZXJtb3ZlOiBvblBvaW50ZXJNb3ZlLmJpbmQodGhpc1JlZiksXG4gICAgICBwb2ludGVydXA6IG9uUG9pbnRlclVwLmJpbmQodGhpc1JlZiksXG4gICAgICBwb2ludGVybGVhdmU6IG9uRXZlbnQuYmluZCh0aGlzUmVmLCAnb25Nb3VzZU91dCcpLFxuICAgICAgY2xpY2s6IG9uUG9pbnRlckNsaWNrLmJpbmQodGhpc1JlZiksXG4gICAgICBhbnljbGljazogb25Qb2ludGVyQ2xpY2suYmluZCh0aGlzUmVmKSxcbiAgICAgIGRibGNsaWNrOiBvbkV2ZW50LmJpbmQodGhpc1JlZiwgJ29uRGJsQ2xpY2snKSxcbiAgICAgIHdoZWVsOiBvbkV2ZW50LmJpbmQodGhpc1JlZiwgJ29uV2hlZWwnKSxcbiAgICAgIGNvbnRleHRtZW51OiBvbkV2ZW50LmJpbmQodGhpc1JlZiwgJ29uQ29udGV4dE1lbnUnKVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBldmVudE1hbmFnZXIuZGVzdHJveSgpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKSB7XG4gICAgICBoYW5kbGVWaWV3cG9ydENoYW5nZS5hcHBseSh2b2lkIDAsIF90b0NvbnN1bWFibGVBcnJheSh2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCkpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZVVwZGF0ZVJlcXVlc3RlZCkge1xuICAgICAgaGFuZGxlSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZVVwZGF0ZVJlcXVlc3RlZCk7XG4gICAgfVxuICB9KTtcbiAgdXBkYXRlQ29udHJvbGxlck9wdHMoKTtcbiAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgZ2V0Q3Vyc29yID0gcHJvcHMuZ2V0Q3Vyc29yO1xuICB2YXIgZXZlbnRDYW52YXNTdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICB9LCBzdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIGN1cnNvcjogZ2V0Q3Vyc29yKHRoaXNSZWYuc3RhdGUpXG4gICAgfSk7XG4gIH0sIFtzdHlsZSwgd2lkdGgsIGhlaWdodCwgZ2V0Q3Vyc29yLCB0aGlzUmVmLnN0YXRlXSk7XG5cbiAgaWYgKCF2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCB8fCAhdGhpc1JlZi5fY2hpbGQpIHtcbiAgICB0aGlzUmVmLl9jaGlsZCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFwQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAga2V5OiBcImV2ZW50LWNhbnZhc1wiLFxuICAgICAgcmVmOiBldmVudENhbnZhc1JlZixcbiAgICAgIHN0eWxlOiBldmVudENhbnZhc1N0eWxlXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChTdGF0aWNNYXAsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIHN0eWxlOiBudWxsLFxuICAgICAgb25SZXNpemU6IG9uUmVzaXplLFxuICAgICAgcmVmOiBzdGF0aWNNYXBSZWZcbiAgICB9KSkpKTtcbiAgfVxuXG4gIGluUmVuZGVyID0gZmFsc2U7XG4gIHJldHVybiB0aGlzUmVmLl9jaGlsZDtcbn0pO1xuSW50ZXJhY3RpdmVNYXAuc3VwcG9ydGVkID0gU3RhdGljTWFwLnN1cHBvcnRlZDtcbkludGVyYWN0aXZlTWFwLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkludGVyYWN0aXZlTWFwLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEludGVyYWN0aXZlTWFwOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikgfHwgYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChfdHlwZW9mKGEpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKGIpID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuXG4gICAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwLCBfYUtleXMgPSBhS2V5czsgX2kgPCBfYUtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIga2V5ID0gX2FLZXlzW19pXTtcblxuICAgICAgaWYgKCFiLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTWFwQ29udGV4dCBmcm9tICcuL21hcC1jb250ZXh0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vdXRpbHMvYXNzZXJ0JztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vdXRpbHMvZGVlcC1lcXVhbCc7XG52YXIgc291cmNlQ291bnRlciA9IDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNvdXJjZShtYXAsIGlkLCBwcm9wcykge1xuICBpZiAobWFwLnN0eWxlICYmIG1hcC5zdHlsZS5fbG9hZGVkKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyk7XG5cbiAgICBkZWxldGUgb3B0aW9ucy5pZDtcbiAgICBkZWxldGUgb3B0aW9ucy5jaGlsZHJlbjtcbiAgICBtYXAuYWRkU291cmNlKGlkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFwLmdldFNvdXJjZShpZCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU291cmNlKHNvdXJjZSwgcHJvcHMsIHByZXZQcm9wcykge1xuICBhc3NlcnQocHJvcHMuaWQgPT09IHByZXZQcm9wcy5pZCwgJ3NvdXJjZSBpZCBjaGFuZ2VkJyk7XG4gIGFzc2VydChwcm9wcy50eXBlID09PSBwcmV2UHJvcHMudHlwZSwgJ3NvdXJjZSB0eXBlIGNoYW5nZWQnKTtcbiAgdmFyIGNoYW5nZWRLZXkgPSAnJztcbiAgdmFyIGNoYW5nZWRLZXlDb3VudCA9IDA7XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdpZCcgJiYgIWRlZXBFcXVhbChwcmV2UHJvcHNba2V5XSwgcHJvcHNba2V5XSkpIHtcbiAgICAgIGNoYW5nZWRLZXkgPSBrZXk7XG4gICAgICBjaGFuZ2VkS2V5Q291bnQrKztcbiAgICB9XG4gIH1cblxuICBpZiAoIWNoYW5nZWRLZXlDb3VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodHlwZSA9PT0gJ2dlb2pzb24nKSB7XG4gICAgc291cmNlLnNldERhdGEocHJvcHMuZGF0YSk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIHNvdXJjZS51cGRhdGVJbWFnZSh7XG4gICAgICB1cmw6IHByb3BzLnVybCxcbiAgICAgIGNvb3JkaW5hdGVzOiBwcm9wcy5jb29yZGluYXRlc1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCh0eXBlID09PSAnY2FudmFzJyB8fCB0eXBlID09PSAndmlkZW8nKSAmJiBjaGFuZ2VkS2V5Q291bnQgPT09IDEgJiYgY2hhbmdlZEtleSA9PT0gJ2Nvb3JkaW5hdGVzJykge1xuICAgIHNvdXJjZS5zZXRDb29yZGluYXRlcyhwcm9wcy5jb29yZGluYXRlcyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZlY3RvcicgJiYgc291cmNlLnNldFVybCkge1xuICAgIHN3aXRjaCAoY2hhbmdlZEtleSkge1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgc291cmNlLnNldFVybChwcm9wcy51cmwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGlsZXMnOlxuICAgICAgICBzb3VyY2Uuc2V0VGlsZXMocHJvcHMudGlsZXMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKFwiVW5hYmxlIHRvIHVwZGF0ZSA8U291cmNlPiBwcm9wOiBcIi5jb25jYXQoY2hhbmdlZEtleSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIFNvdXJjZShwcm9wcykge1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHZhciBwcm9wc1JlZiA9IHVzZVJlZih7XG4gICAgaWQ6IHByb3BzLmlkLFxuICAgIHR5cGU6IHByb3BzLnR5cGVcbiAgfSk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzZXRTdHlsZUxvYWRlZCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGlkID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3BzLmlkIHx8IFwianN4LXNvdXJjZS1cIi5jb25jYXQoc291cmNlQ291bnRlcisrKTtcbiAgfSwgW10pO1xuICB2YXIgbWFwID0gY29udGV4dC5tYXA7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1hcCkge1xuICAgICAgdmFyIGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIHJldHVybiBzZXRTdHlsZUxvYWRlZChmdW5jdGlvbiAodmVyc2lvbikge1xuICAgICAgICAgIHJldHVybiB2ZXJzaW9uICsgMTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBtYXAub24oJ3N0eWxlZGF0YScsIGZvcmNlVXBkYXRlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1hcC5vZmYoJ3N0eWxlZGF0YScsIGZvcmNlVXBkYXRlKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobWFwLnN0eWxlICYmIG1hcC5zdHlsZS5fbG9hZGVkICYmIG1hcC5nZXRTb3VyY2UoaWQpKSB7XG4gICAgICAgICAgICBtYXAucmVtb3ZlU291cmNlKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbbWFwLCBpZF0pO1xuICB2YXIgc291cmNlID0gbWFwICYmIG1hcC5zdHlsZSAmJiBtYXAuZ2V0U291cmNlKGlkKTtcblxuICBpZiAoc291cmNlKSB7XG4gICAgdXBkYXRlU291cmNlKHNvdXJjZSwgcHJvcHMsIHByb3BzUmVmLmN1cnJlbnQpO1xuICB9IGVsc2Uge1xuICAgIHNvdXJjZSA9IGNyZWF0ZVNvdXJjZShtYXAsIGlkLCBwcm9wcyk7XG4gIH1cblxuICBwcm9wc1JlZi5jdXJyZW50ID0gcHJvcHM7XG4gIHJldHVybiBzb3VyY2UgJiYgUmVhY3QuQ2hpbGRyZW4ubWFwKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQgJiYgY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICBzb3VyY2U6IGlkXG4gICAgfSk7XG4gIH0pIHx8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgTWFwQ29udGV4dCBmcm9tICcuL21hcC1jb250ZXh0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vdXRpbHMvYXNzZXJ0JztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vdXRpbHMvZGVlcC1lcXVhbCc7XG52YXIgTEFZRVJfVFlQRVMgPSBbJ2ZpbGwnLCAnbGluZScsICdzeW1ib2wnLCAnY2lyY2xlJywgJ2ZpbGwtZXh0cnVzaW9uJywgJ3Jhc3RlcicsICdiYWNrZ3JvdW5kJywgJ2hlYXRtYXAnLCAnaGlsbHNoYWRlJywgJ3NreSddO1xudmFyIHByb3BUeXBlcyA9IHtcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKExBWUVSX1RZUEVTKS5pc1JlcXVpcmVkLFxuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgc291cmNlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBiZWZvcmVJZDogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZnVuY3Rpb24gZGlmZkxheWVyU3R5bGVzKG1hcCwgaWQsIHByb3BzLCBwcmV2UHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRsYXlvdXQgPSBwcm9wcy5sYXlvdXQsXG4gICAgICBsYXlvdXQgPSBfcHJvcHMkbGF5b3V0ID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRsYXlvdXQsXG4gICAgICBfcHJvcHMkcGFpbnQgPSBwcm9wcy5wYWludCxcbiAgICAgIHBhaW50ID0gX3Byb3BzJHBhaW50ID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRwYWludCxcbiAgICAgIGZpbHRlciA9IHByb3BzLmZpbHRlcixcbiAgICAgIG1pbnpvb20gPSBwcm9wcy5taW56b29tLFxuICAgICAgbWF4em9vbSA9IHByb3BzLm1heHpvb20sXG4gICAgICBiZWZvcmVJZCA9IHByb3BzLmJlZm9yZUlkLFxuICAgICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wibGF5b3V0XCIsIFwicGFpbnRcIiwgXCJmaWx0ZXJcIiwgXCJtaW56b29tXCIsIFwibWF4em9vbVwiLCBcImJlZm9yZUlkXCJdKTtcblxuICBpZiAoYmVmb3JlSWQgIT09IHByZXZQcm9wcy5iZWZvcmVJZCkge1xuICAgIG1hcC5tb3ZlTGF5ZXIoaWQsIGJlZm9yZUlkKTtcbiAgfVxuXG4gIGlmIChsYXlvdXQgIT09IHByZXZQcm9wcy5sYXlvdXQpIHtcbiAgICB2YXIgcHJldkxheW91dCA9IHByZXZQcm9wcy5sYXlvdXQgfHwge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChsYXlvdXRba2V5XSwgcHJldkxheW91dFtrZXldKSkge1xuICAgICAgICBtYXAuc2V0TGF5b3V0UHJvcGVydHkoaWQsIGtleSwgbGF5b3V0W2tleV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9rZXkgaW4gcHJldkxheW91dCkge1xuICAgICAgaWYgKCFsYXlvdXQuaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgICAgbWFwLnNldExheW91dFByb3BlcnR5KGlkLCBfa2V5LCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwYWludCAhPT0gcHJldlByb3BzLnBhaW50KSB7XG4gICAgdmFyIHByZXZQYWludCA9IHByZXZQcm9wcy5wYWludCB8fCB7fTtcblxuICAgIGZvciAodmFyIF9rZXkyIGluIHBhaW50KSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChwYWludFtfa2V5Ml0sIHByZXZQYWludFtfa2V5Ml0pKSB7XG4gICAgICAgIG1hcC5zZXRQYWludFByb3BlcnR5KGlkLCBfa2V5MiwgcGFpbnRbX2tleTJdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfa2V5MyBpbiBwcmV2UGFpbnQpIHtcbiAgICAgIGlmICghcGFpbnQuaGFzT3duUHJvcGVydHkoX2tleTMpKSB7XG4gICAgICAgIG1hcC5zZXRQYWludFByb3BlcnR5KGlkLCBfa2V5MywgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWRlZXBFcXVhbChmaWx0ZXIsIHByZXZQcm9wcy5maWx0ZXIpKSB7XG4gICAgbWFwLnNldEZpbHRlcihpZCwgZmlsdGVyKTtcbiAgfVxuXG4gIGlmIChtaW56b29tICE9PSBwcmV2UHJvcHMubWluem9vbSB8fCBtYXh6b29tICE9PSBwcmV2UHJvcHMubWF4em9vbSkge1xuICAgIG1hcC5zZXRMYXllclpvb21SYW5nZShpZCwgbWluem9vbSwgbWF4em9vbSk7XG4gIH1cblxuICBmb3IgKHZhciBfa2V5NCBpbiBvdGhlclByb3BzKSB7XG4gICAgaWYgKCFkZWVwRXF1YWwob3RoZXJQcm9wc1tfa2V5NF0sIHByZXZQcm9wc1tfa2V5NF0pKSB7XG4gICAgICBtYXAuc2V0TGF5ZXJQcm9wZXJ0eShpZCwgX2tleTQsIG90aGVyUHJvcHNbX2tleTRdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTGF5ZXIobWFwLCBpZCwgcHJvcHMpIHtcbiAgaWYgKG1hcC5zdHlsZSAmJiBtYXAuc3R5bGUuX2xvYWRlZCkge1xuICAgIHZhciBvcHRpb25zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBpZDogaWRcbiAgICB9KTtcblxuICAgIGRlbGV0ZSBvcHRpb25zLmJlZm9yZUlkO1xuICAgIG1hcC5hZGRMYXllcihvcHRpb25zLCBwcm9wcy5iZWZvcmVJZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5ZXIobWFwLCBpZCwgcHJvcHMsIHByZXZQcm9wcykge1xuICBhc3NlcnQocHJvcHMuaWQgPT09IHByZXZQcm9wcy5pZCwgJ2xheWVyIGlkIGNoYW5nZWQnKTtcbiAgYXNzZXJ0KHByb3BzLnR5cGUgPT09IHByZXZQcm9wcy50eXBlLCAnbGF5ZXIgdHlwZSBjaGFuZ2VkJyk7XG5cbiAgdHJ5IHtcbiAgICBkaWZmTGF5ZXJTdHlsZXMobWFwLCBpZCwgcHJvcHMsIHByZXZQcm9wcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgfVxufVxuXG52YXIgbGF5ZXJDb3VudGVyID0gMDtcblxuZnVuY3Rpb24gTGF5ZXIocHJvcHMpIHtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB2YXIgcHJvcHNSZWYgPSB1c2VSZWYoe1xuICAgIGlkOiBwcm9wcy5pZCxcbiAgICB0eXBlOiBwcm9wcy50eXBlXG4gIH0pO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgwKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgc2V0U3R5bGVMb2FkZWQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBpZCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwcm9wcy5pZCB8fCBcImpzeC1sYXllci1cIi5jb25jYXQobGF5ZXJDb3VudGVyKyspO1xuICB9LCBbXSk7XG4gIHZhciBtYXAgPSBjb250ZXh0Lm1hcDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWFwKSB7XG4gICAgICB2YXIgZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHNldFN0eWxlTG9hZGVkKGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHZlcnNpb24gKyAxO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIG1hcC5vbignc3R5bGVkYXRhJywgZm9yY2VVcGRhdGUpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWFwLm9mZignc3R5bGVkYXRhJywgZm9yY2VVcGRhdGUpO1xuXG4gICAgICAgIGlmIChtYXAuc3R5bGUgJiYgbWFwLnN0eWxlLl9sb2FkZWQpIHtcbiAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIoaWQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFttYXBdKTtcbiAgdmFyIGxheWVyID0gbWFwICYmIG1hcC5zdHlsZSAmJiBtYXAuZ2V0TGF5ZXIoaWQpO1xuXG4gIGlmIChsYXllcikge1xuICAgIHVwZGF0ZUxheWVyKG1hcCwgaWQsIHByb3BzLCBwcm9wc1JlZi5jdXJyZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjcmVhdGVMYXllcihtYXAsIGlkLCBwcm9wcyk7XG4gIH1cblxuICBwcm9wc1JlZi5jdXJyZW50ID0gcHJvcHM7XG4gIHJldHVybiBudWxsO1xufVxuXG5MYXllci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnQgZGVmYXVsdCBMYXllcjsiLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBNYXBDb250ZXh0IGZyb20gJy4vbWFwLWNvbnRleHQnO1xuZXhwb3J0IHZhciBtYXBDb250cm9sRGVmYXVsdFByb3BzID0ge1xuICBjYXB0dXJlU2Nyb2xsOiBmYWxzZSxcbiAgY2FwdHVyZURyYWc6IHRydWUsXG4gIGNhcHR1cmVDbGljazogdHJ1ZSxcbiAgY2FwdHVyZURvdWJsZUNsaWNrOiB0cnVlLFxuICBjYXB0dXJlUG9pbnRlck1vdmU6IGZhbHNlXG59O1xuZXhwb3J0IHZhciBtYXBDb250cm9sUHJvcFR5cGVzID0ge1xuICBjYXB0dXJlU2Nyb2xsOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2FwdHVyZURyYWc6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlRG91YmxlQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlUG9pbnRlck1vdmU6IFByb3BUeXBlcy5ib29sXG59O1xuXG5mdW5jdGlvbiBvbk1vdW50KHRoaXNSZWYpIHtcbiAgdmFyIHJlZiA9IHRoaXNSZWYuY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gIHZhciBldmVudE1hbmFnZXIgPSB0aGlzUmVmLmNvbnRleHQuZXZlbnRNYW5hZ2VyO1xuXG4gIGlmICghcmVmIHx8ICFldmVudE1hbmFnZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGV2ZW50cyA9IHtcbiAgICB3aGVlbDogZnVuY3Rpb24gd2hlZWwoZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZVNjcm9sbCkge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbCkge1xuICAgICAgICBwcm9wcy5vblNjcm9sbChldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGFuc3RhcnQ6IGZ1bmN0aW9uIHBhbnN0YXJ0KGV2dCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpc1JlZi5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLmNhcHR1cmVEcmFnKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgIHByb3BzLm9uRHJhZ1N0YXJ0KGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfSxcbiAgICBhbnljbGljazogZnVuY3Rpb24gYW55Y2xpY2soZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZUNsaWNrKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgcHJvcHMub25DbGljayhldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xpY2s6IGZ1bmN0aW9uIGNsaWNrKGV2dCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpc1JlZi5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLmNhcHR1cmVDbGljaykge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgIHByb3BzLm9uQ2xpY2soZXZ0LCB0aGlzUmVmKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRibGNsaWNrOiBmdW5jdGlvbiBkYmxjbGljayhldnQpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXNSZWYucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy5jYXB0dXJlRG91YmxlQ2xpY2spIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMub25Eb3VibGVDbGljaykge1xuICAgICAgICBwcm9wcy5vbkRvdWJsZUNsaWNrKGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfSxcbiAgICBwb2ludGVybW92ZTogZnVuY3Rpb24gcG9pbnRlcm1vdmUoZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZVBvaW50ZXJNb3ZlKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uUG9pbnRlck1vdmUpIHtcbiAgICAgICAgcHJvcHMub25Qb2ludGVyTW92ZShldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZXZlbnRNYW5hZ2VyLndhdGNoKGV2ZW50cywgcmVmKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBldmVudE1hbmFnZXIub2ZmKGV2ZW50cyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1hcENvbnRyb2woKSB7XG4gIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChNYXBDb250ZXh0KTtcbiAgdmFyIGNvbnRhaW5lclJlZiA9IHVzZVJlZihudWxsKTtcblxuICB2YXIgX3RoaXNSZWYgPSB1c2VSZWYoe1xuICAgIHByb3BzOiBwcm9wcyxcbiAgICBzdGF0ZToge30sXG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjb250YWluZXJSZWY6IGNvbnRhaW5lclJlZlxuICB9KTtcblxuICB2YXIgdGhpc1JlZiA9IF90aGlzUmVmLmN1cnJlbnQ7XG4gIHRoaXNSZWYucHJvcHMgPSBwcm9wcztcbiAgdGhpc1JlZi5jb250ZXh0ID0gY29udGV4dDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gb25Nb3VudCh0aGlzUmVmKTtcbiAgfSwgW2NvbnRleHQuZXZlbnRNYW5hZ2VyXSk7XG4gIHJldHVybiB0aGlzUmVmO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHtcbiAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkge1xuICAgIHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHtcbiAgICAgIHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7XG5cbiAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHVyZUNvbXBvbmVudCwgY3JlYXRlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcblxuZnVuY3Rpb24gQ29udHJvbChwcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSBwcm9wcy5pbnN0YW5jZTtcblxuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIGluc3RhbmNlLl9jb250ZXh0ID0gY29udGV4dDtcbiAgaW5zdGFuY2UuX2NvbnRhaW5lclJlZiA9IGNvbnRhaW5lclJlZjtcbiAgcmV0dXJuIGluc3RhbmNlLl9yZW5kZXIoKTtcbn1cblxudmFyIEJhc2VDb250cm9sID0gZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhCYXNlQ29udHJvbCwgX1B1cmVDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQmFzZUNvbnRyb2wpO1xuXG4gIGZ1bmN0aW9uIEJhc2VDb250cm9sKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCYXNlQ29udHJvbCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9jb250ZXh0XCIsIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfY29udGFpbmVyUmVmXCIsIGNyZWF0ZVJlZigpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfb25TY3JvbGxcIiwgZnVuY3Rpb24gKGV2dCkge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9vbkRyYWdTdGFydFwiLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX29uRGJsQ2xpY2tcIiwgZnVuY3Rpb24gKGV2dCkge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9vbkNsaWNrXCIsIGZ1bmN0aW9uIChldnQpIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfb25Qb2ludGVyTW92ZVwiLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmFzZUNvbnRyb2wsIFt7XG4gICAga2V5OiBcIl9yZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbmRlcigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignX3JlbmRlcigpIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udHJvbCwgX2V4dGVuZHMoe1xuICAgICAgICBpbnN0YW5jZTogdGhpc1xuICAgICAgfSwgdGhpcy5wcm9wcywge1xuICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGwsXG4gICAgICAgIG9uRHJhZ1N0YXJ0OiB0aGlzLl9vbkRyYWdTdGFydCxcbiAgICAgICAgb25EYmxDbGljazogdGhpcy5fb25EYmxDbGljayxcbiAgICAgICAgb25DbGljazogdGhpcy5fb25DbGljayxcbiAgICAgICAgb25Qb2ludGVyTW92ZTogdGhpcy5fb25Qb2ludGVyTW92ZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCYXNlQ29udHJvbDtcbn0oUHVyZUNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShCYXNlQ29udHJvbCwgXCJwcm9wVHlwZXNcIiwgbWFwQ29udHJvbFByb3BUeXBlcyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShCYXNlQ29udHJvbCwgXCJkZWZhdWx0UHJvcHNcIiwgbWFwQ29udHJvbERlZmF1bHRQcm9wcyk7XG5cbmV4cG9ydCB7IEJhc2VDb250cm9sIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL3VzZS1tYXAtY29udHJvbCc7XG5leHBvcnQgdmFyIGRyYWdnYWJsZUNvbnRyb2xQcm9wVHlwZXMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sUHJvcFR5cGVzLCB7XG4gIGRyYWdnYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIG9uRHJhZzogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRHJhZ0VuZDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRHJhZ1N0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb2Zmc2V0TGVmdDogUHJvcFR5cGVzLm51bWJlcixcbiAgb2Zmc2V0VG9wOiBQcm9wVHlwZXMubnVtYmVyXG59KTtcbmV4cG9ydCB2YXIgZHJhZ2dhYmxlQ29udHJvbERlZmF1bHRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIHtcbiAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgb2Zmc2V0TGVmdDogMCxcbiAgb2Zmc2V0VG9wOiAwXG59KTtcblxuZnVuY3Rpb24gZ2V0RHJhZ0V2ZW50UG9zaXRpb24oZXZlbnQpIHtcbiAgdmFyIF9ldmVudCRvZmZzZXRDZW50ZXIgPSBldmVudC5vZmZzZXRDZW50ZXIsXG4gICAgICB4ID0gX2V2ZW50JG9mZnNldENlbnRlci54LFxuICAgICAgeSA9IF9ldmVudCRvZmZzZXRDZW50ZXIueTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZnVuY3Rpb24gZ2V0RHJhZ0V2ZW50T2Zmc2V0KGV2ZW50LCBjb250YWluZXIpIHtcbiAgdmFyIF9ldmVudCRjZW50ZXIgPSBldmVudC5jZW50ZXIsXG4gICAgICB4ID0gX2V2ZW50JGNlbnRlci54LFxuICAgICAgeSA9IF9ldmVudCRjZW50ZXIueTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgdmFyIHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFtyZWN0LmxlZnQgLSB4LCByZWN0LnRvcCAtIHldO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldERyYWdMbmdMYXQoZHJhZ1BvcywgZHJhZ09mZnNldCwgcHJvcHMsIGNvbnRleHQpIHtcbiAgdmFyIHggPSBkcmFnUG9zWzBdICsgZHJhZ09mZnNldFswXSAtIHByb3BzLm9mZnNldExlZnQ7XG4gIHZhciB5ID0gZHJhZ1Bvc1sxXSArIGRyYWdPZmZzZXRbMV0gLSBwcm9wcy5vZmZzZXRUb3A7XG4gIHJldHVybiBjb250ZXh0LnZpZXdwb3J0LnVucHJvamVjdChbeCwgeV0pO1xufVxuXG5mdW5jdGlvbiBvbkRyYWdTdGFydChldmVudCwgX3JlZikge1xuICB2YXIgcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgICAgY2FsbGJhY2tzID0gX3JlZi5jYWxsYmFja3MsXG4gICAgICBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBjb250ZXh0ID0gX3JlZi5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3JlZi5jb250YWluZXJSZWY7XG4gIHZhciBkcmFnZ2FibGUgPSBwcm9wcy5kcmFnZ2FibGU7XG5cbiAgaWYgKCFkcmFnZ2FibGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgdmFyIGRyYWdQb3MgPSBnZXREcmFnRXZlbnRQb3NpdGlvbihldmVudCk7XG4gIHZhciBkcmFnT2Zmc2V0ID0gZ2V0RHJhZ0V2ZW50T2Zmc2V0KGV2ZW50LCBjb250YWluZXJSZWYuY3VycmVudCk7XG4gIHN0YXRlLnNldERyYWdQb3MoZHJhZ1Bvcyk7XG4gIHN0YXRlLnNldERyYWdPZmZzZXQoZHJhZ09mZnNldCk7XG5cbiAgaWYgKGNhbGxiYWNrcy5vbkRyYWdTdGFydCAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgdmFyIGNhbGxiYWNrRXZlbnQgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudCk7XG4gICAgY2FsbGJhY2tFdmVudC5sbmdMYXQgPSBnZXREcmFnTG5nTGF0KGRyYWdQb3MsIGRyYWdPZmZzZXQsIHByb3BzLCBjb250ZXh0KTtcbiAgICBjYWxsYmFja3Mub25EcmFnU3RhcnQoY2FsbGJhY2tFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25EcmFnKGV2ZW50LCBfcmVmMikge1xuICB2YXIgcHJvcHMgPSBfcmVmMi5wcm9wcyxcbiAgICAgIGNhbGxiYWNrcyA9IF9yZWYyLmNhbGxiYWNrcyxcbiAgICAgIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBjb250ZXh0ID0gX3JlZjIuY29udGV4dDtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIHZhciBkcmFnUG9zID0gZ2V0RHJhZ0V2ZW50UG9zaXRpb24oZXZlbnQpO1xuICBzdGF0ZS5zZXREcmFnUG9zKGRyYWdQb3MpO1xuICB2YXIgZHJhZ09mZnNldCA9IHN0YXRlLmRyYWdPZmZzZXQ7XG5cbiAgaWYgKGNhbGxiYWNrcy5vbkRyYWcgJiYgZHJhZ09mZnNldCkge1xuICAgIHZhciBjYWxsYmFja0V2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQpO1xuICAgIGNhbGxiYWNrRXZlbnQubG5nTGF0ID0gZ2V0RHJhZ0xuZ0xhdChkcmFnUG9zLCBkcmFnT2Zmc2V0LCBwcm9wcywgY29udGV4dCk7XG4gICAgY2FsbGJhY2tzLm9uRHJhZyhjYWxsYmFja0V2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkRyYWdFbmQoZXZlbnQsIF9yZWYzKSB7XG4gIHZhciBwcm9wcyA9IF9yZWYzLnByb3BzLFxuICAgICAgY2FsbGJhY2tzID0gX3JlZjMuY2FsbGJhY2tzLFxuICAgICAgc3RhdGUgPSBfcmVmMy5zdGF0ZSxcbiAgICAgIGNvbnRleHQgPSBfcmVmMy5jb250ZXh0O1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgdmFyIGRyYWdQb3MgPSBzdGF0ZS5kcmFnUG9zLFxuICAgICAgZHJhZ09mZnNldCA9IHN0YXRlLmRyYWdPZmZzZXQ7XG4gIHN0YXRlLnNldERyYWdQb3MobnVsbCk7XG4gIHN0YXRlLnNldERyYWdPZmZzZXQobnVsbCk7XG5cbiAgaWYgKGNhbGxiYWNrcy5vbkRyYWdFbmQgJiYgZHJhZ1BvcyAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgdmFyIGNhbGxiYWNrRXZlbnQgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudCk7XG4gICAgY2FsbGJhY2tFdmVudC5sbmdMYXQgPSBnZXREcmFnTG5nTGF0KGRyYWdQb3MsIGRyYWdPZmZzZXQsIHByb3BzLCBjb250ZXh0KTtcbiAgICBjYWxsYmFja3Mub25EcmFnRW5kKGNhbGxiYWNrRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uRHJhZ0NhbmNlbChldmVudCwgX3JlZjQpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjQuc3RhdGU7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBzdGF0ZS5zZXREcmFnUG9zKG51bGwpO1xuICBzdGF0ZS5zZXREcmFnT2Zmc2V0KG51bGwpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyh0aGlzUmVmKSB7XG4gIHZhciBldmVudE1hbmFnZXIgPSB0aGlzUmVmLmNvbnRleHQuZXZlbnRNYW5hZ2VyO1xuXG4gIGlmICghZXZlbnRNYW5hZ2VyIHx8ICF0aGlzUmVmLnN0YXRlLmRyYWdQb3MpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGV2ZW50cyA9IHtcbiAgICBwYW5tb3ZlOiBmdW5jdGlvbiBwYW5tb3ZlKGV2dCkge1xuICAgICAgcmV0dXJuIG9uRHJhZyhldnQsIHRoaXNSZWYpO1xuICAgIH0sXG4gICAgcGFuZW5kOiBmdW5jdGlvbiBwYW5lbmQoZXZ0KSB7XG4gICAgICByZXR1cm4gb25EcmFnRW5kKGV2dCwgdGhpc1JlZik7XG4gICAgfSxcbiAgICBwYW5jYW5jZWw6IGZ1bmN0aW9uIHBhbmNhbmNlbChldnQpIHtcbiAgICAgIHJldHVybiBvbkRyYWdDYW5jZWwoZXZ0LCB0aGlzUmVmKTtcbiAgICB9XG4gIH07XG4gIGV2ZW50TWFuYWdlci53YXRjaChldmVudHMpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50TWFuYWdlci5vZmYoZXZlbnRzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRHJhZ2dhYmxlQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGRyYWdQb3MgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RHJhZ1BvcyA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIGRyYWdPZmZzZXQgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0RHJhZ09mZnNldCA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdmFyIHRoaXNSZWYgPSB1c2VNYXBDb250cm9sKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIG9uRHJhZ1N0YXJ0OiBvbkRyYWdTdGFydFxuICB9KSk7XG4gIHRoaXNSZWYuY2FsbGJhY2tzID0gcHJvcHM7XG4gIHRoaXNSZWYuc3RhdGUuZHJhZ1BvcyA9IGRyYWdQb3M7XG4gIHRoaXNSZWYuc3RhdGUuc2V0RHJhZ1BvcyA9IHNldERyYWdQb3M7XG4gIHRoaXNSZWYuc3RhdGUuZHJhZ09mZnNldCA9IGRyYWdPZmZzZXQ7XG4gIHRoaXNSZWYuc3RhdGUuc2V0RHJhZ09mZnNldCA9IHNldERyYWdPZmZzZXQ7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlZ2lzdGVyRXZlbnRzKHRoaXNSZWYpO1xuICB9LCBbdGhpc1JlZi5jb250ZXh0LmV2ZW50TWFuYWdlciwgQm9vbGVhbihkcmFnUG9zKV0pO1xuICByZXR1cm4gdGhpc1JlZjtcbn0iLCJ2YXIgcGl4ZWxSYXRpbyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG5leHBvcnQgdmFyIGNyaXNwUGl4ZWwgPSBmdW5jdGlvbiBjcmlzcFBpeGVsKHNpemUpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoc2l6ZSAqIHBpeGVsUmF0aW8pIC8gcGl4ZWxSYXRpbztcbn07XG5leHBvcnQgdmFyIGNyaXNwUGVyY2VudGFnZSA9IGZ1bmN0aW9uIGNyaXNwUGVyY2VudGFnZShlbCwgcGVyY2VudGFnZSkge1xuICB2YXIgZGltZW5zaW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAneCc7XG5cbiAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2U7XG4gIH1cblxuICB2YXIgb3JpZ1NpemUgPSBkaW1lbnNpb24gPT09ICd4JyA/IGVsLm9mZnNldFdpZHRoIDogZWwub2Zmc2V0SGVpZ2h0O1xuICByZXR1cm4gY3Jpc3BQaXhlbChwZXJjZW50YWdlIC8gMTAwICogb3JpZ1NpemUpIC8gb3JpZ1NpemUgKiAxMDA7XG59OyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VEcmFnZ2FibGVDb250cm9sLCB7IGRyYWdnYWJsZUNvbnRyb2xEZWZhdWx0UHJvcHMsIGRyYWdnYWJsZUNvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL2RyYWdnYWJsZS1jb250cm9sJztcbmltcG9ydCB7IGNyaXNwUGl4ZWwgfSBmcm9tICcuLi91dGlscy9jcmlzcC1waXhlbCc7XG5pbXBvcnQgeyBnZXRUZXJyYWluRWxldmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdGVycmFpbic7XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZHJhZ2dhYmxlQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnXG59KTtcblxuZnVuY3Rpb24gZ2V0UG9zaXRpb24oX3JlZikge1xuICB2YXIgcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgICAgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgY29udGV4dCA9IF9yZWYuY29udGV4dDtcbiAgdmFyIGxvbmdpdHVkZSA9IHByb3BzLmxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlID0gcHJvcHMubGF0aXR1ZGUsXG4gICAgICBvZmZzZXRMZWZ0ID0gcHJvcHMub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcCA9IHByb3BzLm9mZnNldFRvcDtcbiAgdmFyIGRyYWdQb3MgPSBzdGF0ZS5kcmFnUG9zLFxuICAgICAgZHJhZ09mZnNldCA9IHN0YXRlLmRyYWdPZmZzZXQ7XG4gIHZhciB2aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQsXG4gICAgICBtYXAgPSBjb250ZXh0Lm1hcDtcblxuICBpZiAoZHJhZ1BvcyAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgcmV0dXJuIFtkcmFnUG9zWzBdICsgZHJhZ09mZnNldFswXSwgZHJhZ1Bvc1sxXSArIGRyYWdPZmZzZXRbMV1dO1xuICB9XG5cbiAgdmFyIGFsdGl0dWRlID0gZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIHtcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGVcbiAgfSk7XG5cbiAgdmFyIF92aWV3cG9ydCRwcm9qZWN0ID0gdmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSwgYWx0aXR1ZGVdKSxcbiAgICAgIF92aWV3cG9ydCRwcm9qZWN0MiA9IF9zbGljZWRUb0FycmF5KF92aWV3cG9ydCRwcm9qZWN0LCAyKSxcbiAgICAgIHggPSBfdmlld3BvcnQkcHJvamVjdDJbMF0sXG4gICAgICB5ID0gX3ZpZXdwb3J0JHByb2plY3QyWzFdO1xuXG4gIHggKz0gb2Zmc2V0TGVmdDtcbiAgeSArPSBvZmZzZXRUb3A7XG4gIHJldHVybiBbeCwgeV07XG59XG5cbmZ1bmN0aW9uIE1hcmtlcihwcm9wcykge1xuICB2YXIgdGhpc1JlZiA9IHVzZURyYWdnYWJsZUNvbnRyb2wocHJvcHMpO1xuICB2YXIgc3RhdGUgPSB0aGlzUmVmLnN0YXRlLFxuICAgICAgY29udGFpbmVyUmVmID0gdGhpc1JlZi5jb250YWluZXJSZWY7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZHJhZ2dhYmxlID0gcHJvcHMuZHJhZ2dhYmxlO1xuICB2YXIgZHJhZ1BvcyA9IHN0YXRlLmRyYWdQb3M7XG5cbiAgdmFyIF9nZXRQb3NpdGlvbiA9IGdldFBvc2l0aW9uKHRoaXNSZWYpLFxuICAgICAgX2dldFBvc2l0aW9uMiA9IF9zbGljZWRUb0FycmF5KF9nZXRQb3NpdGlvbiwgMiksXG4gICAgICB4ID0gX2dldFBvc2l0aW9uMlswXSxcbiAgICAgIHkgPSBfZ2V0UG9zaXRpb24yWzFdO1xuXG4gIHZhciB0cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZShcIi5jb25jYXQoY3Jpc3BQaXhlbCh4KSwgXCJweCwgXCIpLmNvbmNhdChjcmlzcFBpeGVsKHkpLCBcInB4KVwiKTtcbiAgdmFyIGN1cnNvciA9IGRyYWdnYWJsZSA/IGRyYWdQb3MgPyAnZ3JhYmJpbmcnIDogJ2dyYWInIDogJ2F1dG8nO1xuICB2YXIgY29udHJvbCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250YWluZXJTdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgY3Vyc29yOiBjdXJzb3JcbiAgICB9O1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1tYXJrZXIgXCIuY29uY2F0KGNsYXNzTmFtZSksXG4gICAgICByZWY6IHRoaXNSZWYuY29udGFpbmVyUmVmLFxuICAgICAgc3R5bGU6IGNvbnRhaW5lclN0eWxlXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9LCBbY2hpbGRyZW4sIGNsYXNzTmFtZV0pO1xuICB2YXIgY29udGFpbmVyID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgY29udGFpbmVyLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sO1xufVxuXG5NYXJrZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhNYXJrZXIpOyIsImV4cG9ydCB2YXIgQU5DSE9SX1BPU0lUSU9OID0ge1xuICB0b3A6IHtcbiAgICB4OiAwLjUsXG4gICAgeTogMFxuICB9LFxuICAndG9wLWxlZnQnOiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH0sXG4gICd0b3AtcmlnaHQnOiB7XG4gICAgeDogMSxcbiAgICB5OiAwXG4gIH0sXG4gIGJvdHRvbToge1xuICAgIHg6IDAuNSxcbiAgICB5OiAxXG4gIH0sXG4gICdib3R0b20tbGVmdCc6IHtcbiAgICB4OiAwLFxuICAgIHk6IDFcbiAgfSxcbiAgJ2JvdHRvbS1yaWdodCc6IHtcbiAgICB4OiAxLFxuICAgIHk6IDFcbiAgfSxcbiAgbGVmdDoge1xuICAgIHg6IDAsXG4gICAgeTogMC41XG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgeDogMSxcbiAgICB5OiAwLjVcbiAgfVxufTtcbnZhciBBTkNIT1JfVFlQRVMgPSBPYmplY3Qua2V5cyhBTkNIT1JfUE9TSVRJT04pO1xuZXhwb3J0IGZ1bmN0aW9uIGdldER5bmFtaWNQb3NpdGlvbihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueSxcbiAgICAgIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgc2VsZldpZHRoID0gX3JlZi5zZWxmV2lkdGgsXG4gICAgICBzZWxmSGVpZ2h0ID0gX3JlZi5zZWxmSGVpZ2h0LFxuICAgICAgYW5jaG9yID0gX3JlZi5hbmNob3IsXG4gICAgICBfcmVmJHBhZGRpbmcgPSBfcmVmLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX3JlZiRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRwYWRkaW5nO1xuICB2YXIgX0FOQ0hPUl9QT1NJVElPTiRhbmNoID0gQU5DSE9SX1BPU0lUSU9OW2FuY2hvcl0sXG4gICAgICBhbmNob3JYID0gX0FOQ0hPUl9QT1NJVElPTiRhbmNoLngsXG4gICAgICBhbmNob3JZID0gX0FOQ0hPUl9QT1NJVElPTiRhbmNoLnk7XG4gIHZhciB0b3AgPSB5IC0gYW5jaG9yWSAqIHNlbGZIZWlnaHQ7XG4gIHZhciBib3R0b20gPSB0b3AgKyBzZWxmSGVpZ2h0O1xuICB2YXIgY3V0b2ZmWSA9IE1hdGgubWF4KDAsIHBhZGRpbmcgLSB0b3ApICsgTWF0aC5tYXgoMCwgYm90dG9tIC0gaGVpZ2h0ICsgcGFkZGluZyk7XG5cbiAgaWYgKGN1dG9mZlkgPiAwKSB7XG4gICAgdmFyIGJlc3RBbmNob3JZID0gYW5jaG9yWTtcbiAgICB2YXIgbWluQ3V0b2ZmID0gY3V0b2ZmWTtcblxuICAgIGZvciAoYW5jaG9yWSA9IDA7IGFuY2hvclkgPD0gMTsgYW5jaG9yWSArPSAwLjUpIHtcbiAgICAgIHRvcCA9IHkgLSBhbmNob3JZICogc2VsZkhlaWdodDtcbiAgICAgIGJvdHRvbSA9IHRvcCArIHNlbGZIZWlnaHQ7XG4gICAgICBjdXRvZmZZID0gTWF0aC5tYXgoMCwgcGFkZGluZyAtIHRvcCkgKyBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQgKyBwYWRkaW5nKTtcblxuICAgICAgaWYgKGN1dG9mZlkgPCBtaW5DdXRvZmYpIHtcbiAgICAgICAgbWluQ3V0b2ZmID0gY3V0b2ZmWTtcbiAgICAgICAgYmVzdEFuY2hvclkgPSBhbmNob3JZO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFuY2hvclkgPSBiZXN0QW5jaG9yWTtcbiAgfVxuXG4gIHZhciB4U3RlcCA9IDAuNTtcblxuICBpZiAoYW5jaG9yWSA9PT0gMC41KSB7XG4gICAgYW5jaG9yWCA9IE1hdGguZmxvb3IoYW5jaG9yWCk7XG4gICAgeFN0ZXAgPSAxO1xuICB9XG5cbiAgdmFyIGxlZnQgPSB4IC0gYW5jaG9yWCAqIHNlbGZXaWR0aDtcbiAgdmFyIHJpZ2h0ID0gbGVmdCArIHNlbGZXaWR0aDtcbiAgdmFyIGN1dG9mZlggPSBNYXRoLm1heCgwLCBwYWRkaW5nIC0gbGVmdCkgKyBNYXRoLm1heCgwLCByaWdodCAtIHdpZHRoICsgcGFkZGluZyk7XG5cbiAgaWYgKGN1dG9mZlggPiAwKSB7XG4gICAgdmFyIGJlc3RBbmNob3JYID0gYW5jaG9yWDtcbiAgICB2YXIgX21pbkN1dG9mZiA9IGN1dG9mZlg7XG5cbiAgICBmb3IgKGFuY2hvclggPSAwOyBhbmNob3JYIDw9IDE7IGFuY2hvclggKz0geFN0ZXApIHtcbiAgICAgIGxlZnQgPSB4IC0gYW5jaG9yWCAqIHNlbGZXaWR0aDtcbiAgICAgIHJpZ2h0ID0gbGVmdCArIHNlbGZXaWR0aDtcbiAgICAgIGN1dG9mZlggPSBNYXRoLm1heCgwLCBwYWRkaW5nIC0gbGVmdCkgKyBNYXRoLm1heCgwLCByaWdodCAtIHdpZHRoICsgcGFkZGluZyk7XG5cbiAgICAgIGlmIChjdXRvZmZYIDwgX21pbkN1dG9mZikge1xuICAgICAgICBfbWluQ3V0b2ZmID0gY3V0b2ZmWDtcbiAgICAgICAgYmVzdEFuY2hvclggPSBhbmNob3JYO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFuY2hvclggPSBiZXN0QW5jaG9yWDtcbiAgfVxuXG4gIHJldHVybiBBTkNIT1JfVFlQRVMuZmluZChmdW5jdGlvbiAocG9zaXRpb25UeXBlKSB7XG4gICAgdmFyIGFuY2hvclBvc2l0aW9uID0gQU5DSE9SX1BPU0lUSU9OW3Bvc2l0aW9uVHlwZV07XG4gICAgcmV0dXJuIGFuY2hvclBvc2l0aW9uLnggPT09IGFuY2hvclggJiYgYW5jaG9yUG9zaXRpb24ueSA9PT0gYW5jaG9yWTtcbiAgfSkgfHwgYW5jaG9yO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbmltcG9ydCB7IGdldER5bmFtaWNQb3NpdGlvbiwgQU5DSE9SX1BPU0lUSU9OIH0gZnJvbSAnLi4vdXRpbHMvZHluYW1pYy1wb3NpdGlvbic7XG5pbXBvcnQgeyBnZXRUZXJyYWluRWxldmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdGVycmFpbic7XG5pbXBvcnQgeyBjcmlzcFBlcmNlbnRhZ2UsIGNyaXNwUGl4ZWwgfSBmcm9tICcuLi91dGlscy9jcmlzcC1waXhlbCc7XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnLFxuICBvZmZzZXRMZWZ0OiAwLFxuICBvZmZzZXRUb3A6IDAsXG4gIHRpcFNpemU6IDEwLFxuICBhbmNob3I6ICdib3R0b20nLFxuICBkeW5hbWljUG9zaXRpb246IHRydWUsXG4gIHNvcnRCeURlcHRoOiBmYWxzZSxcbiAgY2xvc2VCdXR0b246IHRydWUsXG4gIGNsb3NlT25DbGljazogdHJ1ZSxcbiAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHt9XG59KTtcblxuZnVuY3Rpb24gZ2V0UG9zaXRpb24ocHJvcHMsIHZpZXdwb3J0LCBlbCwgX3JlZikge1xuICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgIHggPSBfcmVmMlswXSxcbiAgICAgIHkgPSBfcmVmMlsxXTtcblxuICB2YXIgYW5jaG9yID0gcHJvcHMuYW5jaG9yLFxuICAgICAgZHluYW1pY1Bvc2l0aW9uID0gcHJvcHMuZHluYW1pY1Bvc2l0aW9uLFxuICAgICAgdGlwU2l6ZSA9IHByb3BzLnRpcFNpemU7XG5cbiAgaWYgKGVsKSB7XG4gICAgcmV0dXJuIGR5bmFtaWNQb3NpdGlvbiA/IGdldER5bmFtaWNQb3NpdGlvbih7XG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIGFuY2hvcjogYW5jaG9yLFxuICAgICAgcGFkZGluZzogdGlwU2l6ZSxcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgICAgc2VsZldpZHRoOiBlbC5jbGllbnRXaWR0aCxcbiAgICAgIHNlbGZIZWlnaHQ6IGVsLmNsaWVudEhlaWdodFxuICAgIH0pIDogYW5jaG9yO1xuICB9XG5cbiAgcmV0dXJuIGFuY2hvcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyU3R5bGUocHJvcHMsIHZpZXdwb3J0LCBlbCwgX3JlZjMsIHBvc2l0aW9uVHlwZSkge1xuICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMyksXG4gICAgICB4ID0gX3JlZjRbMF0sXG4gICAgICB5ID0gX3JlZjRbMV0sXG4gICAgICB6ID0gX3JlZjRbMl07XG5cbiAgdmFyIG9mZnNldExlZnQgPSBwcm9wcy5vZmZzZXRMZWZ0LFxuICAgICAgb2Zmc2V0VG9wID0gcHJvcHMub2Zmc2V0VG9wLFxuICAgICAgc29ydEJ5RGVwdGggPSBwcm9wcy5zb3J0QnlEZXB0aDtcbiAgdmFyIGFuY2hvclBvc2l0aW9uID0gQU5DSE9SX1BPU0lUSU9OW3Bvc2l0aW9uVHlwZV07XG4gIHZhciBsZWZ0ID0geCArIG9mZnNldExlZnQ7XG4gIHZhciB0b3AgPSB5ICsgb2Zmc2V0VG9wO1xuICB2YXIgeFBlcmNlbnRhZ2UgPSBjcmlzcFBlcmNlbnRhZ2UoZWwsIC1hbmNob3JQb3NpdGlvbi54ICogMTAwKTtcbiAgdmFyIHlQZXJjZW50YWdlID0gY3Jpc3BQZXJjZW50YWdlKGVsLCAtYW5jaG9yUG9zaXRpb24ueSAqIDEwMCwgJ3knKTtcbiAgdmFyIHN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRyYW5zZm9ybTogXCJcXG4gICAgICB0cmFuc2xhdGUoXCIuY29uY2F0KHhQZXJjZW50YWdlLCBcIiUsIFwiKS5jb25jYXQoeVBlcmNlbnRhZ2UsIFwiJSlcXG4gICAgICB0cmFuc2xhdGUoXCIpLmNvbmNhdChjcmlzcFBpeGVsKGxlZnQpLCBcInB4LCBcIikuY29uY2F0KGNyaXNwUGl4ZWwodG9wKSwgXCJweClcXG4gICAgXCIpLFxuICAgIGRpc3BsYXk6IHVuZGVmaW5lZCxcbiAgICB6SW5kZXg6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGlmICghc29ydEJ5RGVwdGgpIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBpZiAoeiA+IDEgfHwgeiA8IC0xIHx8IHggPCAwIHx8IHggPiB2aWV3cG9ydC53aWR0aCB8fCB5IDwgMCB8fCB5ID4gdmlld3BvcnQuaGVpZ2h0KSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS56SW5kZXggPSBNYXRoLmZsb29yKCgxIC0geikgLyAyICogMTAwMDAwKTtcbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gb25DbGljayhldnQsIF9yZWY1KSB7XG4gIHZhciBwcm9wcyA9IF9yZWY1LnByb3BzLFxuICAgICAgY29udGV4dCA9IF9yZWY1LmNvbnRleHQ7XG5cbiAgaWYgKHByb3BzLmNsb3NlT25DbGljayB8fCBldnQudGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ21hcGJveGdsLXBvcHVwLWNsb3NlLWJ1dHRvbicpIHtcbiAgICBwcm9wcy5vbkNsb3NlKCk7XG5cbiAgICBpZiAoY29udGV4dC5ldmVudE1hbmFnZXIpIHtcbiAgICAgIGNvbnRleHQuZXZlbnRNYW5hZ2VyLm9uY2UoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LCBldnQudGFyZ2V0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gUG9wdXAocHJvcHMpIHtcbiAgdmFyIGNvbnRlbnRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB0aGlzUmVmID0gdXNlTWFwQ29udHJvbChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICBvbkNsaWNrOiBvbkNsaWNrXG4gIH0pKTtcbiAgdmFyIGNvbnRleHQgPSB0aGlzUmVmLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSB0aGlzUmVmLmNvbnRhaW5lclJlZjtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzZXRMb2FkZWQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0TG9hZGVkKHRydWUpO1xuICB9LCBbY29udGVudFJlZi5jdXJyZW50XSk7XG4gIHZhciB2aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQsXG4gICAgICBtYXAgPSBjb250ZXh0Lm1hcDtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxvbmdpdHVkZSA9IHByb3BzLmxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlID0gcHJvcHMubGF0aXR1ZGUsXG4gICAgICB0aXBTaXplID0gcHJvcHMudGlwU2l6ZSxcbiAgICAgIGNsb3NlQnV0dG9uID0gcHJvcHMuY2xvc2VCdXR0b24sXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgYWx0aXR1ZGUgPSBwcm9wcy5hbHRpdHVkZTtcblxuICBpZiAoYWx0aXR1ZGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGFsdGl0dWRlID0gZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIHtcbiAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgcG9zaXRpb24gPSB2aWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIGxhdGl0dWRlLCBhbHRpdHVkZV0pO1xuICB2YXIgcG9zaXRpb25UeXBlID0gZ2V0UG9zaXRpb24ocHJvcHMsIHZpZXdwb3J0LCBjb250ZW50UmVmLmN1cnJlbnQsIHBvc2l0aW9uKTtcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gZ2V0Q29udGFpbmVyU3R5bGUocHJvcHMsIHZpZXdwb3J0LCBjb250YWluZXJSZWYuY3VycmVudCwgcG9zaXRpb24sIHBvc2l0aW9uVHlwZSk7XG4gIHZhciBvblJlYWN0Q2xpY2sgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhY29udGV4dC5ldmVudE1hbmFnZXIgJiYgb25DbGljayhlLCB0aGlzUmVmKTtcbiAgfSwgW2NvbnRleHQuZXZlbnRNYW5hZ2VyXSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtcG9wdXAgbWFwYm94Z2wtcG9wdXAtYW5jaG9yLVwiLmNvbmNhdChwb3NpdGlvblR5cGUsIFwiIFwiKS5jb25jYXQoY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogY29udGFpbmVyU3R5bGUsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcInRpcFwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1wb3B1cC10aXBcIixcbiAgICBzdHlsZToge1xuICAgICAgYm9yZGVyV2lkdGg6IHRpcFNpemVcbiAgICB9XG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiY29udGVudFwiLFxuICAgIHJlZjogY29udGVudFJlZixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtcG9wdXAtY29udGVudFwiLFxuICAgIG9uQ2xpY2s6IG9uUmVhY3RDbGlja1xuICB9LCBjbG9zZUJ1dHRvbiAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBrZXk6IFwiY2xvc2UtYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLXBvcHVwLWNsb3NlLWJ1dHRvblwiLFxuICAgIHR5cGU6IFwiYnV0dG9uXCJcbiAgfSwgXCJcXHhEN1wiKSwgY2hpbGRyZW4pKTtcbn1cblxuUG9wdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhQb3B1cCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIHRvZ2dsZUxhYmVsOiAnVG9nZ2xlIEF0dHJpYnV0aW9uJ1xufSk7XG5cbmZ1bmN0aW9uIHNldHVwQXR0cmlidXRpb25jb250cm9sKG9wdHMsIG1hcCwgY29udGFpbmVyLCBhdHRyaWJ1dGlvbkNvbnRhaW5lcikge1xuICB2YXIgY29udHJvbCA9IG5ldyBtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2wob3B0cyk7XG4gIGNvbnRyb2wuX21hcCA9IG1hcDtcbiAgY29udHJvbC5fY29udGFpbmVyID0gY29udGFpbmVyO1xuICBjb250cm9sLl9pbm5lckNvbnRhaW5lciA9IGF0dHJpYnV0aW9uQ29udGFpbmVyO1xuXG4gIGNvbnRyb2wuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuXG4gIGNvbnRyb2wuX3VwZGF0ZUVkaXRMaW5rKCk7XG5cbiAgbWFwLm9uKCdzdHlsZWRhdGEnLCBjb250cm9sLl91cGRhdGVEYXRhKTtcbiAgbWFwLm9uKCdzb3VyY2VkYXRhJywgY29udHJvbC5fdXBkYXRlRGF0YSk7XG4gIHJldHVybiBjb250cm9sO1xufVxuXG5mdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGlvbkNvbnRyb2woY29udHJvbCkge1xuICBjb250cm9sLl9tYXAub2ZmKCdzdHlsZWRhdGEnLCBjb250cm9sLl91cGRhdGVEYXRhKTtcblxuICBjb250cm9sLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgY29udHJvbC5fdXBkYXRlRGF0YSk7XG59XG5cbmZ1bmN0aW9uIEF0dHJpYnV0aW9uQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBpbm5lckNvbnRhaW5lclJlZiA9IHVzZVJlZihudWxsKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzaG93Q29tcGFjdCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTaG93Q29tcGFjdCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udHJvbDtcblxuICAgIGlmIChjb250ZXh0Lm1hcCkge1xuICAgICAgY29udHJvbCA9IHNldHVwQXR0cmlidXRpb25jb250cm9sKHtcbiAgICAgICAgY3VzdG9tQXR0cmlidXRpb246IHByb3BzLmN1c3RvbUF0dHJpYnV0aW9uXG4gICAgICB9LCBjb250ZXh0Lm1hcCwgY29udGFpbmVyUmVmLmN1cnJlbnQsIGlubmVyQ29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29udHJvbCAmJiByZW1vdmVBdHRyaWJ1dGlvbkNvbnRyb2woY29udHJvbCk7XG4gICAgfTtcbiAgfSwgW2NvbnRleHQubWFwXSk7XG4gIHZhciBjb21wYWN0ID0gcHJvcHMuY29tcGFjdCA9PT0gdW5kZWZpbmVkID8gY29udGV4dC52aWV3cG9ydC53aWR0aCA8PSA2NDAgOiBwcm9wcy5jb21wYWN0O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghY29tcGFjdCAmJiBzaG93Q29tcGFjdCkge1xuICAgICAgc2V0U2hvd0NvbXBhY3QoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2NvbXBhY3RdKTtcbiAgdmFyIHRvZ2dsZUF0dHJpYnV0aW9uID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZXRTaG93Q29tcGFjdChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIFwiYXJpYS1wcmVzc2VkXCI6IHNob3dDb21wYWN0LFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtYXR0cmliIFwiLmNvbmNhdChjb21wYWN0ID8gJ21hcGJveGdsLWNvbXBhY3QnIDogJycsIFwiIFwiKS5jb25jYXQoc2hvd0NvbXBhY3QgPyAnbWFwYm94Z2wtY29tcGFjdC1zaG93JyA6ICcnKVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWF0dHJpYi1idXR0b25cIixcbiAgICB0aXRsZTogcHJvcHMudG9nZ2xlTGFiZWwsXG4gICAgb25DbGljazogdG9nZ2xlQXR0cmlidXRpb25cbiAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogaW5uZXJDb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtYXR0cmliLWlubmVyXCIsXG4gICAgcm9sZTogXCJsaXN0XCJcbiAgfSkpKTtcbn1cblxuQXR0cmlidXRpb25Db250cm9sLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oQXR0cmlidXRpb25Db250cm9sKTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgbGFiZWw6ICdUb2dnbGUgZnVsbHNjcmVlbidcbn0pO1xuXG5mdW5jdGlvbiBGdWxsc2NyZWVuQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGlzRnVsbHNjcmVlbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRJc0Z1bGxzY3JlZW4gPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgc2hvd0J1dHRvbiA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRTaG93QnV0dG9uID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgX3VzZVN0YXRlNSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgICAgbWFwYm94RnVsbHNjcmVlbkNvbnRyb2wgPSBfdXNlU3RhdGU2WzBdLFxuICAgICAgY3JlYXRlTWFwYm94RnVsbHNjcmVlbkNvbnRyb2wgPSBfdXNlU3RhdGU2WzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRyb2wgPSBuZXcgbWFwYm94Z2wuRnVsbHNjcmVlbkNvbnRyb2woKTtcbiAgICBjcmVhdGVNYXBib3hGdWxsc2NyZWVuQ29udHJvbChjb250cm9sKTtcbiAgICBzZXRTaG93QnV0dG9uKGNvbnRyb2wuX2NoZWNrRnVsbHNjcmVlblN1cHBvcnQoKSk7XG5cbiAgICB2YXIgb25GdWxsc2NyZWVuQ2hhbmdlID0gZnVuY3Rpb24gb25GdWxsc2NyZWVuQ2hhbmdlKCkge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9ICFjb250cm9sLl9mdWxsc2NyZWVuO1xuICAgICAgY29udHJvbC5fZnVsbHNjcmVlbiA9IG5leHRTdGF0ZTtcbiAgICAgIHNldElzRnVsbHNjcmVlbihuZXh0U3RhdGUpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGNvbnRyb2wuX2Z1bGxzY3JlZW5jaGFuZ2UsIG9uRnVsbHNjcmVlbkNoYW5nZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoY29udHJvbC5fZnVsbHNjcmVlbmNoYW5nZSwgb25GdWxsc2NyZWVuQ2hhbmdlKTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdmFyIG9uQ2xpY2tGdWxsc2NyZWVuID0gZnVuY3Rpb24gb25DbGlja0Z1bGxzY3JlZW4oKSB7XG4gICAgaWYgKG1hcGJveEZ1bGxzY3JlZW5Db250cm9sKSB7XG4gICAgICBtYXBib3hGdWxsc2NyZWVuQ29udHJvbC5fY29udGFpbmVyID0gcHJvcHMuY29udGFpbmVyIHx8IGNvbnRleHQuY29udGFpbmVyO1xuXG4gICAgICBtYXBib3hGdWxsc2NyZWVuQ29udHJvbC5fb25DbGlja0Z1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuXG4gIGlmICghc2hvd0J1dHRvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWw7XG4gIHZhciB0eXBlID0gaXNGdWxsc2NyZWVuID8gJ3NocmluaycgOiAnZnVsbHNjcmVlbic7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1ncm91cFwiLFxuICAgIHJlZjogY29udGFpbmVyUmVmXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIGtleTogdHlwZSxcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uIG1hcGJveGdsLWN0cmwtXCIuY29uY2F0KHR5cGUpLFxuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgdGl0bGU6IGxhYmVsLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tGdWxsc2NyZWVuXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uXCIsXG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICB9KSkpKTtcbn1cblxuRnVsbHNjcmVlbkNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhGdWxsc2NyZWVuQ29udHJvbCk7IiwidmFyIHN1cHBvcnRlZDtcbmV4cG9ydCBmdW5jdGlvbiBpc0dlb2xvY2F0aW9uU3VwcG9ydGVkKCkge1xuICBpZiAoc3VwcG9ydGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN1cHBvcnRlZCk7XG4gIH1cblxuICBpZiAod2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe1xuICAgICAgbmFtZTogJ2dlb2xvY2F0aW9uJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHApIHtcbiAgICAgIHN1cHBvcnRlZCA9IHAuc3RhdGUgIT09ICdkZW5pZWQnO1xuICAgICAgcmV0dXJuIHN1cHBvcnRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIHN1cHBvcnRlZCA9IEJvb2xlYW4od2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbik7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydGVkKTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvZ2xvYmFscyc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IE1hcFN0YXRlIGZyb20gJy4uL3V0aWxzL21hcC1zdGF0ZSc7XG5pbXBvcnQgeyBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyB9IGZyb20gJy4uL3V0aWxzL21hcC1jb250cm9sbGVyJztcbmltcG9ydCB7IGlzR2VvbG9jYXRpb25TdXBwb3J0ZWQgfSBmcm9tICcuLi91dGlscy9nZW9sb2NhdGUtdXRpbHMnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIGxhYmVsOiAnRmluZCBNeSBMb2NhdGlvbicsXG4gIGRpc2FibGVkTGFiZWw6ICdMb2NhdGlvbiBOb3QgQXZhaWxhYmxlJyxcbiAgYXV0bzogZmFsc2UsXG4gIHBvc2l0aW9uT3B0aW9uczoge1xuICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogZmFsc2UsXG4gICAgdGltZW91dDogNjAwMFxuICB9LFxuICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgbWF4Wm9vbTogMTVcbiAgfSxcbiAgdHJhY2tVc2VyTG9jYXRpb246IGZhbHNlLFxuICBzaG93VXNlckxvY2F0aW9uOiB0cnVlLFxuICBzaG93QWNjdXJhY3lDaXJjbGU6IHRydWUsXG4gIG9uR2VvbG9jYXRlOiBmdW5jdGlvbiBvbkdlb2xvY2F0ZSgpIHt9XG59KTtcblxuZnVuY3Rpb24gZ2V0Qm91bmRzKHBvc2l0aW9uKSB7XG4gIHZhciBjZW50ZXIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7XG4gIHZhciByYWRpdXMgPSBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3k7XG4gIHZhciBib3VuZHMgPSBjZW50ZXIudG9Cb3VuZHMocmFkaXVzKTtcbiAgcmV0dXJuIFtbYm91bmRzLl9uZS5sbmcsIGJvdW5kcy5fbmUubGF0XSwgW2JvdW5kcy5fc3cubG5nLCBib3VuZHMuX3N3LmxhdF1dO1xufVxuXG5mdW5jdGlvbiBzZXR1cE1hcGJveEdlb2xvY2F0ZUNvbnRyb2woY29udGV4dCwgcHJvcHMsIGdlb2xvY2F0ZUJ1dHRvbikge1xuICB2YXIgY29udHJvbCA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHByb3BzKTtcbiAgY29udHJvbC5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRyb2wuX21hcCA9IHtcbiAgICBvbjogZnVuY3Rpb24gb24oKSB7fSxcbiAgICBfZ2V0VUlTdHJpbmc6IGZ1bmN0aW9uIF9nZXRVSVN0cmluZygpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH07XG5cbiAgY29udHJvbC5fc2V0dXBVSSh0cnVlKTtcblxuICBjb250cm9sLl9tYXAgPSBjb250ZXh0Lm1hcDtcbiAgY29udHJvbC5fZ2VvbG9jYXRlQnV0dG9uID0gZ2VvbG9jYXRlQnV0dG9uO1xuICB2YXIgZXZlbnRNYW5hZ2VyID0gY29udGV4dC5ldmVudE1hbmFnZXI7XG5cbiAgaWYgKGNvbnRyb2wub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiAmJiBldmVudE1hbmFnZXIpIHtcbiAgICBldmVudE1hbmFnZXIub24oJ3BhbnN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGNvbnRyb2wuX3dhdGNoU3RhdGUgPT09ICdBQ1RJVkVfTE9DSycpIHtcbiAgICAgICAgY29udHJvbC5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EJztcbiAgICAgICAgZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29udHJvbC5vbignZ2VvbG9jYXRlJywgcHJvcHMub25HZW9sb2NhdGUpO1xuICByZXR1cm4gY29udHJvbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FtZXJhKHBvc2l0aW9uLCBfcmVmKSB7XG4gIHZhciBjb250ZXh0ID0gX3JlZi5jb250ZXh0LFxuICAgICAgcHJvcHMgPSBfcmVmLnByb3BzO1xuICB2YXIgYm91bmRzID0gZ2V0Qm91bmRzKHBvc2l0aW9uKTtcblxuICB2YXIgX2NvbnRleHQkdmlld3BvcnQkZml0ID0gY29udGV4dC52aWV3cG9ydC5maXRCb3VuZHMoYm91bmRzLCBwcm9wcy5maXRCb3VuZHNPcHRpb25zKSxcbiAgICAgIGxvbmdpdHVkZSA9IF9jb250ZXh0JHZpZXdwb3J0JGZpdC5sb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSA9IF9jb250ZXh0JHZpZXdwb3J0JGZpdC5sYXRpdHVkZSxcbiAgICAgIHpvb20gPSBfY29udGV4dCR2aWV3cG9ydCRmaXQuem9vbTtcblxuICB2YXIgbmV3Vmlld1N0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dC52aWV3cG9ydCwge1xuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICB6b29tOiB6b29tXG4gIH0pO1xuICB2YXIgbWFwU3RhdGUgPSBuZXcgTWFwU3RhdGUobmV3Vmlld1N0YXRlKTtcbiAgdmFyIHZpZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIG1hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpO1xuICB2YXIgb25WaWV3cG9ydENoYW5nZSA9IHByb3BzLm9uVmlld3BvcnRDaGFuZ2UgfHwgY29udGV4dC5vblZpZXdwb3J0Q2hhbmdlIHx8IG5vb3A7XG4gIHZhciBvblZpZXdTdGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld1N0YXRlQ2hhbmdlIHx8IGNvbnRleHQub25WaWV3U3RhdGVDaGFuZ2UgfHwgbm9vcDtcbiAgb25WaWV3U3RhdGVDaGFuZ2Uoe1xuICAgIHZpZXdTdGF0ZTogdmlld1N0YXRlXG4gIH0pO1xuICBvblZpZXdwb3J0Q2hhbmdlKHZpZXdTdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIEdlb2xvY2F0ZUNvbnRyb2wocHJvcHMpIHtcbiAgdmFyIHRoaXNSZWYgPSB1c2VNYXBDb250cm9sKHByb3BzKTtcbiAgdmFyIGNvbnRleHQgPSB0aGlzUmVmLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSB0aGlzUmVmLmNvbnRhaW5lclJlZjtcbiAgdmFyIGdlb2xvY2F0ZUJ1dHRvblJlZiA9IHVzZVJlZihudWxsKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIG1hcGJveEdlb2xvY2F0ZUNvbnRyb2wgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgY3JlYXRlTWFwYm94R2VvbG9jYXRlQ29udHJvbCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBzdXBwb3J0c0dlb2xvY2F0aW9uID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldFN1cHBvcnRzR2VvbG9jYXRpb24gPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRyb2w7XG5cbiAgICBpZiAoY29udGV4dC5tYXApIHtcbiAgICAgIGlzR2VvbG9jYXRpb25TdXBwb3J0ZWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgc2V0U3VwcG9ydHNHZW9sb2NhdGlvbihyZXN1bHQpO1xuXG4gICAgICAgIGlmIChnZW9sb2NhdGVCdXR0b25SZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnRyb2wgPSBzZXR1cE1hcGJveEdlb2xvY2F0ZUNvbnRyb2woY29udGV4dCwgcHJvcHMsIGdlb2xvY2F0ZUJ1dHRvblJlZi5jdXJyZW50KTtcblxuICAgICAgICAgIGNvbnRyb2wuX3VwZGF0ZUNhbWVyYSA9IGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNhbWVyYShwb3NpdGlvbiwgdGhpc1JlZik7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNyZWF0ZU1hcGJveEdlb2xvY2F0ZUNvbnRyb2woY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICBjb250cm9sLl9jbGVhcldhdGNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2NvbnRleHQubWFwXSk7XG4gIHZhciB0cmlnZ2VyR2VvbG9jYXRlID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGlmIChtYXBib3hHZW9sb2NhdGVDb250cm9sKSB7XG4gICAgICBtYXBib3hHZW9sb2NhdGVDb250cm9sLm9wdGlvbnMgPSB0aGlzUmVmLnByb3BzO1xuICAgICAgbWFwYm94R2VvbG9jYXRlQ29udHJvbC50cmlnZ2VyKCk7XG4gICAgfVxuICB9LCBbbWFwYm94R2VvbG9jYXRlQ29udHJvbF0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChwcm9wcy5hdXRvKSB7XG4gICAgICB0cmlnZ2VyR2VvbG9jYXRlKCk7XG4gICAgfVxuICB9LCBbbWFwYm94R2VvbG9jYXRlQ29udHJvbCwgcHJvcHMuYXV0b10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtYXBib3hHZW9sb2NhdGVDb250cm9sKSB7XG4gICAgICBtYXBib3hHZW9sb2NhdGVDb250cm9sLl9vblpvb20oKTtcbiAgICB9XG4gIH0sIFtjb250ZXh0LnZpZXdwb3J0Lnpvb21dKTtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICBkaXNhYmxlZExhYmVsID0gcHJvcHMuZGlzYWJsZWRMYWJlbCxcbiAgICAgIHRyYWNrVXNlckxvY2F0aW9uID0gcHJvcHMudHJhY2tVc2VyTG9jYXRpb247XG4gIHZhciBzdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSwgcHJvcHMuc3R5bGUpO1xuICB9LCBbcHJvcHMuc3R5bGVdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ2VvbG9jYXRlLWNvbnRyb2xcIixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAga2V5OiBcImdlb2xvY2F0ZVwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWljb24gbWFwYm94Z2wtY3RybC1nZW9sb2NhdGVcIixcbiAgICByZWY6IGdlb2xvY2F0ZUJ1dHRvblJlZixcbiAgICBkaXNhYmxlZDogIXN1cHBvcnRzR2VvbG9jYXRpb24sXG4gICAgXCJhcmlhLXByZXNzZWRcIjogIXRyYWNrVXNlckxvY2F0aW9uLFxuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgdGl0bGU6IHN1cHBvcnRzR2VvbG9jYXRpb24gPyBsYWJlbCA6IGRpc2FibGVkTGFiZWwsXG4gICAgXCJhcmlhLWxhYmVsXCI6IHN1cHBvcnRzR2VvbG9jYXRpb24gPyBsYWJlbCA6IGRpc2FibGVkTGFiZWwsXG4gICAgb25DbGljazogdHJpZ2dlckdlb2xvY2F0ZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvblwiLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgfSkpKSk7XG59XG5cbkdlb2xvY2F0ZUNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhHZW9sb2NhdGVDb250cm9sKTsiLCJleHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKHZlcnNpb24xLCB2ZXJzaW9uMikge1xuICB2YXIgdjEgPSAodmVyc2lvbjEgfHwgJycpLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gIHZhciB2MiA9ICh2ZXJzaW9uMiB8fCAnJykuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIHZhciBwYXJ0MSA9IHYxW2ldIHx8IDA7XG4gICAgdmFyIHBhcnQyID0gdjJbaV0gfHwgMDtcblxuICAgIGlmIChwYXJ0MSA8IHBhcnQyKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnQxID4gcGFydDIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNYXBTdGF0ZSBmcm9tICcuLi91dGlscy9tYXAtc3RhdGUnO1xuaW1wb3J0IHsgTElORUFSX1RSQU5TSVRJT05fUFJPUFMgfSBmcm9tICcuLi91dGlscy9tYXAtY29udHJvbGxlcic7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uJztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL3VzZS1tYXAtY29udHJvbCc7XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnLFxuICBzaG93Q29tcGFzczogdHJ1ZSxcbiAgc2hvd1pvb206IHRydWUsXG4gIHpvb21JbkxhYmVsOiAnWm9vbSBJbicsXG4gIHpvb21PdXRMYWJlbDogJ1pvb20gT3V0JyxcbiAgY29tcGFzc0xhYmVsOiAnUmVzZXQgTm9ydGgnXG59KTtcbnZhciBWRVJTSU9OX0xFR0FDWSA9IDE7XG52YXIgVkVSU0lPTl8xXzYgPSAyO1xuXG5mdW5jdGlvbiBnZXRVSVZlcnNpb24obWFwYm94VmVyc2lvbikge1xuICByZXR1cm4gY29tcGFyZVZlcnNpb25zKG1hcGJveFZlcnNpb24sICcxLjYuMCcpID49IDAgPyBWRVJTSU9OXzFfNiA6IFZFUlNJT05fTEVHQUNZO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWaWV3cG9ydChjb250ZXh0LCBwcm9wcywgb3B0cykge1xuICB2YXIgdmlld3BvcnQgPSBjb250ZXh0LnZpZXdwb3J0O1xuICB2YXIgbWFwU3RhdGUgPSBuZXcgTWFwU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgdmlld3BvcnQsIG9wdHMpKTtcbiAgdmFyIHZpZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIG1hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpO1xuICB2YXIgb25WaWV3cG9ydENoYW5nZSA9IHByb3BzLm9uVmlld3BvcnRDaGFuZ2UgfHwgY29udGV4dC5vblZpZXdwb3J0Q2hhbmdlIHx8IG5vb3A7XG4gIHZhciBvblZpZXdTdGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld1N0YXRlQ2hhbmdlIHx8IGNvbnRleHQub25WaWV3U3RhdGVDaGFuZ2UgfHwgbm9vcDtcbiAgb25WaWV3U3RhdGVDaGFuZ2Uoe1xuICAgIHZpZXdTdGF0ZTogdmlld1N0YXRlXG4gIH0pO1xuICBvblZpZXdwb3J0Q2hhbmdlKHZpZXdTdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckJ1dHRvbih0eXBlLCBsYWJlbCwgY2FsbGJhY2ssIGNoaWxkcmVuKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBrZXk6IHR5cGUsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLVwiLmNvbmNhdCh0eXBlKSxcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIHRpdGxlOiBsYWJlbCxcbiAgICBvbkNsaWNrOiBjYWxsYmFja1xuICB9LCBjaGlsZHJlbiB8fCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvblwiLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb21wYXNzKGNvbnRleHQpIHtcbiAgdmFyIHVpVmVyc2lvbiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb250ZXh0Lm1hcCA/IGdldFVJVmVyc2lvbihjb250ZXh0Lm1hcC52ZXJzaW9uKSA6IFZFUlNJT05fMV82O1xuICB9LCBbY29udGV4dC5tYXBdKTtcbiAgdmFyIGJlYXJpbmcgPSBjb250ZXh0LnZpZXdwb3J0LmJlYXJpbmc7XG4gIHZhciBzdHlsZSA9IHtcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdCgtYmVhcmluZywgXCJkZWcpXCIpXG4gIH07XG4gIHJldHVybiB1aVZlcnNpb24gPT09IFZFUlNJT05fMV82ID8gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWljb25cIixcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9KSA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1jb21wYXNzLWFycm93XCIsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBOYXZpZ2F0aW9uQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBvblpvb21JbiA9IGZ1bmN0aW9uIG9uWm9vbUluKCkge1xuICAgIHVwZGF0ZVZpZXdwb3J0KGNvbnRleHQsIHByb3BzLCB7XG4gICAgICB6b29tOiBjb250ZXh0LnZpZXdwb3J0Lnpvb20gKyAxXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9uWm9vbU91dCA9IGZ1bmN0aW9uIG9uWm9vbU91dCgpIHtcbiAgICB1cGRhdGVWaWV3cG9ydChjb250ZXh0LCBwcm9wcywge1xuICAgICAgem9vbTogY29udGV4dC52aWV3cG9ydC56b29tIC0gMVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBvblJlc2V0Tm9ydGggPSBmdW5jdGlvbiBvblJlc2V0Tm9ydGgoKSB7XG4gICAgdXBkYXRlVmlld3BvcnQoY29udGV4dCwgcHJvcHMsIHtcbiAgICAgIGJlYXJpbmc6IDAsXG4gICAgICBwaXRjaDogMFxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzaG93Q29tcGFzcyA9IHByb3BzLnNob3dDb21wYXNzLFxuICAgICAgc2hvd1pvb20gPSBwcm9wcy5zaG93Wm9vbSxcbiAgICAgIHpvb21JbkxhYmVsID0gcHJvcHMuem9vbUluTGFiZWwsXG4gICAgICB6b29tT3V0TGFiZWwgPSBwcm9wcy56b29tT3V0TGFiZWwsXG4gICAgICBjb21wYXNzTGFiZWwgPSBwcm9wcy5jb21wYXNzTGFiZWw7XG4gIHZhciBzdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSwgcHJvcHMuc3R5bGUpO1xuICB9LCBbcHJvcHMuc3R5bGVdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgc2hvd1pvb20gJiYgcmVuZGVyQnV0dG9uKCd6b29tLWluJywgem9vbUluTGFiZWwsIG9uWm9vbUluKSwgc2hvd1pvb20gJiYgcmVuZGVyQnV0dG9uKCd6b29tLW91dCcsIHpvb21PdXRMYWJlbCwgb25ab29tT3V0KSwgc2hvd0NvbXBhc3MgJiYgcmVuZGVyQnV0dG9uKCdjb21wYXNzJywgY29tcGFzc0xhYmVsLCBvblJlc2V0Tm9ydGgsIHJlbmRlckNvbXBhc3MoY29udGV4dCkpKSk7XG59XG5cbk5hdmlnYXRpb25Db250cm9sLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oTmF2aWdhdGlvbkNvbnRyb2wpOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1hcGJveGdsIGZyb20gJy4uL3V0aWxzL21hcGJveGdsJztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL3VzZS1tYXAtY29udHJvbCc7XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnLFxuICBtYXhXaWR0aDogMTAwLFxuICB1bml0OiAnbWV0cmljJ1xufSk7XG5cbmZ1bmN0aW9uIFNjYWxlQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgbWFwYm94U2NhbGVDb250cm9sID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIGNyZWF0ZU1hcGJveFNjYWxlQ29udHJvbCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29udGV4dC5tYXApIHtcbiAgICAgIHZhciBjb250cm9sID0gbmV3IG1hcGJveGdsLlNjYWxlQ29udHJvbCgpO1xuICAgICAgY29udHJvbC5fbWFwID0gY29udGV4dC5tYXA7XG4gICAgICBjb250cm9sLl9jb250YWluZXIgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNyZWF0ZU1hcGJveFNjYWxlQ29udHJvbChjb250cm9sKTtcbiAgICB9XG4gIH0sIFtjb250ZXh0Lm1hcF0pO1xuXG4gIGlmIChtYXBib3hTY2FsZUNvbnRyb2wpIHtcbiAgICBtYXBib3hTY2FsZUNvbnRyb2wub3B0aW9ucyA9IHByb3BzO1xuXG4gICAgbWFwYm94U2NhbGVDb250cm9sLl9vbk1vdmUoKTtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSwgcHJvcHMuc3R5bGUpO1xuICB9LCBbcHJvcHMuc3R5bGVdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlXCJcbiAgfSkpO1xufVxuXG5TY2FsZUNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhTY2FsZUNvbnRyb2wpOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3VzZS1tYXAtY29udHJvbCc7XG52YXIgcGl4ZWxSYXRpbyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjYXB0dXJlU2Nyb2xsOiBmYWxzZSxcbiAgY2FwdHVyZURyYWc6IGZhbHNlLFxuICBjYXB0dXJlQ2xpY2s6IGZhbHNlLFxuICBjYXB0dXJlRG91YmxlQ2xpY2s6IGZhbHNlLFxuICBjYXB0dXJlUG9pbnRlck1vdmU6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBDYW52YXNPdmVybGF5KHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBjdHggPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RHJhd2luZ0NvbnRleHQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0RHJhd2luZ0NvbnRleHQoY29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Q29udGV4dCgnMmQnKSk7XG4gIH0sIFtdKTtcbiAgdmFyIHZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydCxcbiAgICAgIGlzRHJhZ2dpbmcgPSBjb250ZXh0LmlzRHJhZ2dpbmc7XG5cbiAgaWYgKGN0eCkge1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnNjYWxlKHBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuICAgIHByb3BzLnJlZHJhdyh7XG4gICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICAgIGN0eDogY3R4LFxuICAgICAgaXNEcmFnZ2luZzogaXNEcmFnZ2luZyxcbiAgICAgIHByb2plY3Q6IHZpZXdwb3J0LnByb2plY3QsXG4gICAgICB1bnByb2plY3Q6IHZpZXdwb3J0LnVucHJvamVjdFxuICAgIH0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoICogcGl4ZWxSYXRpbyxcbiAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCAqIHBpeGVsUmF0aW8sXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdCh2aWV3cG9ydC53aWR0aCwgXCJweFwiKSxcbiAgICAgIGhlaWdodDogXCJcIi5jb25jYXQodmlld3BvcnQuaGVpZ2h0LCBcInB4XCIpLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfVxuICB9KTtcbn1cblxuQ2FudmFzT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBDYW52YXNPdmVybGF5OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IGZhbHNlLFxuICBjYXB0dXJlRHJhZzogZmFsc2UsXG4gIGNhcHR1cmVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVEb3VibGVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIEhUTUxPdmVybGF5KHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIHZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydCxcbiAgICAgIGlzRHJhZ2dpbmcgPSBjb250ZXh0LmlzRHJhZ2dpbmc7XG5cbiAgdmFyIHN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0XG4gIH0sIHByb3BzLnN0eWxlKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzLnJlZHJhdyh7XG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmcsXG4gICAgcHJvamVjdDogdmlld3BvcnQucHJvamVjdCxcbiAgICB1bnByb2plY3Q6IHZpZXdwb3J0LnVucHJvamVjdFxuICB9KSk7XG59XG5cbkhUTUxPdmVybGF5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEhUTUxPdmVybGF5OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IGZhbHNlLFxuICBjYXB0dXJlRHJhZzogZmFsc2UsXG4gIGNhcHR1cmVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVEb3VibGVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIFNWR092ZXJsYXkocHJvcHMpIHtcbiAgdmFyIF91c2VNYXBDb250cm9sID0gdXNlTWFwQ29udHJvbChwcm9wcyksXG4gICAgICBjb250ZXh0ID0gX3VzZU1hcENvbnRyb2wuY29udGV4dCxcbiAgICAgIGNvbnRhaW5lclJlZiA9IF91c2VNYXBDb250cm9sLmNvbnRhaW5lclJlZjtcblxuICB2YXIgdmlld3BvcnQgPSBjb250ZXh0LnZpZXdwb3J0LFxuICAgICAgaXNEcmFnZ2luZyA9IGNvbnRleHQuaXNEcmFnZ2luZztcblxuICB2YXIgc3R5bGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMFxuICB9LCBwcm9wcy5zdHlsZSk7XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMucmVkcmF3KHtcbiAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHQsXG4gICAgaXNEcmFnZ2luZzogaXNEcmFnZ2luZyxcbiAgICBwcm9qZWN0OiB2aWV3cG9ydC5wcm9qZWN0LFxuICAgIHVucHJvamVjdDogdmlld3BvcnQudW5wcm9qZWN0XG4gIH0pKTtcbn1cblxuU1ZHT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBTVkdPdmVybGF5OyIsImltcG9ydCBtYXBib3hnbCBmcm9tICcuL21hcGJveGdsJztcbnZhciBzZXRSVExUZXh0UGx1Z2luID0gbWFwYm94Z2wgPyBtYXBib3hnbC5zZXRSVExUZXh0UGx1Z2luIDogZnVuY3Rpb24gKCkge307XG5leHBvcnQgZGVmYXVsdCBzZXRSVExUZXh0UGx1Z2luOyIsImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbXBvbmVudHMvaW50ZXJhY3RpdmUtbWFwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW50ZXJhY3RpdmVNYXAgfSBmcm9tICcuL2NvbXBvbmVudHMvaW50ZXJhY3RpdmUtbWFwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RhdGljTWFwIH0gZnJvbSAnLi9jb21wb25lbnRzL3N0YXRpYy1tYXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTb3VyY2UgfSBmcm9tICcuL2NvbXBvbmVudHMvc291cmNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGF5ZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvbGF5ZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYXNlQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9iYXNlLWNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXJrZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvbWFya2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9wdXAgfSBmcm9tICcuL2NvbXBvbmVudHMvcG9wdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBdHRyaWJ1dGlvbkNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvYXR0cmlidXRpb24tY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZ1bGxzY3JlZW5Db250cm9sIH0gZnJvbSAnLi9jb21wb25lbnRzL2Z1bGxzY3JlZW4tY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdlb2xvY2F0ZUNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvZ2VvbG9jYXRlLWNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZpZ2F0aW9uQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9uYXZpZ2F0aW9uLWNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTY2FsZUNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvc2NhbGUtY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhbnZhc092ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL2NhbnZhcy1vdmVybGF5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSFRNTE92ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL2h0bWwtb3ZlcmxheSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNWR092ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL3N2Zy1vdmVybGF5JztcbmV4cG9ydCB7IFRSQU5TSVRJT05fRVZFTlRTIH0gZnJvbSAnLi91dGlscy90cmFuc2l0aW9uLW1hbmFnZXInO1xuZXhwb3J0IHsgVHJhbnNpdGlvbkludGVycG9sYXRvciwgTGluZWFySW50ZXJwb2xhdG9yLCBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yIGFzIEZseVRvSW50ZXJwb2xhdG9yIH0gZnJvbSAnLi91dGlscy90cmFuc2l0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFwQ29udHJvbGxlciB9IGZyb20gJy4vdXRpbHMvbWFwLWNvbnRyb2xsZXInO1xuZXhwb3J0IHsgV2ViTWVyY2F0b3JWaWV3cG9ydCB9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXRSVExUZXh0UGx1Z2luIH0gZnJvbSAnLi91dGlscy9zZXQtcnRsLXRleHQtcGx1Z2luJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFwQ29udGV4dCB9IGZyb20gJy4vY29tcG9uZW50cy9tYXAtY29udGV4dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIF91c2VNYXBDb250cm9sIH0gZnJvbSAnLi9jb21wb25lbnRzL3VzZS1tYXAtY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIF9NYXBDb250ZXh0IH0gZnJvbSAnLi9jb21wb25lbnRzL21hcC1jb250ZXh0JzsiLCIvKipcbiAqIEBtb2R1bGUgaGVscGVyc1xuICovXG5cbi8qKlxuICogRWFydGggUmFkaXVzIHVzZWQgd2l0aCB0aGUgSGFydmVzaW5lIGZvcm11bGEgYW5kIGFwcHJveGltYXRlcyB1c2luZyBhIHNwaGVyaWNhbCAobm9uLWVsbGlwc29pZCkgRWFydGguXG4gKlxuICogQG1lbWJlcm9mIGhlbHBlcnNcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgZWFydGhSYWRpdXMgPSA2MzcxMDA4Ljg7XG4vKipcbiAqIFVuaXQgb2YgbWVhc3VyZW1lbnQgZmFjdG9ycyB1c2luZyBhIHNwaGVyaWNhbCAobm9uLWVsbGlwc29pZCkgZWFydGggcmFkaXVzLlxuICpcbiAqIEBtZW1iZXJvZiBoZWxwZXJzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCB2YXIgZmFjdG9ycyA9IHtcbiAgY2VudGltZXRlcnM6IGVhcnRoUmFkaXVzICogMTAwLFxuICBjZW50aW1ldHJlczogZWFydGhSYWRpdXMgKiAxMDAsXG4gIGRlZ3JlZXM6IGVhcnRoUmFkaXVzIC8gMTExMzI1LFxuICBmZWV0OiBlYXJ0aFJhZGl1cyAqIDMuMjgwODQsXG4gIGluY2hlczogZWFydGhSYWRpdXMgKiAzOS4zNyxcbiAga2lsb21ldGVyczogZWFydGhSYWRpdXMgLyAxMDAwLFxuICBraWxvbWV0cmVzOiBlYXJ0aFJhZGl1cyAvIDEwMDAsXG4gIG1ldGVyczogZWFydGhSYWRpdXMsXG4gIG1ldHJlczogZWFydGhSYWRpdXMsXG4gIG1pbGVzOiBlYXJ0aFJhZGl1cyAvIDE2MDkuMzQ0LFxuICBtaWxsaW1ldGVyczogZWFydGhSYWRpdXMgKiAxMDAwLFxuICBtaWxsaW1ldHJlczogZWFydGhSYWRpdXMgKiAxMDAwLFxuICBuYXV0aWNhbG1pbGVzOiBlYXJ0aFJhZGl1cyAvIDE4NTIsXG4gIHJhZGlhbnM6IDEsXG4gIHlhcmRzOiBlYXJ0aFJhZGl1cyAqIDEuMDkzNlxufTtcbi8qKlxuICogVW5pdHMgb2YgbWVhc3VyZW1lbnQgZmFjdG9ycyBiYXNlZCBvbiAxIG1ldGVyLlxuICpcbiAqIEBtZW1iZXJvZiBoZWxwZXJzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCB2YXIgdW5pdHNGYWN0b3JzID0ge1xuICBjZW50aW1ldGVyczogMTAwLFxuICBjZW50aW1ldHJlczogMTAwLFxuICBkZWdyZWVzOiAxIC8gMTExMzI1LFxuICBmZWV0OiAzLjI4MDg0LFxuICBpbmNoZXM6IDM5LjM3LFxuICBraWxvbWV0ZXJzOiAxIC8gMTAwMCxcbiAga2lsb21ldHJlczogMSAvIDEwMDAsXG4gIG1ldGVyczogMSxcbiAgbWV0cmVzOiAxLFxuICBtaWxlczogMSAvIDE2MDkuMzQ0LFxuICBtaWxsaW1ldGVyczogMTAwMCxcbiAgbWlsbGltZXRyZXM6IDEwMDAsXG4gIG5hdXRpY2FsbWlsZXM6IDEgLyAxODUyLFxuICByYWRpYW5zOiAxIC8gZWFydGhSYWRpdXMsXG4gIHlhcmRzOiAxLjA5MzYxMzNcbn07XG4vKipcbiAqIEFyZWEgb2YgbWVhc3VyZW1lbnQgZmFjdG9ycyBiYXNlZCBvbiAxIHNxdWFyZSBtZXRlci5cbiAqXG4gKiBAbWVtYmVyb2YgaGVscGVyc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG5leHBvcnQgdmFyIGFyZWFGYWN0b3JzID0ge1xuICBhY3JlczogMC4wMDAyNDcxMDUsXG4gIGNlbnRpbWV0ZXJzOiAxMDAwMCxcbiAgY2VudGltZXRyZXM6IDEwMDAwLFxuICBmZWV0OiAxMC43NjM5MTA0MTcsXG4gIGhlY3RhcmVzOiAwLjAwMDEsXG4gIGluY2hlczogMTU1MC4wMDMxMDAwMDYsXG4gIGtpbG9tZXRlcnM6IDAuMDAwMDAxLFxuICBraWxvbWV0cmVzOiAwLjAwMDAwMSxcbiAgbWV0ZXJzOiAxLFxuICBtZXRyZXM6IDEsXG4gIG1pbGVzOiAzLjg2ZS03LFxuICBtaWxsaW1ldGVyczogMTAwMDAwMCxcbiAgbWlsbGltZXRyZXM6IDEwMDAwMDAsXG4gIHlhcmRzOiAxLjE5NTk5MDA0NlxufTtcbi8qKlxuICogV3JhcHMgYSBHZW9KU09OIHtAbGluayBHZW9tZXRyeX0gaW4gYSBHZW9KU09OIHtAbGluayBGZWF0dXJlfS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlXG4gKiBAcGFyYW0ge0dlb21ldHJ5fSBnZW9tZXRyeSBpbnB1dCBnZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlfSBhIEdlb0pTT04gRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBnZW9tZXRyeSA9IHtcbiAqICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgXCJjb29yZGluYXRlc1wiOiBbMTEwLCA1MF1cbiAqIH07XG4gKlxuICogdmFyIGZlYXR1cmUgPSB0dXJmLmZlYXR1cmUoZ2VvbWV0cnkpO1xuICpcbiAqIC8vPWZlYXR1cmVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZmVhdCA9IHtcbiAgICB0eXBlOiBcIkZlYXR1cmVcIlxuICB9O1xuXG4gIGlmIChvcHRpb25zLmlkID09PSAwIHx8IG9wdGlvbnMuaWQpIHtcbiAgICBmZWF0LmlkID0gb3B0aW9ucy5pZDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmJib3gpIHtcbiAgICBmZWF0LmJib3ggPSBvcHRpb25zLmJib3g7XG4gIH1cblxuICBmZWF0LnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICBmZWF0Lmdlb21ldHJ5ID0gZ2VvbTtcbiAgcmV0dXJuIGZlYXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBHZW9KU09OIHtAbGluayBHZW9tZXRyeX0gZnJvbSBhIEdlb21ldHJ5IHN0cmluZyB0eXBlICYgY29vcmRpbmF0ZXMuXG4gKiBGb3IgR2VvbWV0cnlDb2xsZWN0aW9uIHR5cGUgdXNlIGBoZWxwZXJzLmdlb21ldHJ5Q29sbGVjdGlvbmBcbiAqXG4gKiBAbmFtZSBnZW9tZXRyeVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgR2VvbWV0cnkgVHlwZVxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBjb29yZGluYXRlcyBDb29yZGluYXRlc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcmV0dXJucyB7R2VvbWV0cnl9IGEgR2VvSlNPTiBHZW9tZXRyeVxuICogQGV4YW1wbGVcbiAqIHZhciB0eXBlID0gXCJQb2ludFwiO1xuICogdmFyIGNvb3JkaW5hdGVzID0gWzExMCwgNTBdO1xuICogdmFyIGdlb21ldHJ5ID0gdHVyZi5nZW9tZXRyeSh0eXBlLCBjb29yZGluYXRlcyk7XG4gKiAvLyA9PiBnZW9tZXRyeVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9tZXRyeSh0eXBlLCBjb29yZGluYXRlcywgX29wdGlvbnMpIHtcbiAgaWYgKF9vcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBfb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRpbmF0ZXMpLmdlb21ldHJ5O1xuXG4gICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTtcblxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICByZXR1cm4gcG9seWdvbihjb29yZGluYXRlcykuZ2VvbWV0cnk7XG5cbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgcmV0dXJuIG11bHRpUG9pbnQoY29vcmRpbmF0ZXMpLmdlb21ldHJ5O1xuXG4gICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgcmV0dXJuIG11bHRpTGluZVN0cmluZyhjb29yZGluYXRlcykuZ2VvbWV0cnk7XG5cbiAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICByZXR1cm4gbXVsdGlQb2x5Z29uKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIGludmFsaWRcIik7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBQb2ludH0ge0BsaW5rIEZlYXR1cmV9IGZyb20gYSBQb3NpdGlvbi5cbiAqXG4gKiBAbmFtZSBwb2ludFxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjb29yZGluYXRlcyBsb25naXR1ZGUsIGxhdGl0dWRlIHBvc2l0aW9uIChlYWNoIGluIGRlY2ltYWwgZGVncmVlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxQb2ludD59IGEgUG9pbnQgZmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludCA9IHR1cmYucG9pbnQoWy03NS4zNDMsIDM5Ljk4NF0pO1xuICpcbiAqIC8vPXBvaW50XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50KGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29vcmRpbmF0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheVwiKTtcbiAgfVxuXG4gIGlmIChjb29yZGluYXRlcy5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmRpbmF0ZXMgbXVzdCBiZSBhdCBsZWFzdCAyIG51bWJlcnMgbG9uZ1wiKTtcbiAgfVxuXG4gIGlmICghaXNOdW1iZXIoY29vcmRpbmF0ZXNbMF0pIHx8ICFpc051bWJlcihjb29yZGluYXRlc1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVyc1wiKTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiUG9pbnRcIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUG9pbnR9IHtAbGluayBGZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSBhbiBBcnJheSBvZiBQb2ludCBjb29yZGluYXRlcy5cbiAqXG4gKiBAbmFtZSBwb2ludHNcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvaW50c1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBUcmFuc2xhdGUgdGhlc2UgcHJvcGVydGllcyB0byBlYWNoIEZlYXR1cmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9uPFBvaW50Pn0gUG9pbnQgRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludHMgPSB0dXJmLnBvaW50cyhbXG4gKiAgIFstNzUsIDM5XSxcbiAqICAgWy04MCwgNDVdLFxuICogICBbLTc4LCA1MF1cbiAqIF0pO1xuICpcbiAqIC8vPXBvaW50c1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludHMoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBmZWF0dXJlQ29sbGVjdGlvbihjb29yZGluYXRlcy5tYXAoZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBwb2ludChjb29yZHMsIHByb3BlcnRpZXMpO1xuICB9KSwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUG9seWdvbn0ge0BsaW5rIEZlYXR1cmV9IGZyb20gYW4gQXJyYXkgb2YgTGluZWFyUmluZ3MuXG4gKlxuICogQG5hbWUgcG9seWdvblxuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIExpbmVhclJpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8UG9seWdvbj59IFBvbHlnb24gRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFtbWy01LCA1Ml0sIFstNCwgNTZdLCBbLTIsIDUxXSwgWy03LCA1NF0sIFstNSwgNTJdXV0sIHsgbmFtZTogJ3BvbHkxJyB9KTtcbiAqXG4gKiAvLz1wb2x5Z29uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb24oY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMCwgY29vcmRpbmF0ZXNfMSA9IGNvb3JkaW5hdGVzOyBfaSA8IGNvb3JkaW5hdGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHJpbmcgPSBjb29yZGluYXRlc18xW19pXTtcblxuICAgIGlmIChyaW5nLmxlbmd0aCA8IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVhY2ggTGluZWFyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuXCIpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZ1tyaW5nLmxlbmd0aCAtIDFdLmxlbmd0aDsgaisrKSB7XG4gICAgICAvLyBDaGVjayBpZiBmaXJzdCBwb2ludCBvZiBQb2x5Z29uIGNvbnRhaW5zIHR3byBudW1iZXJzXG4gICAgICBpZiAocmluZ1tyaW5nLmxlbmd0aCAtIDFdW2pdICE9PSByaW5nWzBdW2pdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC5cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJQb2x5Z29uXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFBvbHlnb259IHtAbGluayBGZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSBhbiBBcnJheSBvZiBQb2x5Z29uIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBuYW1lIHBvbHlnb25zXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvbHlnb24gY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9uPFBvbHlnb24+fSBQb2x5Z29uIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvbHlnb25zID0gdHVyZi5wb2x5Z29ucyhbXG4gKiAgIFtbWy01LCA1Ml0sIFstNCwgNTZdLCBbLTIsIDUxXSwgWy03LCA1NF0sIFstNSwgNTJdXV0sXG4gKiAgIFtbWy0xNSwgNDJdLCBbLTE0LCA0Nl0sIFstMTIsIDQxXSwgWy0xNywgNDRdLCBbLTE1LCA0Ml1dXSxcbiAqIF0pO1xuICpcbiAqIC8vPXBvbHlnb25zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25zKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb24oY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICByZXR1cm4gcG9seWdvbihjb29yZHMsIHByb3BlcnRpZXMpO1xuICB9KSwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgTGluZVN0cmluZ30ge0BsaW5rIEZlYXR1cmV9IGZyb20gYW4gQXJyYXkgb2YgUG9zaXRpb25zLlxuICpcbiAqIEBuYW1lIGxpbmVTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvc2l0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPExpbmVTdHJpbmc+fSBMaW5lU3RyaW5nIEZlYXR1cmVcbiAqIEBleGFtcGxlXG4gKiB2YXIgbGluZXN0cmluZzEgPSB0dXJmLmxpbmVTdHJpbmcoW1stMjQsIDYzXSwgWy0yMywgNjBdLCBbLTI1LCA2NV0sIFstMjAsIDY5XV0sIHtuYW1lOiAnbGluZSAxJ30pO1xuICogdmFyIGxpbmVzdHJpbmcyID0gdHVyZi5saW5lU3RyaW5nKFtbLTE0LCA0M10sIFstMTMsIDQwXSwgWy0xNSwgNDVdLCBbLTEwLCA0OV1dLCB7bmFtZTogJ2xpbmUgMid9KTtcbiAqXG4gKiAvLz1saW5lc3RyaW5nMVxuICogLy89bGluZXN0cmluZzJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZVN0cmluZyhjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byBvciBtb3JlIHBvc2l0aW9uc1wiKTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTGluZVN0cmluZ1wiLFxuICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICB9O1xuICByZXR1cm4gZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBMaW5lU3RyaW5nfSB7QGxpbmsgRmVhdHVyZUNvbGxlY3Rpb259IGZyb20gYW4gQXJyYXkgb2YgTGluZVN0cmluZyBjb29yZGluYXRlcy5cbiAqXG4gKiBAbmFtZSBsaW5lU3RyaW5nc1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIExpbmVhclJpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9uPExpbmVTdHJpbmc+fSBMaW5lU3RyaW5nIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIGxpbmVzdHJpbmdzID0gdHVyZi5saW5lU3RyaW5ncyhbXG4gKiAgIFtbLTI0LCA2M10sIFstMjMsIDYwXSwgWy0yNSwgNjVdLCBbLTIwLCA2OV1dLFxuICogICBbWy0xNCwgNDNdLCBbLTEzLCA0MF0sIFstMTUsIDQ1XSwgWy0xMCwgNDldXVxuICogXSk7XG4gKlxuICogLy89bGluZXN0cmluZ3NcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZVN0cmluZ3MoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBmZWF0dXJlQ29sbGVjdGlvbihjb29yZGluYXRlcy5tYXAoZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBsaW5lU3RyaW5nKGNvb3JkcywgcHJvcGVydGllcyk7XG4gIH0pLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVGFrZXMgb25lIG9yIG1vcmUge0BsaW5rIEZlYXR1cmV8RmVhdHVyZXN9IGFuZCBjcmVhdGVzIGEge0BsaW5rIEZlYXR1cmVDb2xsZWN0aW9ufS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlQ29sbGVjdGlvblxuICogQHBhcmFtIHtGZWF0dXJlW119IGZlYXR1cmVzIGlucHV0IGZlYXR1cmVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlQ29sbGVjdGlvbn0gRmVhdHVyZUNvbGxlY3Rpb24gb2YgRmVhdHVyZXNcbiAqIEBleGFtcGxlXG4gKiB2YXIgbG9jYXRpb25BID0gdHVyZi5wb2ludChbLTc1LjM0MywgMzkuOTg0XSwge25hbWU6ICdMb2NhdGlvbiBBJ30pO1xuICogdmFyIGxvY2F0aW9uQiA9IHR1cmYucG9pbnQoWy03NS44MzMsIDM5LjI4NF0sIHtuYW1lOiAnTG9jYXRpb24gQid9KTtcbiAqIHZhciBsb2NhdGlvbkMgPSB0dXJmLnBvaW50KFstNzUuNTM0LCAzOS4xMjNdLCB7bmFtZTogJ0xvY2F0aW9uIEMnfSk7XG4gKlxuICogdmFyIGNvbGxlY3Rpb24gPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgbG9jYXRpb25BLFxuICogICBsb2NhdGlvbkIsXG4gKiAgIGxvY2F0aW9uQ1xuICogXSk7XG4gKlxuICogLy89Y29sbGVjdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlQ29sbGVjdGlvbihmZWF0dXJlcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGZjID0ge1xuICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIlxuICB9O1xuXG4gIGlmIChvcHRpb25zLmlkKSB7XG4gICAgZmMuaWQgPSBvcHRpb25zLmlkO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYmJveCkge1xuICAgIGZjLmJib3ggPSBvcHRpb25zLmJib3g7XG4gIH1cblxuICBmYy5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICByZXR1cm4gZmM7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aUxpbmVTdHJpbmc+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpTGluZVN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIExpbmVTdHJpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlMaW5lU3RyaW5nPn0gYSBNdWx0aUxpbmVTdHJpbmcgZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWRcbiAqIEBleGFtcGxlXG4gKiB2YXIgbXVsdGlMaW5lID0gdHVyZi5tdWx0aUxpbmVTdHJpbmcoW1tbMCwwXSxbMTAsMTBdXV0pO1xuICpcbiAqIC8vPW11bHRpTGluZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aUxpbmVTdHJpbmcoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTXVsdGlMaW5lU3RyaW5nXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEZlYXR1cmU8TXVsdGlQb2ludD59IGJhc2VkIG9uIGFcbiAqIGNvb3JkaW5hdGUgYXJyYXkuIFByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIG9wdGlvbmFsbHkuXG4gKlxuICogQG5hbWUgbXVsdGlQb2ludFxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgUG9zaXRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlQb2ludD59IGEgTXVsdGlQb2ludCBmZWF0dXJlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gY29vcmRpbmF0ZXMgYXJlIHBhc3NlZFxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aVB0ID0gdHVyZi5tdWx0aVBvaW50KFtbMCwwXSxbMTAsMTBdXSk7XG4gKlxuICogLy89bXVsdGlQdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVBvaW50KGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZ2VvbSA9IHtcbiAgICB0eXBlOiBcIk11bHRpUG9pbnRcIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aVBvbHlnb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpUG9seWdvblxuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBQb2x5Z29uc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPE11bHRpUG9seWdvbj59IGEgbXVsdGlwb2x5Z29uIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpUG9seSA9IHR1cmYubXVsdGlQb2x5Z29uKFtbW1swLDBdLFswLDEwXSxbMTAsMTBdLFsxMCwwXSxbMCwwXV1dXSk7XG4gKlxuICogLy89bXVsdGlQb2x5XG4gKlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVBvbHlnb24oY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTXVsdGlQb2x5Z29uXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEZlYXR1cmU8R2VvbWV0cnlDb2xsZWN0aW9uPn0gYmFzZWQgb24gYVxuICogY29vcmRpbmF0ZSBhcnJheS4gUHJvcGVydGllcyBjYW4gYmUgYWRkZWQgb3B0aW9uYWxseS5cbiAqXG4gKiBAbmFtZSBnZW9tZXRyeUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXk8R2VvbWV0cnk+fSBnZW9tZXRyaWVzIGFuIGFycmF5IG9mIEdlb0pTT04gR2VvbWV0cmllc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPEdlb21ldHJ5Q29sbGVjdGlvbj59IGEgR2VvSlNPTiBHZW9tZXRyeUNvbGxlY3Rpb24gRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwdCA9IHR1cmYuZ2VvbWV0cnkoXCJQb2ludFwiLCBbMTAwLCAwXSk7XG4gKiB2YXIgbGluZSA9IHR1cmYuZ2VvbWV0cnkoXCJMaW5lU3RyaW5nXCIsIFtbMTAxLCAwXSwgWzEwMiwgMV1dKTtcbiAqIHZhciBjb2xsZWN0aW9uID0gdHVyZi5nZW9tZXRyeUNvbGxlY3Rpb24oW3B0LCBsaW5lXSk7XG4gKlxuICogLy8gPT4gY29sbGVjdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9tZXRyeUNvbGxlY3Rpb24oZ2VvbWV0cmllcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJHZW9tZXRyeUNvbGxlY3Rpb25cIixcbiAgICBnZW9tZXRyaWVzOiBnZW9tZXRyaWVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSb3VuZCBudW1iZXIgdG8gcHJlY2lzaW9uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG51bSBOdW1iZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFByZWNpc2lvblxuICogQHJldHVybnMge251bWJlcn0gcm91bmRlZCBudW1iZXJcbiAqIEBleGFtcGxlXG4gKiB0dXJmLnJvdW5kKDEyMC40MzIxKVxuICogLy89MTIwXG4gKlxuICogdHVyZi5yb3VuZCgxMjAuNDMyMSwgMilcbiAqIC8vPTEyMC40M1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChudW0sIHByZWNpc2lvbikge1xuICBpZiAocHJlY2lzaW9uID09PSB2b2lkIDApIHtcbiAgICBwcmVjaXNpb24gPSAwO1xuICB9XG5cbiAgaWYgKHByZWNpc2lvbiAmJiAhKHByZWNpc2lvbiA+PSAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICB9XG5cbiAgdmFyIG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uIHx8IDApO1xuICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiBtdWx0aXBsaWVyKSAvIG11bHRpcGxpZXI7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gcmFkaWFucyB0byBhIG1vcmUgZnJpZW5kbHkgdW5pdC5cbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGtpbG9tZXRlcnMsIGNlbnRpbWV0ZXJzLCBmZWV0XG4gKlxuICogQG5hbWUgcmFkaWFuc1RvTGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyBpbiByYWRpYW5zIGFjcm9zcyB0aGUgc3BoZXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VuaXRzPVwia2lsb21ldGVyc1wiXSBjYW4gYmUgZGVncmVlcywgcmFkaWFucywgbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldHJlcyxcbiAqIG1ldGVycywga2lsb21ldHJlcywga2lsb21ldGVycy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IGRpc3RhbmNlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhZGlhbnNUb0xlbmd0aChyYWRpYW5zLCB1bml0cykge1xuICBpZiAodW5pdHMgPT09IHZvaWQgMCkge1xuICAgIHVuaXRzID0gXCJraWxvbWV0ZXJzXCI7XG4gIH1cblxuICB2YXIgZmFjdG9yID0gZmFjdG9yc1t1bml0c107XG5cbiAgaWYgKCFmYWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodW5pdHMgKyBcIiB1bml0cyBpcyBpbnZhbGlkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHJhZGlhbnMgKiBmYWN0b3I7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gYSByZWFsLXdvcmxkIHVuaXQgaW50byByYWRpYW5zXG4gKiBWYWxpZCB1bml0czogbWlsZXMsIG5hdXRpY2FsbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldGVycywgbWV0cmVzLCBraWxvbWV0ZXJzLCBjZW50aW1ldGVycywgZmVldFxuICpcbiAqIEBuYW1lIGxlbmd0aFRvUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIGluIHJlYWwgdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9XCJraWxvbWV0ZXJzXCJdIGNhbiBiZSBkZWdyZWVzLCByYWRpYW5zLCBtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0cmVzLFxuICogbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGhUb1JhZGlhbnMoZGlzdGFuY2UsIHVuaXRzKSB7XG4gIGlmICh1bml0cyA9PT0gdm9pZCAwKSB7XG4gICAgdW5pdHMgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIHZhciBmYWN0b3IgPSBmYWN0b3JzW3VuaXRzXTtcblxuICBpZiAoIWZhY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcih1bml0cyArIFwiIHVuaXRzIGlzIGludmFsaWRcIik7XG4gIH1cblxuICByZXR1cm4gZGlzdGFuY2UgLyBmYWN0b3I7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gYSByZWFsLXdvcmxkIHVuaXQgaW50byBkZWdyZWVzXG4gKiBWYWxpZCB1bml0czogbWlsZXMsIG5hdXRpY2FsbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldGVycywgbWV0cmVzLCBjZW50aW1ldGVycywga2lsb21ldHJlcywgZmVldFxuICpcbiAqIEBuYW1lIGxlbmd0aFRvRGVncmVlc1xuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIGluIHJlYWwgdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9XCJraWxvbWV0ZXJzXCJdIGNhbiBiZSBkZWdyZWVzLCByYWRpYW5zLCBtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0cmVzLFxuICogbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gZGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGhUb0RlZ3JlZXMoZGlzdGFuY2UsIHVuaXRzKSB7XG4gIHJldHVybiByYWRpYW5zVG9EZWdyZWVzKGxlbmd0aFRvUmFkaWFucyhkaXN0YW5jZSwgdW5pdHMpKTtcbn1cbi8qKlxuICogQ29udmVydHMgYW55IGJlYXJpbmcgYW5nbGUgZnJvbSB0aGUgbm9ydGggbGluZSBkaXJlY3Rpb24gKHBvc2l0aXZlIGNsb2Nrd2lzZSlcbiAqIGFuZCByZXR1cm5zIGFuIGFuZ2xlIGJldHdlZW4gMC0zNjAgZGVncmVlcyAocG9zaXRpdmUgY2xvY2t3aXNlKSwgMCBiZWluZyB0aGUgbm9ydGggbGluZVxuICpcbiAqIEBuYW1lIGJlYXJpbmdUb0F6aW11dGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIGFuZ2xlLCBiZXR3ZWVuIC0xODAgYW5kICsxODAgZGVncmVlc1xuICogQHJldHVybnMge251bWJlcn0gYW5nbGUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZWFyaW5nVG9BemltdXRoKGJlYXJpbmcpIHtcbiAgdmFyIGFuZ2xlID0gYmVhcmluZyAlIDM2MDtcblxuICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgKz0gMzYwO1xuICB9XG5cbiAgcmV0dXJuIGFuZ2xlO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhbmdsZSBpbiByYWRpYW5zIHRvIGRlZ3JlZXNcbiAqXG4gKiBAbmFtZSByYWRpYW5zVG9EZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyBhbmdsZSBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBkZWdyZWVzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFkaWFuc1RvRGVncmVlcyhyYWRpYW5zKSB7XG4gIHZhciBkZWdyZWVzID0gcmFkaWFucyAlICgyICogTWF0aC5QSSk7XG4gIHJldHVybiBkZWdyZWVzICogMTgwIC8gTWF0aC5QSTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gYW5nbGUgaW4gZGVncmVlcyB0byByYWRpYW5zXG4gKlxuICogQG5hbWUgZGVncmVlc1RvUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGRlZ3JlZXMgYW5nbGUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlc1xuICogQHJldHVybnMge251bWJlcn0gYW5nbGUgaW4gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpIHtcbiAgdmFyIHJhZGlhbnMgPSBkZWdyZWVzICUgMzYwO1xuICByZXR1cm4gcmFkaWFucyAqIE1hdGguUEkgLyAxODA7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgbGVuZ3RoIHRvIHRoZSByZXF1ZXN0ZWQgdW5pdC5cbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGtpbG9tZXRlcnMsIGNlbnRpbWV0ZXJzLCBmZWV0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSB7VW5pdHN9IFtvcmlnaW5hbFVuaXQ9XCJraWxvbWV0ZXJzXCJdIG9mIHRoZSBsZW5ndGhcbiAqIEBwYXJhbSB7VW5pdHN9IFtmaW5hbFVuaXQ9XCJraWxvbWV0ZXJzXCJdIHJldHVybmVkIHVuaXRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjb252ZXJ0ZWQgbGVuZ3RoXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMZW5ndGgobGVuZ3RoLCBvcmlnaW5hbFVuaXQsIGZpbmFsVW5pdCkge1xuICBpZiAob3JpZ2luYWxVbml0ID09PSB2b2lkIDApIHtcbiAgICBvcmlnaW5hbFVuaXQgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIGlmIChmaW5hbFVuaXQgPT09IHZvaWQgMCkge1xuICAgIGZpbmFsVW5pdCA9IFwia2lsb21ldGVyc1wiO1xuICB9XG5cbiAgaWYgKCEobGVuZ3RoID49IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibGVuZ3RoIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cblxuICByZXR1cm4gcmFkaWFuc1RvTGVuZ3RoKGxlbmd0aFRvUmFkaWFucyhsZW5ndGgsIG9yaWdpbmFsVW5pdCksIGZpbmFsVW5pdCk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgYXJlYSB0byB0aGUgcmVxdWVzdGVkIHVuaXQuXG4gKiBWYWxpZCB1bml0czoga2lsb21ldGVycywga2lsb21ldHJlcywgbWV0ZXJzLCBtZXRyZXMsIGNlbnRpbWV0cmVzLCBtaWxsaW1ldGVycywgYWNyZXMsIG1pbGVzLCB5YXJkcywgZmVldCwgaW5jaGVzLCBoZWN0YXJlc1xuICogQHBhcmFtIHtudW1iZXJ9IGFyZWEgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge1VuaXRzfSBbb3JpZ2luYWxVbml0PVwibWV0ZXJzXCJdIG9mIHRoZSBkaXN0YW5jZVxuICogQHBhcmFtIHtVbml0c30gW2ZpbmFsVW5pdD1cImtpbG9tZXRlcnNcIl0gcmV0dXJuZWQgdW5pdFxuICogQHJldHVybnMge251bWJlcn0gdGhlIGNvbnZlcnRlZCBhcmVhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBcmVhKGFyZWEsIG9yaWdpbmFsVW5pdCwgZmluYWxVbml0KSB7XG4gIGlmIChvcmlnaW5hbFVuaXQgPT09IHZvaWQgMCkge1xuICAgIG9yaWdpbmFsVW5pdCA9IFwibWV0ZXJzXCI7XG4gIH1cblxuICBpZiAoZmluYWxVbml0ID09PSB2b2lkIDApIHtcbiAgICBmaW5hbFVuaXQgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIGlmICghKGFyZWEgPj0gMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cblxuICB2YXIgc3RhcnRGYWN0b3IgPSBhcmVhRmFjdG9yc1tvcmlnaW5hbFVuaXRdO1xuXG4gIGlmICghc3RhcnRGYWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yaWdpbmFsIHVuaXRzXCIpO1xuICB9XG5cbiAgdmFyIGZpbmFsRmFjdG9yID0gYXJlYUZhY3RvcnNbZmluYWxVbml0XTtcblxuICBpZiAoIWZpbmFsRmFjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaW5hbCB1bml0c1wiKTtcbiAgfVxuXG4gIHJldHVybiBhcmVhIC8gc3RhcnRGYWN0b3IgKiBmaW5hbEZhY3Rvcjtcbn1cbi8qKlxuICogaXNOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IG51bSBOdW1iZXIgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlL2ZhbHNlXG4gKiBAZXhhbXBsZVxuICogdHVyZi5pc051bWJlcigxMjMpXG4gKiAvLz10cnVlXG4gKiB0dXJmLmlzTnVtYmVyKCdmb28nKVxuICogLy89ZmFsc2VcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIobnVtKSB7XG4gIHJldHVybiAhaXNOYU4obnVtKSAmJiBudW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkobnVtKTtcbn1cbi8qKlxuICogaXNPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IGlucHV0IHZhcmlhYmxlIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZS9mYWxzZVxuICogQGV4YW1wbGVcbiAqIHR1cmYuaXNPYmplY3Qoe2VsZXZhdGlvbjogMTB9KVxuICogLy89dHJ1ZVxuICogdHVyZi5pc09iamVjdCgnZm9vJylcbiAqIC8vPWZhbHNlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gIHJldHVybiAhIWlucHV0ICYmIGlucHV0LmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG4vKipcbiAqIFZhbGlkYXRlIEJCb3hcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBiYm94IEJCb3ggdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHRocm93cyBFcnJvciBpZiBCQm94IGlzIG5vdCB2YWxpZFxuICogQGV4YW1wbGVcbiAqIHZhbGlkYXRlQkJveChbLTE4MCwgLTQwLCAxMTAsIDUwXSlcbiAqIC8vPU9LXG4gKiB2YWxpZGF0ZUJCb3goWy0xODAsIC00MF0pXG4gKiAvLz1FcnJvclxuICogdmFsaWRhdGVCQm94KCdGb28nKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlQkJveCg1KVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlQkJveChudWxsKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlQkJveCh1bmRlZmluZWQpXG4gKiAvLz1FcnJvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJCb3goYmJveCkge1xuICBpZiAoIWJib3gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYm94IGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGJib3gpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYmJveCBtdXN0IGJlIGFuIEFycmF5XCIpO1xuICB9XG5cbiAgaWYgKGJib3gubGVuZ3RoICE9PSA0ICYmIGJib3gubGVuZ3RoICE9PSA2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzXCIpO1xuICB9XG5cbiAgYmJveC5mb3JFYWNoKGZ1bmN0aW9uIChudW0pIHtcbiAgICBpZiAoIWlzTnVtYmVyKG51bSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVyc1wiKTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBJZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIElkIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEB0aHJvd3MgRXJyb3IgaWYgSWQgaXMgbm90IHZhbGlkXG4gKiBAZXhhbXBsZVxuICogdmFsaWRhdGVJZChbLTE4MCwgLTQwLCAxMTAsIDUwXSlcbiAqIC8vPUVycm9yXG4gKiB2YWxpZGF0ZUlkKFstMTgwLCAtNDBdKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlSWQoJ0ZvbycpXG4gKiAvLz1PS1xuICogdmFsaWRhdGVJZCg1KVxuICogLy89T0tcbiAqIHZhbGlkYXRlSWQobnVsbClcbiAqIC8vPUVycm9yXG4gKiB2YWxpZGF0ZUlkKHVuZGVmaW5lZClcbiAqIC8vPUVycm9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSWQoaWQpIHtcbiAgaWYgKCFpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImlkIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKFtcInN0cmluZ1wiLCBcIm51bWJlclwiXS5pbmRleE9mKHR5cGVvZiBpZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZ1wiKTtcbiAgfVxufSIsImltcG9ydCB7IGZlYXR1cmUsIGxpbmVTdHJpbmcsIGlzT2JqZWN0LCBwb2ludCB9IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuLyoqXG4gKiBDYWxsYmFjayBmb3IgY29vcmRFYWNoXG4gKlxuICogQGNhbGxiYWNrIGNvb3JkRWFjaENhbGxiYWNrXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGN1cnJlbnRDb29yZCBUaGUgY3VycmVudCBjb29yZGluYXRlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb29yZEluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBjb29yZGluYXRlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgY29vcmRpbmF0ZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LmZvckVhY2goKVxuICpcbiAqIEBuYW1lIGNvb3JkRWFjaFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHtib29sZWFufSBbZXhjbHVkZVdyYXBDb29yZD1mYWxzZV0gd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgZmluYWwgY29vcmRpbmF0ZSBvZiBMaW5lYXJSaW5ncyB0aGF0IHdyYXBzIHRoZSByaW5nIGluIGl0cyBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgdHVyZi5wb2ludChbMjYsIDM3XSwge1wiZm9vXCI6IFwiYmFyXCJ9KSxcbiAqICAgdHVyZi5wb2ludChbMzYsIDUzXSwge1wiaGVsbG9cIjogXCJ3b3JsZFwifSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuY29vcmRFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRDb29yZFxuICogICAvLz1jb29yZEluZGV4XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiB9KTtcbiAqL1xuXG5mdW5jdGlvbiBjb29yZEVhY2goZ2VvanNvbiwgY2FsbGJhY2ssIGV4Y2x1ZGVXcmFwQ29vcmQpIHtcbiAgLy8gSGFuZGxlcyBudWxsIEdlb21ldHJ5IC0tIFNraXBzIHRoaXMgR2VvSlNPTlxuICBpZiAoZ2VvanNvbiA9PT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgaixcbiAgICAgIGssXG4gICAgICBsLFxuICAgICAgZ2VvbWV0cnksXG4gICAgICBzdG9wRyxcbiAgICAgIGNvb3JkcyxcbiAgICAgIGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLFxuICAgICAgd3JhcFNocmluayA9IDAsXG4gICAgICBjb29yZEluZGV4ID0gMCxcbiAgICAgIGlzR2VvbWV0cnlDb2xsZWN0aW9uLFxuICAgICAgdHlwZSA9IGdlb2pzb24udHlwZSxcbiAgICAgIGlzRmVhdHVyZUNvbGxlY3Rpb24gPSB0eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICBpc0ZlYXR1cmUgPSB0eXBlID09PSBcIkZlYXR1cmVcIixcbiAgICAgIHN0b3AgPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGggOiAxOyAvLyBUaGlzIGxvZ2ljIG1heSBsb29rIGEgbGl0dGxlIHdlaXJkLiBUaGUgcmVhc29uIHdoeSBpdCBpcyB0aGF0IHdheVxuICAvLyBpcyBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIGJlIGZhc3QuIEdlb0pTT04gc3VwcG9ydHMgbXVsdGlwbGUga2luZHNcbiAgLy8gb2Ygb2JqZWN0cyBhdCBpdHMgcm9vdDogRmVhdHVyZUNvbGxlY3Rpb24sIEZlYXR1cmVzLCBHZW9tZXRyaWVzLlxuICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgaGFuZGxpbmcgYWxsIG9mIHRoZW0sIGFuZCB0aGF0XG4gIC8vIG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgYGZvcmAgbG9vcHMgeW91IHNlZSBiZWxvdyBhY3R1YWxseSBqdXN0IGRvbid0IGFwcGx5XG4gIC8vIHRvIGNlcnRhaW4gaW5wdXRzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBnaXZlIHRoaXMganVzdCBhXG4gIC8vIFBvaW50IGdlb21ldHJ5LCB0aGVuIGJvdGggbG9vcHMgYXJlIHNob3J0LWNpcmN1aXRlZCBhbmQgYWxsIHdlIGRvXG4gIC8vIGlzIGdyYWR1YWxseSByZW5hbWUgdGhlIGlucHV0IHVudGlsIGl0J3MgY2FsbGVkICdnZW9tZXRyeScuXG4gIC8vXG4gIC8vIFRoaXMgYWxzbyBhaW1zIHRvIGFsbG9jYXRlIGFzIGZldyByZXNvdXJjZXMgYXMgcG9zc2libGU6IGp1c3QgYVxuICAvLyBmZXcgbnVtYmVycyBhbmQgYm9vbGVhbnMsIHJhdGhlciB0aGFuIGFueSB0ZW1wb3JhcnkgYXJyYXlzIGFzIHdvdWxkXG4gIC8vIGJlIHJlcXVpcmVkIHdpdGggdGhlIG5vcm1hbGl6YXRpb24gYXBwcm9hY2guXG5cbiAgZm9yICh2YXIgZmVhdHVyZUluZGV4ID0gMDsgZmVhdHVyZUluZGV4IDwgc3RvcDsgZmVhdHVyZUluZGV4KyspIHtcbiAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbiA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF0uZ2VvbWV0cnkgOiBpc0ZlYXR1cmUgPyBnZW9qc29uLmdlb21ldHJ5IDogZ2VvanNvbjtcbiAgICBpc0dlb21ldHJ5Q29sbGVjdGlvbiA9IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24udHlwZSA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiA6IGZhbHNlO1xuICAgIHN0b3BHID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzLmxlbmd0aCA6IDE7XG5cbiAgICBmb3IgKHZhciBnZW9tSW5kZXggPSAwOyBnZW9tSW5kZXggPCBzdG9wRzsgZ2VvbUluZGV4KyspIHtcbiAgICAgIHZhciBtdWx0aUZlYXR1cmVJbmRleCA9IDA7XG4gICAgICB2YXIgZ2VvbWV0cnlJbmRleCA9IDA7XG4gICAgICBnZW9tZXRyeSA9IGlzR2VvbWV0cnlDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24uZ2VvbWV0cmllc1tnZW9tSW5kZXhdIDogZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb247IC8vIEhhbmRsZXMgbnVsbCBHZW9tZXRyeSAtLSBTa2lwcyB0aGlzIGdlb21ldHJ5XG5cbiAgICAgIGlmIChnZW9tZXRyeSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgIHZhciBnZW9tVHlwZSA9IGdlb21ldHJ5LnR5cGU7XG4gICAgICB3cmFwU2hyaW5rID0gZXhjbHVkZVdyYXBDb29yZCAmJiAoZ2VvbVR5cGUgPT09IFwiUG9seWdvblwiIHx8IGdlb21UeXBlID09PSBcIk11bHRpUG9seWdvblwiKSA/IDEgOiAwO1xuXG4gICAgICBzd2l0Y2ggKGdlb21UeXBlKSB7XG4gICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICAgICAgICBpZiAoY2FsbGJhY2soY29vcmRzLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBjb29yZEluZGV4Kys7XG4gICAgICAgICAgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhjb29yZHNbal0sIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29vcmRJbmRleCsrO1xuICAgICAgICAgICAgaWYgKGdlb21UeXBlID09PSBcIk11bHRpUG9pbnRcIikgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSBtdWx0aUZlYXR1cmVJbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY29vcmRzW2pdLmxlbmd0aCAtIHdyYXBTaHJpbms7IGsrKykge1xuICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soY29vcmRzW2pdW2tdLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29vcmRJbmRleCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIG11bHRpRmVhdHVyZUluZGV4Kys7XG4gICAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiUG9seWdvblwiKSBnZW9tZXRyeUluZGV4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGdlb21UeXBlID09PSBcIlBvbHlnb25cIikgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZ2VvbWV0cnlJbmRleCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb29yZHNbal0ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IGNvb3Jkc1tqXVtrXS5sZW5ndGggLSB3cmFwU2hyaW5rOyBsKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soY29vcmRzW2pdW2tdW2xdLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb29yZEluZGV4Kys7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBnZW9tZXRyeUluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG11bHRpRmVhdHVyZUluZGV4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiOlxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tZXRyeS5nZW9tZXRyaWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoY29vcmRFYWNoKGdlb21ldHJ5Lmdlb21ldHJpZXNbal0sIGNhbGxiYWNrLCBleGNsdWRlV3JhcENvb3JkKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gR2VvbWV0cnkgVHlwZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGNvb3JkUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgY29vcmRSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gY3VycmVudENvb3JkIFRoZSBjdXJyZW50IGNvb3JkaW5hdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvb3JkSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGNvb3JkaW5hdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICogU3RhcnRzIGF0IGluZGV4IDAsIGlmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCwgYW5kIGF0IGluZGV4IDEgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbXVsdGlGZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIE11bHRpLUZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBjb29yZGluYXRlcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkucmVkdWNlKClcbiAqXG4gKiBAbmFtZSBjb29yZFJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxHZW9tZXRyeXxGZWF0dXJlfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudENvb3JkLCBjb29yZEluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4Y2x1ZGVXcmFwQ29vcmQ9ZmFsc2VdIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIGZpbmFsIGNvb3JkaW5hdGUgb2YgTGluZWFyUmluZ3MgdGhhdCB3cmFwcyB0aGUgcmluZyBpbiBpdHMgaXRlcmF0aW9uLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICB0dXJmLnBvaW50KFsyNiwgMzddLCB7XCJmb29cIjogXCJiYXJcIn0pLFxuICogICB0dXJmLnBvaW50KFszNiwgNTNdLCB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9KVxuICogXSk7XG4gKlxuICogdHVyZi5jb29yZFJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRDb29yZCwgY29vcmRJbmRleCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRDb29yZFxuICogICAvLz1jb29yZEluZGV4XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50Q29vcmQ7XG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGNvb3JkUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUsIGV4Y2x1ZGVXcmFwQ29vcmQpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGNvb3JkRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gICAgaWYgKGNvb3JkSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50Q29vcmQ7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KTtcbiAgfSwgZXhjbHVkZVdyYXBDb29yZCk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgcHJvcEVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgcHJvcEVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtPYmplY3R9IGN1cnJlbnRQcm9wZXJ0aWVzIFRoZSBjdXJyZW50IFByb3BlcnRpZXMgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgcHJvcGVydGllcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKlxuICogQG5hbWUgcHJvcEVhY2hcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRQcm9wZXJ0aWVzLCBmZWF0dXJlSW5kZXgpXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLnByb3BFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1jdXJyZW50UHJvcGVydGllc1xuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gcHJvcEVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgdmFyIGk7XG5cbiAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHtcbiAgICBjYXNlIFwiRmVhdHVyZUNvbGxlY3Rpb25cIjpcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjYWxsYmFjayhnZW9qc29uLmZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGkpID09PSBmYWxzZSkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZlYXR1cmVcIjpcbiAgICAgIGNhbGxiYWNrKGdlb2pzb24ucHJvcGVydGllcywgMCk7XG4gICAgICBicmVhaztcbiAgfVxufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgcHJvcFJlZHVjZVxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzIGRlcGVuZFxuICogb24gd2hldGhlciB0aGUgcmVkdWNlIG1ldGhvZCBoYXMgYW4gaW5pdGlhbFZhbHVlIGFyZ3VtZW50LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCB0byB0aGUgcmVkdWNlIG1ldGhvZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIGluaXRpYWxWYWx1ZS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBub3QgcHJvdmlkZWQ6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogQGNhbGxiYWNrIHByb3BSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7Kn0gY3VycmVudFByb3BlcnRpZXMgVGhlIGN1cnJlbnQgUHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBwcm9wZXJ0aWVzIGluIGFueSBHZW9KU09OIG9iamVjdCBpbnRvIGEgc2luZ2xlIHZhbHVlLFxuICogc2ltaWxhciB0byBob3cgQXJyYXkucmVkdWNlIHdvcmtzLiBIb3dldmVyLCBpbiB0aGlzIGNhc2Ugd2UgbGF6aWx5IHJ1blxuICogdGhlIHJlZHVjdGlvbiwgc28gYW4gYXJyYXkgb2YgYWxsIHByb3BlcnRpZXMgaXMgdW5uZWNlc3NhcnkuXG4gKlxuICogQG5hbWUgcHJvcFJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleClcbiAqIEBwYXJhbSB7Kn0gW2luaXRpYWxWYWx1ZV0gVmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSByZWR1Y3Rpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgICB0dXJmLnBvaW50KFszNiwgNTNdLCB7aGVsbG86ICd3b3JsZCd9KVxuICogXSk7XG4gKlxuICogdHVyZi5wcm9wUmVkdWNlKGZlYXR1cmVzLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSwgY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRQcm9wZXJ0aWVzXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICByZXR1cm4gY3VycmVudFByb3BlcnRpZXNcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gcHJvcFJlZHVjZShnZW9qc29uLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICBwcm9wRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50UHJvcGVydGllcztlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50UHJvcGVydGllcywgZmVhdHVyZUluZGV4KTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgZmVhdHVyZUVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgZmVhdHVyZUVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtGZWF0dXJlPGFueT59IGN1cnJlbnRGZWF0dXJlIFRoZSBjdXJyZW50IEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvXG4gKiBBcnJheS5mb3JFYWNoLlxuICpcbiAqIEBuYW1lIGZlYXR1cmVFYWNoXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4KVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmZlYXR1cmVFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZmVhdHVyZUVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgaWYgKGdlb2pzb24udHlwZSA9PT0gXCJGZWF0dXJlXCIpIHtcbiAgICBjYWxsYmFjayhnZW9qc29uLCAwKTtcbiAgfSBlbHNlIGlmIChnZW9qc29uLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrKGdlb2pzb24uZmVhdHVyZXNbaV0sIGkpID09PSBmYWxzZSkgYnJlYWs7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBmZWF0dXJlUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgZmVhdHVyZVJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtGZWF0dXJlfSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICovXG5cbi8qKlxuICogUmVkdWNlIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlUmVkdWNlXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgdHVyZi5wb2ludChbMjYsIDM3XSwge1wiZm9vXCI6IFwiYmFyXCJ9KSxcbiAqICAgdHVyZi5wb2ludChbMzYsIDUzXSwge1wiaGVsbG9cIjogXCJ3b3JsZFwifSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZmVhdHVyZVJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRGZWF0dXJlXG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGZlYXR1cmVSZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgZmVhdHVyZUVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgpIHtcbiAgICBpZiAoZmVhdHVyZUluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSBwcmV2aW91c1ZhbHVlID0gY3VycmVudEZlYXR1cmU7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCk7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogR2V0IGFsbCBjb29yZGluYXRlcyBmcm9tIGFueSBHZW9KU09OIG9iamVjdC5cbiAqXG4gKiBAbmFtZSBjb29yZEFsbFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHJldHVybnMge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlIHBvc2l0aW9uIGFycmF5XG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB2YXIgY29vcmRzID0gdHVyZi5jb29yZEFsbChmZWF0dXJlcyk7XG4gKiAvLz0gW1syNiwgMzddLCBbMzYsIDUzXV1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvb3JkQWxsKGdlb2pzb24pIHtcbiAgdmFyIGNvb3JkcyA9IFtdO1xuICBjb29yZEVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGNvb3JkKSB7XG4gICAgY29vcmRzLnB1c2goY29vcmQpO1xuICB9KTtcbiAgcmV0dXJuIGNvb3Jkcztcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGdlb21FYWNoXG4gKlxuICogQGNhbGxiYWNrIGdlb21FYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7R2VvbWV0cnl9IGN1cnJlbnRHZW9tZXRyeSBUaGUgY3VycmVudCBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlUHJvcGVydGllcyBUaGUgY3VycmVudCBGZWF0dXJlIFByb3BlcnRpZXMgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBmZWF0dXJlQkJveCBUaGUgY3VycmVudCBGZWF0dXJlIEJCb3ggYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmZWF0dXJlSWQgVGhlIGN1cnJlbnQgRmVhdHVyZSBJZCBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBnZW9tZXRyeSBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKlxuICogQG5hbWUgZ2VvbUVhY2hcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRHZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZClcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgICAgdHVyZi5wb2ludChbMzYsIDUzXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZ2VvbUVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50R2VvbWV0cnksIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpIHtcbiAqICAgLy89Y3VycmVudEdlb21ldHJ5XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1mZWF0dXJlUHJvcGVydGllc1xuICogICAvLz1mZWF0dXJlQkJveFxuICogICAvLz1mZWF0dXJlSWRcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZ2VvbUVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgdmFyIGksXG4gICAgICBqLFxuICAgICAgZyxcbiAgICAgIGdlb21ldHJ5LFxuICAgICAgc3RvcEcsXG4gICAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbixcbiAgICAgIGlzR2VvbWV0cnlDb2xsZWN0aW9uLFxuICAgICAgZmVhdHVyZVByb3BlcnRpZXMsXG4gICAgICBmZWF0dXJlQkJveCxcbiAgICAgIGZlYXR1cmVJZCxcbiAgICAgIGZlYXR1cmVJbmRleCA9IDAsXG4gICAgICBpc0ZlYXR1cmVDb2xsZWN0aW9uID0gZ2VvanNvbi50eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICBpc0ZlYXR1cmUgPSBnZW9qc29uLnR5cGUgPT09IFwiRmVhdHVyZVwiLFxuICAgICAgc3RvcCA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aCA6IDE7IC8vIFRoaXMgbG9naWMgbWF5IGxvb2sgYSBsaXR0bGUgd2VpcmQuIFRoZSByZWFzb24gd2h5IGl0IGlzIHRoYXQgd2F5XG4gIC8vIGlzIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gYmUgZmFzdC4gR2VvSlNPTiBzdXBwb3J0cyBtdWx0aXBsZSBraW5kc1xuICAvLyBvZiBvYmplY3RzIGF0IGl0cyByb290OiBGZWF0dXJlQ29sbGVjdGlvbiwgRmVhdHVyZXMsIEdlb21ldHJpZXMuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBoYW5kbGluZyBhbGwgb2YgdGhlbSwgYW5kIHRoYXRcbiAgLy8gbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBgZm9yYCBsb29wcyB5b3Ugc2VlIGJlbG93IGFjdHVhbGx5IGp1c3QgZG9uJ3QgYXBwbHlcbiAgLy8gdG8gY2VydGFpbiBpbnB1dHMuIEZvciBpbnN0YW5jZSwgaWYgeW91IGdpdmUgdGhpcyBqdXN0IGFcbiAgLy8gUG9pbnQgZ2VvbWV0cnksIHRoZW4gYm90aCBsb29wcyBhcmUgc2hvcnQtY2lyY3VpdGVkIGFuZCBhbGwgd2UgZG9cbiAgLy8gaXMgZ3JhZHVhbGx5IHJlbmFtZSB0aGUgaW5wdXQgdW50aWwgaXQncyBjYWxsZWQgJ2dlb21ldHJ5Jy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGFpbXMgdG8gYWxsb2NhdGUgYXMgZmV3IHJlc291cmNlcyBhcyBwb3NzaWJsZToganVzdCBhXG4gIC8vIGZldyBudW1iZXJzIGFuZCBib29sZWFucywgcmF0aGVyIHRoYW4gYW55IHRlbXBvcmFyeSBhcnJheXMgYXMgd291bGRcbiAgLy8gYmUgcmVxdWlyZWQgd2l0aCB0aGUgbm9ybWFsaXphdGlvbiBhcHByb2FjaC5cblxuICBmb3IgKGkgPSAwOyBpIDwgc3RvcDsgaSsrKSB7XG4gICAgZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24gPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlc1tpXS5nZW9tZXRyeSA6IGlzRmVhdHVyZSA/IGdlb2pzb24uZ2VvbWV0cnkgOiBnZW9qc29uO1xuICAgIGZlYXR1cmVQcm9wZXJ0aWVzID0gaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGdlb2pzb24uZmVhdHVyZXNbaV0ucHJvcGVydGllcyA6IGlzRmVhdHVyZSA/IGdlb2pzb24ucHJvcGVydGllcyA6IHt9O1xuICAgIGZlYXR1cmVCQm94ID0gaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGdlb2pzb24uZmVhdHVyZXNbaV0uYmJveCA6IGlzRmVhdHVyZSA/IGdlb2pzb24uYmJveCA6IHVuZGVmaW5lZDtcbiAgICBmZWF0dXJlSWQgPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlc1tpXS5pZCA6IGlzRmVhdHVyZSA/IGdlb2pzb24uaWQgOiB1bmRlZmluZWQ7XG4gICAgaXNHZW9tZXRyeUNvbGxlY3Rpb24gPSBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbiA/IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCIgOiBmYWxzZTtcbiAgICBzdG9wRyA9IGlzR2VvbWV0cnlDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24uZ2VvbWV0cmllcy5sZW5ndGggOiAxO1xuXG4gICAgZm9yIChnID0gMDsgZyA8IHN0b3BHOyBnKyspIHtcbiAgICAgIGdlb21ldHJ5ID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzW2ddIDogZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb247IC8vIEhhbmRsZSBudWxsIEdlb21ldHJ5XG5cbiAgICAgIGlmIChnZW9tZXRyeSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoY2FsbGJhY2sobnVsbCwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGdlb21ldHJ5LnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhnZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tZXRyeS5nZW9tZXRyaWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChjYWxsYmFjayhnZW9tZXRyeS5nZW9tZXRyaWVzW2pdLCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBHZW9tZXRyeSBUeXBlXCIpO1xuICAgICAgfVxuICAgIH0gLy8gT25seSBpbmNyZWFzZSBgZmVhdHVyZUluZGV4YCBwZXIgZWFjaCBmZWF0dXJlXG5cblxuICAgIGZlYXR1cmVJbmRleCsrO1xuICB9XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBnZW9tUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgZ2VvbVJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtHZW9tZXRyeX0gY3VycmVudEdlb21ldHJ5IFRoZSBjdXJyZW50IEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtPYmplY3R9IGZlYXR1cmVQcm9wZXJ0aWVzIFRoZSBjdXJyZW50IEZlYXR1cmUgUHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGZlYXR1cmVCQm94IFRoZSBjdXJyZW50IEZlYXR1cmUgQkJveCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGZlYXR1cmVJZCBUaGUgY3VycmVudCBGZWF0dXJlIElkIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBnZW9tZXRyeSBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkucmVkdWNlKCkuXG4gKlxuICogQG5hbWUgZ2VvbVJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudEdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmdlb21SZWR1Y2UoZmVhdHVyZXMsIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50R2VvbWV0cnksIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50R2VvbWV0cnlcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPWZlYXR1cmVQcm9wZXJ0aWVzXG4gKiAgIC8vPWZlYXR1cmVCQm94XG4gKiAgIC8vPWZlYXR1cmVJZFxuICogICByZXR1cm4gY3VycmVudEdlb21ldHJ5XG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGdlb21SZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgZ2VvbUVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRHZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50R2VvbWV0cnk7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudEdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgZmxhdHRlbkVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgZmxhdHRlbkVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtGZWF0dXJlfSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBmbGF0dGVuZWQgZmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZmxhdHRlbmVkIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0b1xuICogQXJyYXkuZm9yRWFjaC5cbiAqXG4gKiBAbmFtZSBmbGF0dGVuRWFjaFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpXG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgICB0dXJmLm11bHRpUG9pbnQoW1s0MCwgMzBdLCBbMzYsIDUzXV0sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmZsYXR0ZW5FYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpIHtcbiAqICAgLy89Y3VycmVudEZlYXR1cmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5FYWNoKGdlb2pzb24sIGNhbGxiYWNrKSB7XG4gIGdlb21FYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChnZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBwcm9wZXJ0aWVzLCBiYm94LCBpZCkge1xuICAgIC8vIENhbGxiYWNrIGZvciBzaW5nbGUgZ2VvbWV0cnlcbiAgICB2YXIgdHlwZSA9IGdlb21ldHJ5ID09PSBudWxsID8gbnVsbCA6IGdlb21ldHJ5LnR5cGU7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgbnVsbDpcbiAgICAgIGNhc2UgXCJQb2ludFwiOlxuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgIGlmIChjYWxsYmFjayhmZWF0dXJlKGdlb21ldHJ5LCBwcm9wZXJ0aWVzLCB7XG4gICAgICAgICAgYmJveDogYmJveCxcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSksIGZlYXR1cmVJbmRleCwgMCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZ2VvbVR5cGU7IC8vIENhbGxiYWNrIGZvciBtdWx0aS1nZW9tZXRyeVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgICBnZW9tVHlwZSA9IFwiUG9pbnRcIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgICAgZ2VvbVR5cGUgPSBcIkxpbmVTdHJpbmdcIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgICAgZ2VvbVR5cGUgPSBcIlBvbHlnb25cIjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgbXVsdGlGZWF0dXJlSW5kZXggPSAwOyBtdWx0aUZlYXR1cmVJbmRleCA8IGdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aDsgbXVsdGlGZWF0dXJlSW5kZXgrKykge1xuICAgICAgdmFyIGNvb3JkaW5hdGUgPSBnZW9tZXRyeS5jb29yZGluYXRlc1ttdWx0aUZlYXR1cmVJbmRleF07XG4gICAgICB2YXIgZ2VvbSA9IHtcbiAgICAgICAgdHlwZTogZ2VvbVR5cGUsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlXG4gICAgICB9O1xuICAgICAgaWYgKGNhbGxiYWNrKGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcyksIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBmbGF0dGVuUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgZmxhdHRlblJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtGZWF0dXJlfSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBmbGF0dGVuZWQgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LnJlZHVjZSgpLlxuICpcbiAqIEBuYW1lIGZsYXR0ZW5SZWR1Y2VcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYubXVsdGlQb2ludChbWzQwLCAzMF0sIFszNiwgNTNdXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZmxhdHRlblJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudEZlYXR1cmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50RmVhdHVyZVxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBmbGF0dGVuUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGZsYXR0ZW5FYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgbXVsdGlGZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50RmVhdHVyZTtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCk7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIHNlZ21lbnRFYWNoXG4gKlxuICogQGNhbGxiYWNrIHNlZ21lbnRFYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudFNlZ21lbnQgVGhlIGN1cnJlbnQgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnRJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciAyLXZlcnRleCBsaW5lIHNlZ21lbnQgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LmZvckVhY2goKVxuICogKE11bHRpKVBvaW50IGdlb21ldHJpZXMgZG8gbm90IGNvbnRhaW4gc2VnbWVudHMgdGhlcmVmb3JlIHRoZXkgYXJlIGlnbm9yZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudFNlZ21lbnQsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgsIHNlZ21lbnRJbmRleClcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFtbWy01MCwgNV0sIFstNDAsIC0xMF0sIFstNTAsIC0xMF0sIFstNDAsIDVdLCBbLTUwLCA1XV1dKTtcbiAqXG4gKiAvLyBJdGVyYXRlIG92ZXIgR2VvSlNPTiBieSAyLXZlcnRleCBzZWdtZW50c1xuICogdHVyZi5zZWdtZW50RWFjaChwb2x5Z29uLCBmdW5jdGlvbiAoY3VycmVudFNlZ21lbnQsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgsIHNlZ21lbnRJbmRleCkge1xuICogICAvLz1jdXJyZW50U2VnbWVudFxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgLy89bXVsdGlGZWF0dXJlSW5kZXhcbiAqICAgLy89Z2VvbWV0cnlJbmRleFxuICogICAvLz1zZWdtZW50SW5kZXhcbiAqIH0pO1xuICpcbiAqIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzXG4gKiB2YXIgdG90YWwgPSAwO1xuICogdHVyZi5zZWdtZW50RWFjaChwb2x5Z29uLCBmdW5jdGlvbiAoKSB7XG4gKiAgICAgdG90YWwrKztcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gc2VnbWVudEVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgZmxhdHRlbkVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpIHtcbiAgICB2YXIgc2VnbWVudEluZGV4ID0gMDsgLy8gRXhjbHVkZSBudWxsIEdlb21ldHJpZXNcblxuICAgIGlmICghZmVhdHVyZS5nZW9tZXRyeSkgcmV0dXJuOyAvLyAoTXVsdGkpUG9pbnQgZ2VvbWV0cmllcyBkbyBub3QgY29udGFpbiBzZWdtZW50cyB0aGVyZWZvcmUgdGhleSBhcmUgaWdub3JlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uXG5cbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gXCJQb2ludFwiIHx8IHR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSByZXR1cm47IC8vIEdlbmVyYXRlIDItdmVydGV4IGxpbmUgc2VnbWVudHNcblxuICAgIHZhciBwcmV2aW91c0Nvb3JkcztcbiAgICB2YXIgcHJldmlvdXNGZWF0dXJlSW5kZXggPSAwO1xuICAgIHZhciBwcmV2aW91c011bHRpSW5kZXggPSAwO1xuICAgIHZhciBwcmV2R2VvbUluZGV4ID0gMDtcbiAgICBpZiAoY29vcmRFYWNoKGZlYXR1cmUsIGZ1bmN0aW9uIChjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleENvb3JkLCBtdWx0aVBhcnRJbmRleENvb3JkLCBnZW9tZXRyeUluZGV4KSB7XG4gICAgICAvLyBTaW11bGF0aW5nIGEgbWV0YS5jb29yZFJlZHVjZSgpIHNpbmNlIGByZWR1Y2VgIG9wZXJhdGlvbnMgY2Fubm90IGJlIHN0b3BwZWQgYnkgcmV0dXJuaW5nIGBmYWxzZWBcbiAgICAgIGlmIChwcmV2aW91c0Nvb3JkcyA9PT0gdW5kZWZpbmVkIHx8IGZlYXR1cmVJbmRleCA+IHByZXZpb3VzRmVhdHVyZUluZGV4IHx8IG11bHRpUGFydEluZGV4Q29vcmQgPiBwcmV2aW91c011bHRpSW5kZXggfHwgZ2VvbWV0cnlJbmRleCA+IHByZXZHZW9tSW5kZXgpIHtcbiAgICAgICAgcHJldmlvdXNDb29yZHMgPSBjdXJyZW50Q29vcmQ7XG4gICAgICAgIHByZXZpb3VzRmVhdHVyZUluZGV4ID0gZmVhdHVyZUluZGV4O1xuICAgICAgICBwcmV2aW91c011bHRpSW5kZXggPSBtdWx0aVBhcnRJbmRleENvb3JkO1xuICAgICAgICBwcmV2R2VvbUluZGV4ID0gZ2VvbWV0cnlJbmRleDtcbiAgICAgICAgc2VnbWVudEluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VycmVudFNlZ21lbnQgPSBsaW5lU3RyaW5nKFtwcmV2aW91c0Nvb3JkcywgY3VycmVudENvb3JkXSwgZmVhdHVyZS5wcm9wZXJ0aWVzKTtcbiAgICAgIGlmIChjYWxsYmFjayhjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZ21lbnRJbmRleCsrO1xuICAgICAgcHJldmlvdXNDb29yZHMgPSBjdXJyZW50Q29vcmQ7XG4gICAgfSkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIH0pO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3Igc2VnbWVudFJlZHVjZVxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzIGRlcGVuZFxuICogb24gd2hldGhlciB0aGUgcmVkdWNlIG1ldGhvZCBoYXMgYW4gaW5pdGlhbFZhbHVlIGFyZ3VtZW50LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCB0byB0aGUgcmVkdWNlIG1ldGhvZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIGluaXRpYWxWYWx1ZS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBub3QgcHJvdmlkZWQ6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogQGNhbGxiYWNrIHNlZ21lbnRSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudFNlZ21lbnQgVGhlIGN1cnJlbnQgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnRJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBSZWR1Y2UgMi12ZXJ0ZXggbGluZSBzZWdtZW50IGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKVxuICogKE11bHRpKVBvaW50IGdlb21ldHJpZXMgZG8gbm90IGNvbnRhaW4gc2VnbWVudHMgdGhlcmVmb3JlIHRoZXkgYXJlIGlnbm9yZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudFNlZ21lbnQsIGN1cnJlbnRJbmRleClcbiAqIEBwYXJhbSB7Kn0gW2luaXRpYWxWYWx1ZV0gVmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9seWdvbiA9IHR1cmYucG9seWdvbihbW1stNTAsIDVdLCBbLTQwLCAtMTBdLCBbLTUwLCAtMTBdLCBbLTQwLCA1XSwgWy01MCwgNV1dXSk7XG4gKlxuICogLy8gSXRlcmF0ZSBvdmVyIEdlb0pTT04gYnkgMi12ZXJ0ZXggc2VnbWVudHNcbiAqIHR1cmYuc2VnbWVudFJlZHVjZShwb2x5Z29uLCBmdW5jdGlvbiAocHJldmlvdXNTZWdtZW50LCBjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSB7XG4gKiAgIC8vPSBwcmV2aW91c1NlZ21lbnRcbiAqICAgLy89IGN1cnJlbnRTZWdtZW50XG4gKiAgIC8vPSBmZWF0dXJlSW5kZXhcbiAqICAgLy89IG11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPSBnZW9tZXRyeUluZGV4XG4gKiAgIC8vPSBzZWdtZW50SW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRTZWdtZW50XG4gKiB9KTtcbiAqXG4gKiAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50c1xuICogdmFyIGluaXRpYWxWYWx1ZSA9IDBcbiAqIHZhciB0b3RhbCA9IHR1cmYuc2VnbWVudFJlZHVjZShwb2x5Z29uLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSkge1xuICogICAgIHByZXZpb3VzVmFsdWUrKztcbiAqICAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbiAqIH0sIGluaXRpYWxWYWx1ZSk7XG4gKi9cblxuXG5mdW5jdGlvbiBzZWdtZW50UmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIHZhciBzdGFydGVkID0gZmFsc2U7XG4gIHNlZ21lbnRFYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSB7XG4gICAgaWYgKHN0YXJ0ZWQgPT09IGZhbHNlICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSBwcmV2aW91c1ZhbHVlID0gY3VycmVudFNlZ21lbnQ7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudFNlZ21lbnQsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgsIHNlZ21lbnRJbmRleCk7XG4gICAgc3RhcnRlZCA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGxpbmVFYWNoXG4gKlxuICogQGNhbGxiYWNrIGxpbmVFYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudExpbmUgVGhlIGN1cnJlbnQgTGluZVN0cmluZ3xMaW5lYXJSaW5nIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWRcbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBsaW5lIG9yIHJpbmcgY29vcmRpbmF0ZXMgaW4gTGluZVN0cmluZywgUG9seWdvbiwgTXVsdGlMaW5lU3RyaW5nLCBNdWx0aVBvbHlnb24gRmVhdHVyZXMgb3IgR2VvbWV0cmllcyxcbiAqIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaC5cbiAqXG4gKiBAbmFtZSBsaW5lRWFjaFxuICogQHBhcmFtIHtHZW9tZXRyeXxGZWF0dXJlPExpbmVTdHJpbmd8UG9seWdvbnxNdWx0aUxpbmVTdHJpbmd8TXVsdGlQb2x5Z29uPn0gZ2VvanNvbiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRMaW5lLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KVxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbXG4gKiAgIFtbMjYsIDM3XSwgWzM1LCA0NV1dLFxuICogICBbWzM2LCA1M10sIFszOCwgNTBdLCBbNDEsIDU1XV1cbiAqIF0pO1xuICpcbiAqIHR1cmYubGluZUVhY2gobXVsdGlMaW5lLCBmdW5jdGlvbiAoY3VycmVudExpbmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpIHtcbiAqICAgLy89Y3VycmVudExpbmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPWdlb21ldHJ5SW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gbGluZUVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgLy8gdmFsaWRhdGlvblxuICBpZiAoIWdlb2pzb24pIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgcmVxdWlyZWRcIik7XG4gIGZsYXR0ZW5FYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChmZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KSB7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT09IG51bGwpIHJldHVybjtcbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICB2YXIgY29vcmRzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgICAgaWYgKGNhbGxiYWNrKGZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIDAsIDApID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgZm9yICh2YXIgZ2VvbWV0cnlJbmRleCA9IDA7IGdlb21ldHJ5SW5kZXggPCBjb29yZHMubGVuZ3RoOyBnZW9tZXRyeUluZGV4KyspIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sobGluZVN0cmluZyhjb29yZHNbZ2VvbWV0cnlJbmRleF0sIGZlYXR1cmUucHJvcGVydGllcyksIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGxpbmVSZWR1Y2VcbiAqXG4gKiBUaGUgZmlyc3QgdGltZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgdmFsdWVzIHByb3ZpZGVkIGFzIGFyZ3VtZW50cyBkZXBlbmRcbiAqIG9uIHdoZXRoZXIgdGhlIHJlZHVjZSBtZXRob2QgaGFzIGFuIGluaXRpYWxWYWx1ZSBhcmd1bWVudC5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQgdG8gdGhlIHJlZHVjZSBtZXRob2Q6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyBpbml0aWFsVmFsdWUuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgbm90IHByb3ZpZGVkOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIEBjYWxsYmFjayBsaW5lUmVkdWNlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gcHJldmlvdXNWYWx1ZSBUaGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uXG4gKiBvZiB0aGUgY2FsbGJhY2ssIG9yIGluaXRpYWxWYWx1ZSwgaWYgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0ZlYXR1cmU8TGluZVN0cmluZz59IGN1cnJlbnRMaW5lIFRoZSBjdXJyZW50IExpbmVTdHJpbmd8TGluZWFyUmluZyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZFxuICovXG5cbi8qKlxuICogUmVkdWNlIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKS5cbiAqXG4gKiBAbmFtZSBsaW5lUmVkdWNlXG4gKiBAcGFyYW0ge0dlb21ldHJ5fEZlYXR1cmU8TGluZVN0cmluZ3xQb2x5Z29ufE11bHRpTGluZVN0cmluZ3xNdWx0aVBvbHlnb24+fSBnZW9qc29uIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudExpbmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpXG4gKiBAcGFyYW0geyp9IFtpbml0aWFsVmFsdWVdIFZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aVBvbHkgPSB0dXJmLm11bHRpUG9seWdvbihbXG4gKiAgIHR1cmYucG9seWdvbihbW1sxMiw0OF0sWzIsNDFdLFsyNCwzOF0sWzEyLDQ4XV0sIFtbOSw0NF0sWzEzLDQxXSxbMTMsNDVdLFs5LDQ0XV1dKSxcbiAqICAgdHVyZi5wb2x5Z29uKFtbWzUsIDVdLCBbMCwgMF0sIFsyLCAyXSwgWzQsIDRdLCBbNSwgNV1dXSlcbiAqIF0pO1xuICpcbiAqIHR1cmYubGluZVJlZHVjZShtdWx0aVBvbHksIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRMaW5lXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50TGluZVxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBsaW5lUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGxpbmVFYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50TGluZTtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCk7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogRmluZHMgYSBwYXJ0aWN1bGFyIDItdmVydGV4IExpbmVTdHJpbmcgU2VnbWVudCBmcm9tIGEgR2VvSlNPTiB1c2luZyBgQHR1cmYvbWV0YWAgaW5kZXhlcy5cbiAqXG4gKiBOZWdhdGl2ZSBpbmRleGVzIGFyZSBwZXJtaXR0ZWQuXG4gKiBQb2ludCAmIE11bHRpUG9pbnQgd2lsbCBhbHdheXMgcmV0dXJuIG51bGwuXG4gKlxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIEFueSBHZW9KU09OIEZlYXR1cmUgb3IgR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmZlYXR1cmVJbmRleD0wXSBGZWF0dXJlIEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubXVsdGlGZWF0dXJlSW5kZXg9MF0gTXVsdGktRmVhdHVyZSBJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmdlb21ldHJ5SW5kZXg9MF0gR2VvbWV0cnkgSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zZWdtZW50SW5kZXg9MF0gU2VnbWVudCBJbmRleFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb3BlcnRpZXM9e31dIFRyYW5zbGF0ZSBQcm9wZXJ0aWVzIHRvIG91dHB1dCBMaW5lU3RyaW5nXG4gKiBAcGFyYW0ge0JCb3h9IFtvcHRpb25zLmJib3g9e31dIFRyYW5zbGF0ZSBCQm94IHRvIG91dHB1dCBMaW5lU3RyaW5nXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtvcHRpb25zLmlkPXt9XSBUcmFuc2xhdGUgSWQgdG8gb3V0cHV0IExpbmVTdHJpbmdcbiAqIEByZXR1cm5zIHtGZWF0dXJlPExpbmVTdHJpbmc+fSAyLXZlcnRleCBHZW9KU09OIEZlYXR1cmUgTGluZVN0cmluZ1xuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbXG4gKiAgICAgW1sxMCwgMTBdLCBbNTAsIDMwXSwgWzMwLCA0MF1dLFxuICogICAgIFtbLTEwLCAtMTBdLCBbLTUwLCAtMzBdLCBbLTMwLCAtNDBdXVxuICogXSk7XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCAoZGVmYXVsdHMgYXJlIDApXG4gKiB0dXJmLmZpbmRTZWdtZW50KG11bHRpTGluZSk7XG4gKiAvLyA9PiBGZWF0dXJlPExpbmVTdHJpbmc8W1sxMCwgMTBdLCBbNTAsIDMwXV0+PlxuICpcbiAqIC8vIEZpcnN0IFNlZ21lbnQgb2YgMm5kIE11bHRpIEZlYXR1cmVcbiAqIHR1cmYuZmluZFNlZ21lbnQobXVsdGlMaW5lLCB7bXVsdGlGZWF0dXJlSW5kZXg6IDF9KTtcbiAqIC8vID0+IEZlYXR1cmU8TGluZVN0cmluZzxbWy0xMCwgLTEwXSwgWy01MCwgLTMwXV0+PlxuICpcbiAqIC8vIExhc3QgU2VnbWVudCBvZiBMYXN0IE11bHRpIEZlYXR1cmVcbiAqIHR1cmYuZmluZFNlZ21lbnQobXVsdGlMaW5lLCB7bXVsdGlGZWF0dXJlSW5kZXg6IC0xLCBzZWdtZW50SW5kZXg6IC0xfSk7XG4gKiAvLyA9PiBGZWF0dXJlPExpbmVTdHJpbmc8W1stNTAsIC0zMF0sIFstMzAsIC00MF1dPj5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRTZWdtZW50KGdlb2pzb24sIG9wdGlvbnMpIHtcbiAgLy8gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFpc09iamVjdChvcHRpb25zKSkgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBpcyBpbnZhbGlkXCIpO1xuICB2YXIgZmVhdHVyZUluZGV4ID0gb3B0aW9ucy5mZWF0dXJlSW5kZXggfHwgMDtcbiAgdmFyIG11bHRpRmVhdHVyZUluZGV4ID0gb3B0aW9ucy5tdWx0aUZlYXR1cmVJbmRleCB8fCAwO1xuICB2YXIgZ2VvbWV0cnlJbmRleCA9IG9wdGlvbnMuZ2VvbWV0cnlJbmRleCB8fCAwO1xuICB2YXIgc2VnbWVudEluZGV4ID0gb3B0aW9ucy5zZWdtZW50SW5kZXggfHwgMDsgLy8gRmluZCBGZWF0dXJlSW5kZXhcblxuICB2YXIgcHJvcGVydGllcyA9IG9wdGlvbnMucHJvcGVydGllcztcbiAgdmFyIGdlb21ldHJ5O1xuXG4gIHN3aXRjaCAoZ2VvanNvbi50eXBlKSB7XG4gICAgY2FzZSBcIkZlYXR1cmVDb2xsZWN0aW9uXCI6XG4gICAgICBpZiAoZmVhdHVyZUluZGV4IDwgMCkgZmVhdHVyZUluZGV4ID0gZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGggKyBmZWF0dXJlSW5kZXg7XG4gICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCBnZW9qc29uLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF0ucHJvcGVydGllcztcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbi5mZWF0dXJlc1tmZWF0dXJlSW5kZXhdLmdlb21ldHJ5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmVhdHVyZVwiOlxuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwgZ2VvanNvbi5wcm9wZXJ0aWVzO1xuICAgICAgZ2VvbWV0cnkgPSBnZW9qc29uLmdlb21ldHJ5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbjtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgaW52YWxpZFwiKTtcbiAgfSAvLyBGaW5kIFNlZ21lbnRJbmRleFxuXG5cbiAgaWYgKGdlb21ldHJ5ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNvb3JkcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuXG4gIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xuICAgIGNhc2UgXCJQb2ludFwiOlxuICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICBpZiAoc2VnbWVudEluZGV4IDwgMCkgc2VnbWVudEluZGV4ID0gY29vcmRzLmxlbmd0aCArIHNlZ21lbnRJbmRleCAtIDE7XG4gICAgICByZXR1cm4gbGluZVN0cmluZyhbY29vcmRzW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1tzZWdtZW50SW5kZXggKyAxXV0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgIGlmIChnZW9tZXRyeUluZGV4IDwgMCkgZ2VvbWV0cnlJbmRleCA9IGNvb3Jkcy5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IDApIHNlZ21lbnRJbmRleCA9IGNvb3Jkc1tnZW9tZXRyeUluZGV4XS5sZW5ndGggKyBzZWdtZW50SW5kZXggLSAxO1xuICAgICAgcmV0dXJuIGxpbmVTdHJpbmcoW2Nvb3Jkc1tnZW9tZXRyeUluZGV4XVtzZWdtZW50SW5kZXhdLCBjb29yZHNbZ2VvbWV0cnlJbmRleF1bc2VnbWVudEluZGV4ICsgMV1dLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IDApIHNlZ21lbnRJbmRleCA9IGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF0ubGVuZ3RoICsgc2VnbWVudEluZGV4IC0gMTtcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKFtjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bc2VnbWVudEluZGV4ICsgMV1dLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKGdlb21ldHJ5SW5kZXggPCAwKSBnZW9tZXRyeUluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XS5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IDApIHNlZ21lbnRJbmRleCA9IGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF0ubGVuZ3RoIC0gc2VnbWVudEluZGV4IC0gMTtcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKFtjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW2dlb21ldHJ5SW5kZXhdW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF1bc2VnbWVudEluZGV4ICsgMV1dLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgaW52YWxpZFwiKTtcbn1cbi8qKlxuICogRmluZHMgYSBwYXJ0aWN1bGFyIFBvaW50IGZyb20gYSBHZW9KU09OIHVzaW5nIGBAdHVyZi9tZXRhYCBpbmRleGVzLlxuICpcbiAqIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBlcm1pdHRlZC5cbiAqXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gQW55IEdlb0pTT04gRmVhdHVyZSBvciBHZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZmVhdHVyZUluZGV4PTBdIEZlYXR1cmUgSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tdWx0aUZlYXR1cmVJbmRleD0wXSBNdWx0aS1GZWF0dXJlIEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZ2VvbWV0cnlJbmRleD0wXSBHZW9tZXRyeSBJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNvb3JkSW5kZXg9MF0gQ29vcmQgSW5kZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcm9wZXJ0aWVzPXt9XSBUcmFuc2xhdGUgUHJvcGVydGllcyB0byBvdXRwdXQgUG9pbnRcbiAqIEBwYXJhbSB7QkJveH0gW29wdGlvbnMuYmJveD17fV0gVHJhbnNsYXRlIEJCb3ggdG8gb3V0cHV0IFBvaW50XG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtvcHRpb25zLmlkPXt9XSBUcmFuc2xhdGUgSWQgdG8gb3V0cHV0IFBvaW50XG4gKiBAcmV0dXJucyB7RmVhdHVyZTxQb2ludD59IDItdmVydGV4IEdlb0pTT04gRmVhdHVyZSBQb2ludFxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbXG4gKiAgICAgW1sxMCwgMTBdLCBbNTAsIDMwXSwgWzMwLCA0MF1dLFxuICogICAgIFtbLTEwLCAtMTBdLCBbLTUwLCAtMzBdLCBbLTMwLCAtNDBdXVxuICogXSk7XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCAoZGVmYXVsdHMgYXJlIDApXG4gKiB0dXJmLmZpbmRQb2ludChtdWx0aUxpbmUpO1xuICogLy8gPT4gRmVhdHVyZTxQb2ludDxbMTAsIDEwXT4+XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCBvZiB0aGUgMm5kIE11bHRpLUZlYXR1cmVcbiAqIHR1cmYuZmluZFBvaW50KG11bHRpTGluZSwge211bHRpRmVhdHVyZUluZGV4OiAxfSk7XG4gKiAvLyA9PiBGZWF0dXJlPFBvaW50PFstMTAsIC0xMF0+PlxuICpcbiAqIC8vIExhc3QgU2VnbWVudCBvZiBsYXN0IE11bHRpLUZlYXR1cmVcbiAqIHR1cmYuZmluZFBvaW50KG11bHRpTGluZSwge211bHRpRmVhdHVyZUluZGV4OiAtMSwgY29vcmRJbmRleDogLTF9KTtcbiAqIC8vID0+IEZlYXR1cmU8UG9pbnQ8Wy0zMCwgLTQwXT4+XG4gKi9cblxuXG5mdW5jdGlvbiBmaW5kUG9pbnQoZ2VvanNvbiwgb3B0aW9ucykge1xuICAvLyBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGlzIGludmFsaWRcIik7XG4gIHZhciBmZWF0dXJlSW5kZXggPSBvcHRpb25zLmZlYXR1cmVJbmRleCB8fCAwO1xuICB2YXIgbXVsdGlGZWF0dXJlSW5kZXggPSBvcHRpb25zLm11bHRpRmVhdHVyZUluZGV4IHx8IDA7XG4gIHZhciBnZW9tZXRyeUluZGV4ID0gb3B0aW9ucy5nZW9tZXRyeUluZGV4IHx8IDA7XG4gIHZhciBjb29yZEluZGV4ID0gb3B0aW9ucy5jb29yZEluZGV4IHx8IDA7IC8vIEZpbmQgRmVhdHVyZUluZGV4XG5cbiAgdmFyIHByb3BlcnRpZXMgPSBvcHRpb25zLnByb3BlcnRpZXM7XG4gIHZhciBnZW9tZXRyeTtcblxuICBzd2l0Y2ggKGdlb2pzb24udHlwZSkge1xuICAgIGNhc2UgXCJGZWF0dXJlQ29sbGVjdGlvblwiOlxuICAgICAgaWYgKGZlYXR1cmVJbmRleCA8IDApIGZlYXR1cmVJbmRleCA9IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoICsgZmVhdHVyZUluZGV4O1xuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwgZ2VvanNvbi5mZWF0dXJlc1tmZWF0dXJlSW5kZXhdLnByb3BlcnRpZXM7XG4gICAgICBnZW9tZXRyeSA9IGdlb2pzb24uZmVhdHVyZXNbZmVhdHVyZUluZGV4XS5nZW9tZXRyeTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZlYXR1cmVcIjpcbiAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IGdlb2pzb24ucHJvcGVydGllcztcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbi5nZW9tZXRyeTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlBvaW50XCI6XG4gICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICBjYXNlIFwiUG9seWdvblwiOlxuICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICBnZW9tZXRyeSA9IGdlb2pzb247XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnZW9qc29uIGlzIGludmFsaWRcIik7XG4gIH0gLy8gRmluZCBDb29yZCBJbmRleFxuXG5cbiAgaWYgKGdlb21ldHJ5ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNvb3JkcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuXG4gIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xuICAgIGNhc2UgXCJQb2ludFwiOlxuICAgICAgcmV0dXJuIHBvaW50KGNvb3JkcywgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgaWYgKG11bHRpRmVhdHVyZUluZGV4IDwgMCkgbXVsdGlGZWF0dXJlSW5kZXggPSBjb29yZHMubGVuZ3RoICsgbXVsdGlGZWF0dXJlSW5kZXg7XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzW211bHRpRmVhdHVyZUluZGV4XSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgaWYgKGNvb3JkSW5kZXggPCAwKSBjb29yZEluZGV4ID0gY29vcmRzLmxlbmd0aCArIGNvb3JkSW5kZXg7XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzW2Nvb3JkSW5kZXhdLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICBpZiAoZ2VvbWV0cnlJbmRleCA8IDApIGdlb21ldHJ5SW5kZXggPSBjb29yZHMubGVuZ3RoICsgZ2VvbWV0cnlJbmRleDtcbiAgICAgIGlmIChjb29yZEluZGV4IDwgMCkgY29vcmRJbmRleCA9IGNvb3Jkc1tnZW9tZXRyeUluZGV4XS5sZW5ndGggKyBjb29yZEluZGV4O1xuICAgICAgcmV0dXJuIHBvaW50KGNvb3Jkc1tnZW9tZXRyeUluZGV4XVtjb29yZEluZGV4XSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6XG4gICAgICBpZiAobXVsdGlGZWF0dXJlSW5kZXggPCAwKSBtdWx0aUZlYXR1cmVJbmRleCA9IGNvb3Jkcy5sZW5ndGggKyBtdWx0aUZlYXR1cmVJbmRleDtcbiAgICAgIGlmIChjb29yZEluZGV4IDwgMCkgY29vcmRJbmRleCA9IGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF0ubGVuZ3RoICsgY29vcmRJbmRleDtcbiAgICAgIHJldHVybiBwb2ludChjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW2Nvb3JkSW5kZXhdLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKGdlb21ldHJ5SW5kZXggPCAwKSBnZW9tZXRyeUluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XS5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKGNvb3JkSW5kZXggPCAwKSBjb29yZEluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XVtnZW9tZXRyeUluZGV4XS5sZW5ndGggLSBjb29yZEluZGV4O1xuICAgICAgcmV0dXJuIHBvaW50KGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF1bY29vcmRJbmRleF0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiZ2VvanNvbiBpcyBpbnZhbGlkXCIpO1xufVxuXG5leHBvcnQgeyBjb29yZEFsbCwgY29vcmRFYWNoLCBjb29yZFJlZHVjZSwgZmVhdHVyZUVhY2gsIGZlYXR1cmVSZWR1Y2UsIGZpbmRQb2ludCwgZmluZFNlZ21lbnQsIGZsYXR0ZW5FYWNoLCBmbGF0dGVuUmVkdWNlLCBnZW9tRWFjaCwgZ2VvbVJlZHVjZSwgbGluZUVhY2gsIGxpbmVSZWR1Y2UsIHByb3BFYWNoLCBwcm9wUmVkdWNlLCBzZWdtZW50RWFjaCwgc2VnbWVudFJlZHVjZSB9OyIsImltcG9ydCB7IGNvb3JkRWFjaCB9IGZyb20gXCJAdHVyZi9tZXRhXCI7XG4vKipcbiAqIFRha2VzIGEgc2V0IG9mIGZlYXR1cmVzLCBjYWxjdWxhdGVzIHRoZSBiYm94IG9mIGFsbCBpbnB1dCBmZWF0dXJlcywgYW5kIHJldHVybnMgYSBib3VuZGluZyBib3guXG4gKlxuICogQG5hbWUgYmJveFxuICogQHBhcmFtIHtHZW9KU09OfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHJldHVybnMge0JCb3h9IGJib3ggZXh0ZW50IGluIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBvcmRlclxuICogQGV4YW1wbGVcbiAqIHZhciBsaW5lID0gdHVyZi5saW5lU3RyaW5nKFtbLTc0LCA0MF0sIFstNzgsIDQyXSwgWy04MiwgMzVdXSk7XG4gKiB2YXIgYmJveCA9IHR1cmYuYmJveChsaW5lKTtcbiAqIHZhciBiYm94UG9seWdvbiA9IHR1cmYuYmJveFBvbHlnb24oYmJveCk7XG4gKlxuICogLy9hZGRUb01hcFxuICogdmFyIGFkZFRvTWFwID0gW2xpbmUsIGJib3hQb2x5Z29uXVxuICovXG5cbmZ1bmN0aW9uIGJib3goZ2VvanNvbikge1xuICB2YXIgcmVzdWx0ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICBjb29yZEVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGNvb3JkKSB7XG4gICAgaWYgKHJlc3VsdFswXSA+IGNvb3JkWzBdKSB7XG4gICAgICByZXN1bHRbMF0gPSBjb29yZFswXTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0WzFdID4gY29vcmRbMV0pIHtcbiAgICAgIHJlc3VsdFsxXSA9IGNvb3JkWzFdO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRbMl0gPCBjb29yZFswXSkge1xuICAgICAgcmVzdWx0WzJdID0gY29vcmRbMF07XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdFszXSA8IGNvb3JkWzFdKSB7XG4gICAgICByZXN1bHRbM10gPSBjb29yZFsxXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5iYm94W1wiZGVmYXVsdFwiXSA9IGJib3g7XG5leHBvcnQgZGVmYXVsdCBiYm94OyIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIHRlcnJpdG9yeUZvY3VzQnV0dG9uID0gXCJ0ZXJyaXRvcnlGb2N1c0NvbnRyb2wtbW9kdWxlLS10ZXJyaXRvcnlGb2N1c0J1dHRvbi0tM3dXb1ZcIjtcbmV4cG9ydCB2YXIgdGVycml0b3J5Rm9jdXNDb250YWluZXIgPSBcInRlcnJpdG9yeUZvY3VzQ29udHJvbC1tb2R1bGUtLXRlcnJpdG9yeUZvY3VzQ29udGFpbmVyLS0zTjBYTVwiOyIsImltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCBSZWFjdCwge01vdXNlRXZlbnRIYW5kbGVyfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge191c2VNYXBDb250cm9sIGFzIHVzZU1hcENvbnRyb2x9IGZyb20gJ3JlYWN0LW1hcC1nbCc7XG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi90ZXJyaXRvcnlGb2N1c0NvbnRyb2wubW9kdWxlLnNjc3MnO1xuXG5pbnRlcmZhY2UgSVRlcnJpdG9yeUZvY3VzQ29udHJvbCB7XG4gIG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbiA6IE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxCdXR0b25FbGVtZW50Pjtcbn1cblxuY29uc3QgVGVycml0b3J5Rm9jdXNDb250cm9sID0gKHtvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b259IDogSVRlcnJpdG9yeUZvY3VzQ29udHJvbCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIGNvbnN0IHtjb250YWluZXJSZWZ9ID0gdXNlTWFwQ29udHJvbCh7XG4gICAgLy8gQHRzLWlnbm9yZSAvLyBUeXBlcyBoYXZlIG5vdCBjYXVnaHQgdXAgeWV0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2dsL3JlYWN0LW1hcC1nbC9pc3N1ZXMvMTQ5MlxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbixcbiAgfSk7XG5cbiAgY29uc3QgdGVycml0b3JpZXMgPSBbXG4gICAge1xuICAgICAgc2hvcnQ6IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5sb3dlcjQ4LnNob3J0JyxcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnNDgnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgYWJicmV2aWF0ZWQgbmFtZSBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgdGhlIExvd2VyIDQ4IHN0YXRlcycsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgICBsb25nOiBpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMubG93ZXI0OC5sb25nJyxcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTG93ZXIgNDgnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbG9uZ2VyIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIHRoZSBMb3dlciA0OCBzdGF0ZXMnLFxuICAgICAgICAgIH0sXG4gICAgICApLFxuICAgIH0sXG4gICAge1xuICAgICAgc2hvcnQ6IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5hbGFza2Euc2hvcnQnLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdBSycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBhYmJyZXZpYXRlZCBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgQWxhc2thJyxcbiAgICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIGxvbmc6IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5hbGFza2EubG9uZycsXG4gICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0FsYXNrYScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdWxsIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEFsYXNrYScsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICB7XG4gICAgICBzaG9ydDogaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLmhhd2FpaS5zaG9ydCcsXG4gICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0hJJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFiYnJldmlhdGVkIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEhhd2FpaScsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgICBsb25nOiBpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMuaGF3YWlpLmxvbmcnLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdIYXdhaWknLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbG9uZ2VyIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEhhd2FpaScsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICB7XG4gICAgICBzaG9ydDogaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLnB1ZXJ0b19yaWNvLnNob3J0JyxcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnUFInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgYWJicmV2aWF0ZWQgbmFtZSBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgUHVlcnRvIFJpY28nLFxuICAgICAgICAgIH0sXG4gICAgICApLFxuICAgICAgbG9uZzogaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLnB1ZXJ0b19yaWNvLmxvbmcnLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQdWVydG8gUmljbycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdWxsIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIFB1ZXJ0byBSaWNvJyxcbiAgICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9LFxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e2NvbnRhaW5lclJlZn0gY2xhc3NOYW1lPXtzdHlsZXMudGVycml0b3J5Rm9jdXNDb250YWluZXJ9PlxuICAgICAge3RlcnJpdG9yaWVzLm1hcCgodGVycml0b3J5KSA9PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgaWQ9e3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgICBrZXk9e3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b259XG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMudGVycml0b3J5Rm9jdXNCdXR0b259XG4gICAgICAgICAgYXJpYS1sYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMuZm9jdXNPbicsXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGb2N1cyBvbiB7dGVycml0b3J5fScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdGb2N1cyBvbiB0aGUgYm91bmRzIG9mIGEgc3BlY2lmaWMgdGVycml0b3J5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRlcnJpdG9yeTogdGVycml0b3J5LmxvbmcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgKX0+XG4gICAgICAgICAge3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgPC9idXR0b24+LFxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRlcnJpdG9yeUZvY3VzQ29udHJvbDtcblxuIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJR1Z1WVdKc1pTMWlZV05yWjNKdmRXNWtQU0p1WlhjZ01DQXdJREkwSURJMElpQm9aV2xuYUhROUlqSTBJaUIyYVdWM1FtOTRQU0l3SURBZ01qUWdNalFpSUhkcFpIUm9QU0l5TkNJK1BHYytQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BDOW5QanhuUGp4blBqeG5Qanh3WVhSb0lHUTlJazA1TERJeFl6QXNNQzQxTlN3d0xqUTFMREVzTVN3eGFEUmpNQzQxTlN3d0xERXRNQzQwTlN3eExURjJMVEZJT1ZZeU1Yb2dUVEV5TERKRE9DNHhOQ3d5TERVc05TNHhOQ3cxTERsak1Dd3lMak00TERFdU1Ua3NOQzQwTnl3ekxEVXVOelJXTVRjZ1l6QXNNQzQxTlN3d0xqUTFMREVzTVN3eGFEWmpNQzQxTlN3d0xERXRNQzQwTlN3eExURjJMVEl1TWpaak1TNDRNUzB4TGpJM0xETXRNeTR6Tml3ekxUVXVOelJETVRrc05TNHhOQ3d4TlM0NE5pd3lMREV5TERKNklFMHhOQ3d4TXk0M1ZqRTJhQzAwZGkweUxqTWdRemd1TkRnc01USXVOak1zTnl3eE1TNDFNeXczTERsak1DMHlMamMyTERJdU1qUXROU3cxTFRWek5Td3lMakkwTERVc05VTXhOeXd4TVM0ME9Td3hOUzQwT1N3eE1pNDJOU3d4TkN3eE15NDNlaUl2UGp3dlp6NDhMMmMrUEM5blBqd3ZjM1puUGc9PVwiIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIG1hcEludHJvQ29udGFpbmVyID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1tYXBJbnRyb0NvbnRhaW5lci0tMUs4ZHVcIjtcbmV4cG9ydCB2YXIgbWFwSW50cm9IZWFkZXIgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvSGVhZGVyLS0zMkxCc1wiO1xuZXhwb3J0IHZhciBtYXBJbnRyb1RleHQgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvVGV4dC0tVGliOExcIjtcbmV4cG9ydCB2YXIgbWFwSW50cm9MaWdodGJ1bGIgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvTGlnaHRidWxiLS0zTEJ4MFwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93Qm94ID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1kaWRZb3VLbm93Qm94LS0zenRFeVwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93ID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1kaWRZb3VLbm93LS0zX3ZfaVwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93VGV4dCA9IFwibWFwSW50cm9kdWN0aW9uLW1vZHVsZS0tZGlkWW91S25vd1RleHQtLTNzZ0hzXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgbGlnaHRidWxiSWNvbiBmcm9tICcvbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9saWdodGJ1bGJfb3V0bGluZS5zdmcnO1xuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vbWFwSW50cm9kdWN0aW9uLm1vZHVsZS5zY3NzJztcblxuY29uc3QgTWFwSW50cm9kdWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICBtYXBJbnRyb0hlYWRlcjoge1xuICAgICAgaWQ6ICdtYXBJbnRyby5tYXBJbnRyb0hlYWRlcicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1pvb20gYW5kIHNlbGVjdCBhIGNlbnN1cyBibG9jayBncm91cCB0byB2aWV3IGRhdGEnLFxuICAgICAgZGVzY3JpcHRpb246ICdpbnRyb2R1Y3RvcnkgdGV4dCBvZiB3YXlzIHRvIHVzZSB0aGUgbWFwJyxcbiAgICB9LFxuICAgIGRpZFlvdUtub3c6IHtcbiAgICAgIGlkOiAnbWFwSW50cm8uZGlkWW91S25vdycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJyBEaWQgeW91IGtub3c/JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAndGV4dCBwcm9tcHRpbmcgYSBjaXRlIHBhcmFncmFwaCcsXG4gICAgfSxcbiAgICBjZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbjoge1xuICAgICAgaWQ6ICdtYXBJbnRyby5jZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0EgY2Vuc3VzIGJsb2NrIGdyb3VwIGlzIGdlbmVyYWxseSBiZXR3ZWVuIDYwMCBhbmQgMywwMDAgcGVvcGxlLiAnICtcbiAgICAgICdJdCBpcyB0aGUgc21hbGxlc3QgZ2VvZ3JhcGhpY2FsIHVuaXQgZm9yIHdoaWNoIHRoZSBVLlMuIENlbnN1cyAnICtcbiAgICAgICdCdXJlYXUgcHVibGlzaGVzIHNhbXBsZSBkYXRhLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ2NpdGVzIHRoZSBkZWZpbml0aW9uIGFuZCBoZWxwZnVsIGluZm9ybWF0aW9uIGFib3V0IGNlbnN1cyBncm91cHMnLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPGFzaWRlIGNsYXNzTmFtZT17c3R5bGVzLm1hcEludHJvQ29udGFpbmVyfT5cbiAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtzdHlsZXMubWFwSW50cm9IZWFkZXJ9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubWFwSW50cm9IZWFkZXIpfTwvaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5tYXBJbnRyb1RleHR9PlxuICAgICAgICA8aW1nIGNsYXNzTmFtZT17c3R5bGVzLm1hcEludHJvTGlnaHRidWxifSBzcmM9e2xpZ2h0YnVsYkljb259IC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuZGlkWW91S25vd0JveH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kaWRZb3VLbm93fT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRpZFlvdUtub3cpfTwvZGl2PlxuICAgICAgICAgIDxjaXRlIGNsYXNzTmFtZT17c3R5bGVzLmRpZFlvdUtub3dUZXh0fT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmNlbnN1c0Jsb2NrR3JvdXBEZWZpbml0aW9uKX08L2NpdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9hc2lkZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hcEludHJvZHVjdGlvbjtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhcmVhRGV0YWlsQ29udGFpbmVyID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tYXJlYURldGFpbENvbnRhaW5lci0tWUZUaFJcIjtcbmV4cG9ydCB2YXIgdG9wUm93ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tdG9wUm93LS1tcnNmb1wiO1xuZXhwb3J0IHZhciBjdW11bGF0aXZlSW5kZXhTY29yZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWN1bXVsYXRpdmVJbmRleFNjb3JlLS0xTWpOLVwiO1xuZXhwb3J0IHZhciBjYXRlZ29yaXphdGlvbiA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWNhdGVnb3JpemF0aW9uLS1oQjlLOFwiO1xuZXhwb3J0IHZhciB0b3BSb3dUaXRsZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXRvcFJvd1RpdGxlLS11bXgzOVwiO1xuZXhwb3J0IHZhciBjZW5zdXNMYWJlbCA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWNlbnN1c0xhYmVsLS0zU0MtY1wiO1xuZXhwb3J0IHZhciB0b3BSb3dTdWJUaXRsZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXRvcFJvd1N1YlRpdGxlLS0zamU3clwiO1xuZXhwb3J0IHZhciBzY29yZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXNjb3JlLS0zYms5YlwiO1xuZXhwb3J0IHZhciBzY29yZVN1cGVyc2NyaXB0ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tc2NvcmVTdXBlcnNjcmlwdC0tM1ZJWVhcIjtcbmV4cG9ydCB2YXIgcHJpb3JpdHkgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1wcmlvcml0eS0tMzZ1STdcIjtcbmV4cG9ydCB2YXIgcHJpb3JpdGl6ZWQgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1wcmlvcml0aXplZC0tMVhkV1FcIjtcbmV4cG9ydCB2YXIgdGhyZXNob2xkID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tdGhyZXNob2xkLS0xWTJYb1wiO1xuZXhwb3J0IHZhciBub25Qcmlvcml0aXplZCA9IFwiYXJlYURldGFpbC1tb2R1bGUtLW5vblByaW9yaXRpemVkLS0xYlRKbFwiO1xuZXhwb3J0IHZhciBwcmlvcml0aXphdGlvbiA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXByaW9yaXRpemF0aW9uLS0yTm1yQlwiO1xuZXhwb3J0IHZhciBjZW5zdXNSb3cgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1jZW5zdXNSb3ctLTE2OU84XCI7XG5leHBvcnQgdmFyIGNlbnN1c1RleHQgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1jZW5zdXNUZXh0LS0zajF4Z1wiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JEZXNjcmlwdGlvbiA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvckRlc2NyaXB0aW9uLS0yeEZEWVwiO1xuZXhwb3J0IHZhciBkaXZpZGVyID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tZGl2aWRlci0tM3l3OVVcIjtcbmV4cG9ydCB2YXIgaW5kaWNhdG9yQm94ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0taW5kaWNhdG9yQm94LS0yd0FVUFwiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JUaXRsZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvclRpdGxlLS0zSWpfaFwiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JWYWx1ZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvclZhbHVlLS0zRXRWUVwiOyIsImltcG9ydCB7TG5nTGF0Qm91bmRzTGlrZX0gZnJvbSAnbWFwbGlicmUtZ2wnO1xuaW1wb3J0IHtpc01vYmlsZSBhcyBpc01vYmlsZVJlYWN0RGV2aWNlRGV0ZWN0fSBmcm9tICdyZWFjdC1kZXZpY2UtZGV0ZWN0JztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG4vLyBVUkxTXG5leHBvcnQgY29uc3QgRE9XTkxPQURfWklQX1VSTCA9ICdodHRwczovL2p1c3RpY2U0MC1kYXRhLnMzLmFtYXpvbmF3cy5jb20vZGF0YS1waXBlbGluZS9kYXRhL3Njb3JlL2Rvd25sb2FkYWJsZS9TY3JlZW5pbmcrVG9vbCtEYXRhLnppcCc7XG5cbi8vIFRoaXMgaXMgdGhlIFVSTCBmb3IgdGhlIG9yaWdpbiBTMyBidWNrZXQ6XG4vLyBleHBvcnQgY29uc3QgT1JJR0lOX0JBU0VfVVJMID0gJ2h0dHBzOi8vanVzdGljZTQwLWRhdGEuczMuYW1hem9uYXdzLmNvbSc7XG5cbi8vIFRoaXMgaXMgdGhlIFVSTCBmb3IgdGhlIENETiB0aGF0IGRlbGl2ZXJzIHRoZSB0aWxlIGRhdGFcbmV4cG9ydCBjb25zdCBGRUFUVVJFX1RJTEVfQkFTRV9VUkwgPSAnaHR0cHM6Ly9kM2pxeXcxMGo4ZTdwOS5jbG91ZGZyb250Lm5ldCc7XG5jb25zdCBGRUFUVVJFX1RJTEVfUEFUSCA9ICdkYXRhLXBpcGVsaW5lL2RhdGEvc2NvcmUvdGlsZXMnO1xuXG4vLyBUaGlzIGlzIHRoZSBVUkwgZm9yIHRoZSBDRE4gdGhhdCBkZWxpdmVycyB0aGUgYXBwbGljYXRpb25cbi8vIGNvbnN0IEFQUF9CQVNFX1VSTCA9ICdodHRwczovL2QyemppZDZuNWphMnB0LmNsb3VkZnJvbnQubmV0JztcbmNvbnN0IFhZWl9TVUZGSVggPSAne3p9L3t4fS97eX0ucGJmJztcblxuZXhwb3J0IGNvbnN0IGZlYXR1cmVVUkxGb3JUaWxlc2V0TmFtZSA9ICh0aWxlc2V0TmFtZSA6c3RyaW5nICkgOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYCR7RkVBVFVSRV9USUxFX0JBU0VfVVJMfS8ke0ZFQVRVUkVfVElMRV9QQVRIfS8ke3RpbGVzZXROYW1lfS8ke1hZWl9TVUZGSVh9YDtcbn07XG5leHBvcnQgY29uc3QgRkVBVFVSRV9USUxFX0hJR0hfWk9PTV9VUkwgPSBmZWF0dXJlVVJMRm9yVGlsZXNldE5hbWUoJ2hpZ2gnKTtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX1RJTEVfTE9XX1pPT01fVVJMID0gZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lKCdsb3cnKTtcblxuXG4vLyBQZXJmb3JtYW5jZSBtYXJrZXJzXG5leHBvcnQgY29uc3QgUEVSRk9STUFOQ0VfTUFSS0VSX01BUF9JRExFID0gJ01BUF9JRExFJztcblxuLy8gUHJvcGVydGllc1xuZXhwb3J0IGNvbnN0IFNDT1JFX1BST1BFUlRZX0hJR0ggPSAnU2NvcmUgRSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IFNDT1JFX1BST1BFUlRZX0xPVyA9ICdFX1NDT1JFJztcbmV4cG9ydCBjb25zdCBHRU9JRF9QUk9QRVJUWSA9ICdHRU9JRDEwJztcbmV4cG9ydCBjb25zdCBISUdIX1NDT1JFX1NPVVJDRV9OQU1FID0gJ3Njb3JlLWhpZ2gnO1xuZXhwb3J0IGNvbnN0IEhJR0hfU0NPUkVfTEFZRVJfTkFNRSA9ICdzY29yZS1oaWdoLWxheWVyJztcbmV4cG9ydCBjb25zdCBMT1dfU0NPUkVfU09VUkNFX05BTUUgPSAnc2NvcmUtbG93JztcbmV4cG9ydCBjb25zdCBMT1dfU0NPUkVfTEFZRVJfTkFNRSA9ICdzY29yZS1sb3ctbGF5ZXInO1xuZXhwb3J0IGNvbnN0IFNFTEVDVEVEX1BST1BFUlRZID0gJ3NlbGVjdGVkJztcbmV4cG9ydCBjb25zdCBDVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9ISUdITElHSFRfTEFZRVJfTkFNRSA9ICdjdXJyZW50bHktc2VsZWN0ZWQtZmVhdHVyZS1oaWdobGlnaHQtbGF5ZXInO1xuZXhwb3J0IGNvbnN0IEJMT0NLX0dST1VQX0JPVU5EQVJZX0xBWUVSX05BTUUgPSAnYmxvY2stZ3JvdXAtYm91bmRhcnktbGF5ZXInO1xuXG5cbi8vIFByb3BlcnRpZXNcbmV4cG9ydCBjb25zdCBQT1ZFUlRZX1BST1BFUlRZX1BFUkNFTlRJTEUgPSAnUG92ZXJ0eSAoTGVzcyB0aGFuIDIwMCUgb2YgZmVkZXJhbCBwb3ZlcnR5IGxpbmUpIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgSE9VU0lOR19CVVJERU5fUFJPUEVSVFlfUEVSQ0VOVElMRSA9ICdIb3VzaW5nIGJ1cmRlbiAocGVyY2VudCkgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBMSU5HVUlTVElDX0lTT0xBVElPTl9QUk9QRVJUWV9QRVJDRU5USUxFID0gJ0xpbmd1aXN0aWMgaXNvbGF0aW9uIChwZXJjZW50KSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IFVORU1QTE9ZTUVOVF9QUk9QRVJUWV9QRVJDRU5USUxFID0gJ1VuZW1wbG95ZWQgY2l2aWxpYW5zIChwZXJjZW50KSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IFRPVEFMX1BPUFVMQVRJT04gPSAnVG90YWwgcG9wdWxhdGlvbic7XG5leHBvcnQgY29uc3QgRURVQ0FUSU9OX1BST1BFUlRZX1BFUkNFTlRJTEUgPVxuYFBlcmNlbnQgaW5kaXZpZHVhbHMgYWdlIDI1IG9yIG92ZXIgd2l0aCBsZXNzIHRoYW4gaGlnaCBzY2hvb2wgZGVncmVlIChwZXJjZW50aWxlKWA7XG5leHBvcnQgY29uc3QgQ09VTlRZX05BTUUgPSAnQ291bnR5IE5hbWUnO1xuZXhwb3J0IGNvbnN0IFNUQVRFX05BTUUgPSAnU3RhdGUgTmFtZSc7XG5cblxuLy8gVGhlIG5hbWUgb2YgdGhlIGxheWVyIHdpdGhpbiB0aGUgdGlsZXMgdGhhdCBjb250YWlucyB0aGUgc2NvcmVcbmV4cG9ydCBjb25zdCBTQ09SRV9TT1VSQ0VfTEFZRVIgPSAnYmxvY2tzJztcblxuZXhwb3J0IHR5cGUgSjQwUHJvcGVydGllcyA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8vIFpvb21cbmV4cG9ydCBjb25zdCBHTE9CQUxfTUlOX1pPT00gPSAzO1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTSA9IDIyO1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NSU5fWk9PTV9MT1cgPSAzO1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTV9MT1cgPSA3O1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NSU5fWk9PTV9ISUdITElHSFQgPSA4O1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTV9ISUdITElHSFQgPSAyMjtcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUlOX1pPT01fSElHSCA9IDc7XG5leHBvcnQgY29uc3QgR0xPQkFMX01BWF9aT09NX0hJR0ggPSAxMTtcblxuLy8gQm91bmRzXG5leHBvcnQgY29uc3QgR0xPQkFMX01BWF9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTE4MC4xMTgzMDYsIDUuNDk5NTUwXSxcbiAgWy02NS4wLCA4My4xNjIxMDJdLFxuXTtcblxuZXhwb3J0IGNvbnN0IExPV0VSXzQ4X0JPVU5EUyA6IExuZ0xhdEJvdW5kc0xpa2UgPSBbXG4gIFstMTI0Ljc4NDQwNzksIDI0Ljc0MzMxOTVdLFxuICBbLTY2Ljk1MTM4MTIsIDQ5LjM0NTc4NjhdLFxuXTtcblxuZXhwb3J0IGNvbnN0IEFMQVNLQV9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTE4My44NTY4ODgsIDUwLjg3NTMxMV0sXG4gIFstMTQwLjkzMjYxNywgNzEuOTU4Nzk3XSxcbl07XG5cbmV4cG9ydCBjb25zdCBIQVdBSUlfQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0xNjguMTE4MzA2LCAxOC43NDgxMTVdLFxuICBbLTE1NC43NTc4ODEsIDIyLjM3ODQxM10sXG5dO1xuXG5leHBvcnQgY29uc3QgUFVFUlRPX1JJQ09fQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy02Ny45NDU0MDQsIDE3Ljg4MzI4XSxcbiAgWy02NS4yMjA3MDMsIDE4LjUxNTY4M10sXG5dO1xuXG5leHBvcnQgY29uc3QgR1VBTV9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTIxNS4zODk3MDksIDEzLjIyNTkwOV0sXG4gIFstMjE1LjA0MDg5NCwgMTMuNjYzMzM1XSxcbl07XG5cbmV4cG9ydCBjb25zdCBNQVJJQU5BX0lTTEFORF9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTIxNS4zMTM0NDksIDE0LjAwNzgwMV0sXG4gIFstMjEzLjc0MjQwNCwgMTkuNzUwMzI2XSxcbl07XG5cbmV4cG9ydCBjb25zdCBBTUVSSUNBTl9TQU1PQV9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTE3MS4wODk4NzQsIC0xNC41NDg2OTldLFxuICBbLTE2OC4xNDMzLCAtMTEuMDQ2OTM0XSxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NFTlRFUiA9IFszMi40Njg3MTI2LCAtODYuNTAyMTM2XTtcblxuLy8gT3BhY2l0eVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTEFZRVJfT1BBQ0lUWSA9IDAuNjtcblxuLy8gQ29sb3JzXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRMSU5FX0NPTE9SID0gJyM0RUE1Q0YnO1xuZXhwb3J0IGNvbnN0IE1JTl9DT0xPUiA9ICcjRkZGRkZGJztcbmV4cG9ydCBjb25zdCBNRURfQ09MT1IgPSAnI0QxREFFNic7XG5leHBvcnQgY29uc3QgTUFYX0NPTE9SID0gJyM3NjhGQjMnO1xuZXhwb3J0IGNvbnN0IEJPUkRFUl9ISUdITElHSFRfQ09MT1IgPSAnIzAwQkRFMyc7XG5leHBvcnQgY29uc3QgQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfT1BBQ0lUWSA9IDAuNTtcblxuLy8gV2lkdGhzXG5leHBvcnQgY29uc3QgSElHSExJR0hUX0JPUkRFUl9XSURUSCA9IDUuMDtcbmV4cG9ydCBjb25zdCBDVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9MQVlFUl9XSURUSCA9IDAuODtcblxuLy8gU2NvcmUgYm91bmRhcmllc1xuZXhwb3J0IGNvbnN0IFNDT1JFX0JPVU5EQVJZX0xPVyA9IDAuMDtcbmV4cG9ydCBjb25zdCBTQ09SRV9CT1VOREFSWV9USFJFU0hPTEQgPSAwLjY7XG5leHBvcnQgY29uc3QgU0NPUkVfQk9VTkRBUllfUFJJT1JJVElaRUQgPSAwLjc1O1xuXG5cbi8vIEV4cGxvcmUgdGhlIFRvb2w6XG5leHBvcnQgY29uc3QgRVhQTE9SRV9UT09MX1BBR0VfVEVYVCA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgUFJJT1JJVFlfTEFCRUw6IHtcbiAgICBpZDogJ2xlZ2VuZC5pbmZvLnByaW9yaXR5LmxhYmVsJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1ByaW9yaXRpemVkIGNvbW11bml0eScsXG4gICAgZGVzY3JpcHRpb246ICd0aGUgbGFiZWwgb2YgdGhlIHByaW9yaXRpemVkIGNvbW11bml0eSBsZWdlbmQnLFxuICB9LFxuICBUSFJFU0hPTERfTEFCRUw6IHtcbiAgICBpZDogJ2xlZ2VuZC5pbmZvLnRocmVzaG9sZC5sYWJlbCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaHJlc2hvbGQgY29tbXVuaXR5JyxcbiAgICBkZXNjcmlwdGlvbjogJ3RoZSBsYWJlbCBvZiB0aGUgdGhyZXNob2xkIGNvbW11bml0eSBsZWdlbmQnLFxuICB9LFxuICBMRUdFTkRfTEFCRUw6IHtcbiAgICBpZDogJ2xlZ2VuZC5jb2xvcmtleS5sYWJlbCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDT0xPUiBLRVknLFxuICAgIGRlc2NyaXB0aW9uOiAndGhlIGxhYmVsIG9mIHRoZSBrZXkgaW4gdGhlIGxlZ2VuZCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gaXNNb2JpbGVSZWFjdERldmljZURldGVjdDtcbiIsIi8vIEV4dGVybmFsIExpYnM6XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuLy8gQ29tcG9uZW50czpcblxuLy8gU3R5bGVzIGFuZCBjb25zdGFudHNcbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FyZWFEZXRhaWwubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcblxuZXhwb3J0IGNvbnN0IHJlYWRhYmxlUGVyY2VudCA9IChwZXJjZW50OiBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGAkeyhwZXJjZW50ICogMTAwKS50b0ZpeGVkKDEpfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2F0ZWdvcml6YXRpb24gPSAocGVyY2VudGlsZTogbnVtYmVyKSA9PiB7XG4gIGxldCBjYXRlZ29yaXphdGlvbjtcbiAgbGV0IGNhdGVnb3J5Q2lyY2xlU3R5bGU7XG5cbiAgaWYgKHBlcmNlbnRpbGUgPj0gY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVEICkge1xuICAgIGNhdGVnb3JpemF0aW9uID0gJ1ByaW9yaXRpemVkJztcbiAgICBjYXRlZ29yeUNpcmNsZVN0eWxlID0gc3R5bGVzLnByaW9yaXRpemVkO1xuICB9IGVsc2UgaWYgKGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9USFJFU0hPTEQgPD0gcGVyY2VudGlsZSAmJiBwZXJjZW50aWxlIDwgY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVEKSB7XG4gICAgY2F0ZWdvcml6YXRpb24gPSAnVGhyZXNob2xkJztcbiAgICBjYXRlZ29yeUNpcmNsZVN0eWxlID0gc3R5bGVzLnRocmVzaG9sZDtcbiAgfSBlbHNlIHtcbiAgICBjYXRlZ29yaXphdGlvbiA9ICdOb24tcHJpb3JpdGl6ZWQnO1xuICAgIGNhdGVnb3J5Q2lyY2xlU3R5bGUgPSBzdHlsZXMubm9uUHJpb3JpdGl6ZWQ7XG4gIH1cbiAgcmV0dXJuIFtjYXRlZ29yaXphdGlvbiwgY2F0ZWdvcnlDaXJjbGVTdHlsZV07XG59O1xuXG5pbnRlcmZhY2UgSUFyZWFEZXRhaWxQcm9wcyB7XG4gIHByb3BlcnRpZXM6IGNvbnN0YW50cy5KNDBQcm9wZXJ0aWVzLFxufVxuXG5jb25zdCBBcmVhRGV0YWlsID0gKHtwcm9wZXJ0aWVzfTpJQXJlYURldGFpbFByb3BzKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICAgIGN1bXVsYXRpdmVJbmRleFNjb3JlOiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwucHJpb3JpdHlJbmZvLmN1bXVsYXRpdmVJbmRleFNjb3JlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ3VtdWxhdGl2ZSBJbmRleCBTY29yZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBjdW11bGF0aXZlIHNjb3JlIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIHBlcmNlbnRpbGU6IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5wcmlvcml0eUluZm8ucGVyY2VudGlsZScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ3BlcmNlbnRpbGUnLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgcGVyY2VudGlsIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIGNhdGVnb3JpemF0aW9uOiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwucHJpb3JpdHlJbmZvLmNhdGVnb3JpemF0aW9uJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2F0ZWdvcml6YXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgY2F0ZWdvcml6YXRpb24gb2YgcHJpb3JpdGl6ZWQsIHRocmVzaG9sZCBvciBub24tcHJpb3JpdGl6ZWQnLFxuICAgIH0sXG4gICAgY2Vuc3VzQmxvY2tHcm91cDoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmdlb2dyYXBoaWNJbmZvLmNlbnN1c0Jsb2NrR3JvdXAnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDZW5zdXMgYmxvY2sgZ3JvdXA6JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAndGhlIGNlbnN1cyBibG9jayBncm91cCBpZCBudW1iZXIgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICAgIH0sXG4gICAgY291bnR5OiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuZ2VvZ3JhcGhpY0luZm8uY291bnR5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ291bnR5OicsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBjb3VudHkgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICAgIH0sXG4gICAgc3RhdGU6IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5nZW9ncmFwaGljSW5mby5zdGF0ZScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1N0YXRlOiAnLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgc3RhdGUgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICAgIH0sXG4gICAgcG9wdWxhdGlvbjoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmdlb2dyYXBoaWNJbmZvLnBvcHVsYXRpb24nLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQb3B1bGF0aW9uOicsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBwb3B1bGF0aW9uIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIGluZGljYXRvckNvbHVtbkhlYWRlcjoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvcnMuaW5kaWNhdG9yQ29sdW1uSGVhZGVyJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSU5ESUNBVE9SUycsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBwb3B1bGF0aW9uIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIHBlcmNlbnRpbGVDb2x1bW5IZWFkZXI6IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3JzLnBlcmNlbnRpbGVDb2x1bW5IZWFkZXInLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQRVJDRU5USUxFICgwLTEwMCknLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgcG9wdWxhdGlvbiBvZiB0aGUgZmVhdHVyZSBzZWxlY3RlZCcsXG4gICAgfSxcbiAgICBwb3ZlcnR5OiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLnBvdmVydHknLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQb3ZlcnR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSG91c2Vob2xkIGluY29tZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdHdpY2UgdGhlIGZlZGVyYWwgXCJwb3ZlcnR5IGxldmVsXCInLFxuICAgIH0sXG4gICAgZWR1Y2F0aW9uOiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmVkdWNhdGlvbicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0VkdWNhdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgcGVvcGxlIGFnZSAyNSBvciBvbGRlciB0aGF0IGRpZG7igJl0IGdldCBhIGhpZ2ggc2Nob29sIGRpcGxvbWEnLFxuICAgIH0sXG4gICAgbGluZ3Vpc3RpY0lzb2xhdGlvbjoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5saW5ndWlzdGljSXNvbGF0aW9uJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTGluZ3Vpc3RpYyBpc29sYXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdIb3VzZWhvbGRzIGluIHdoaWNoIGFsbCBtZW1iZXJzIHNwZWFrIGEgbm9uLUVuZ2xpc2ggbGFuZ3VhZ2UgYW5kICcgK1xuICAgICAgJ3NwZWFrIEVuZ2xpc2ggbGVzcyB0aGFuIFwidmVyeSB3ZWxsXCInLFxuICAgIH0sXG4gICAgdW5lbXBsb3ltZW50OiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLnVuZW1wbG95bWVudCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1VuZW1wbG95bWVudCByYXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHVuZW1wbG95ZWQgcGVvcGxlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbGFib3IgZm9yY2UnLFxuICAgIH0sXG4gICAgaG91c2VCdXJkZW46IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuaG91c2VCdXJkZW4nLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdIb3VzaW5nIEJ1cmRlbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0hvdXNlaG9sZHMgdGhhdCBhcmUgbG93IGluY29tZSBhbmQgc3BlbmQgbW9yZSB0aGFuIDMwJSBvZiB0aGVpciBpbmNvbWUgdG8gaG91c2luZyBjb3N0cycsXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgc2NvcmUgPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5TQ09SRV9QUk9QRVJUWV9ISUdIXSBhcyBudW1iZXI7XG4gIGNvbnN0IGJsb2NrR3JvdXAgPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5HRU9JRF9QUk9QRVJUWV07XG4gIGNvbnN0IHBvcHVsYXRpb24gPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5UT1RBTF9QT1BVTEFUSU9OXTtcbiAgY29uc3QgY291bnR5TmFtZSA9IHByb3BlcnRpZXNbY29uc3RhbnRzLkNPVU5UWV9OQU1FXTtcbiAgY29uc3Qgc3RhdGVOYW1lID0gcHJvcGVydGllc1tjb25zdGFudHMuU1RBVEVfTkFNRV07XG5cbiAgaW50ZXJmYWNlIGluZGljYXRvckluZm8ge1xuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICB9XG5cbiAgLy8gVG9kbzogVGlja2V0ICMzNjcgd2lsbCBiZSByZXBsYWNpbmcgZGVzY3JpcHRpb25zIHdpdGggWUFNTCBmaWxlXG4gIGNvbnN0IHBvdmVydHlJbmZvOmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5wb3ZlcnR5KSxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdXNlaG9sZCBpbmNvbWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHR3aWNlIHRoZSBmZWRlcmFsIFwicG92ZXJ0eSBsZXZlbFwiJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuUE9WRVJUWV9QUk9QRVJUWV9QRVJDRU5USUxFXSxcbiAgfTtcbiAgY29uc3QgZWR1SW5mbzppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZWR1Y2F0aW9uKSxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgcGVvcGxlIGFnZSAyNSBvciBvbGRlciB0aGF0IGRpZG7igJl0IGdldCBhIGhpZ2ggc2Nob29sIGRpcGxvbWEnLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5FRFVDQVRJT05fUFJPUEVSVFlfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IGxpbklzb0luZm86aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmxpbmd1aXN0aWNJc29sYXRpb24pLFxuICAgIGRlc2NyaXB0aW9uOiAnSG91c2Vob2xkcyBpbiB3aGljaCBhbGwgbWVtYmVycyBzcGVhayBhIG5vbi1FbmdsaXNoIGxhbmd1YWdlIGFuZCBzcGVhayBFbmdsaXNoIGxlc3MgdGhhbiBcInZlcnkgd2VsbFwiJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuTElOR1VJU1RJQ19JU09MQVRJT05fUFJPUEVSVFlfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IHVtZW1wbG95SW5mbzppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMudW5lbXBsb3ltZW50KSxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiB1bmVtcGxveWVkIHBlb3BsZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGxhYm9yIGZvcmNlJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuVU5FTVBMT1lNRU5UX1BST1BFUlRZX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBob3VzZUJ1cmRlbjppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuaG91c2VCdXJkZW4pLFxuICAgIGRlc2NyaXB0aW9uOiAnSG91c2Vob2xkcyB0aGF0IGFyZSBsb3cgaW5jb21lIGFuZCBzcGVuZCBtb3JlIHRoYW4gMzAlIG9mIHRoZWlyIGluY29tZSB0byBob3VzaW5nIGNvc3RzJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuSE9VU0lOR19CVVJERU5fUFJPUEVSVFlfUEVSQ0VOVElMRV0sXG4gIH07XG5cbiAgY29uc3QgaW5kaWNhdG9ycyA9IFtwb3ZlcnR5SW5mbywgZWR1SW5mbywgbGluSXNvSW5mbywgdW1lbXBsb3lJbmZvLCBob3VzZUJ1cmRlbl07XG5cbiAgY29uc3QgW2NhdGVnb3JpemF0aW9uLCBjYXRlZ29yeUNpcmNsZVN0eWxlXSA9IGdldENhdGVnb3JpemF0aW9uKHNjb3JlKTtcblxuICByZXR1cm4gKFxuICAgIDxhc2lkZSBjbGFzc05hbWU9e3N0eWxlcy5hcmVhRGV0YWlsQ29udGFpbmVyfSBkYXRhLWN5PXsnYXNpZGUnfT5cbiAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtzdHlsZXMudG9wUm93IH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3VtdWxhdGl2ZUluZGV4U2NvcmV9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMudG9wUm93VGl0bGV9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuY3VtdWxhdGl2ZUluZGV4U2NvcmUpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuc2NvcmV9IGRhdGEtY3k9eydzY29yZSd9PntgJHtyZWFkYWJsZVBlcmNlbnQoc2NvcmUpfWB9XG4gICAgICAgICAgICA8c3VwIGNsYXNzTmFtZT17c3R5bGVzLnNjb3JlU3VwZXJzY3JpcHR9PjxzcGFuPnRoPC9zcGFuPjwvc3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMudG9wUm93U3ViVGl0bGV9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucGVyY2VudGlsZSl9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmNhdGVnb3JpemF0aW9ufT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnRvcFJvd1RpdGxlfT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmNhdGVnb3JpemF0aW9uKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnByaW9yaXR5fT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYXRlZ29yeUNpcmNsZVN0eWxlfSAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5wcmlvcml0aXphdGlvbn0+e2NhdGVnb3JpemF0aW9ufTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaGVhZGVyPlxuICAgICAgPHVsIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c1Jvd30+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNMYWJlbH0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5jZW5zdXNCbG9ja0dyb3VwKX0gPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c1RleHR9PntibG9ja0dyb3VwfTwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c0xhYmVsfT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmNvdW50eSl9IDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNUZXh0fT57Y291bnR5TmFtZX08L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNMYWJlbH0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5zdGF0ZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c1RleHR9PntzdGF0ZU5hbWV9PC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuY2Vuc3VzTGFiZWx9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucG9wdWxhdGlvbil9IDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNUZXh0fT57cG9wdWxhdGlvbi50b0xvY2FsZVN0cmluZygpfTwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRpdmlkZXJ9PlxuICAgICAgICA8ZGl2PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuaW5kaWNhdG9yQ29sdW1uSGVhZGVyKX08L2Rpdj5cbiAgICAgICAgPGRpdj57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnBlcmNlbnRpbGVDb2x1bW5IZWFkZXIpfTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtpbmRpY2F0b3JzLm1hcCgoaW5kaWNhdG9yLCBpbmRleCkgPT4gKFxuICAgICAgICA8bGkga2V5PXtpbmRleH0gY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yQm94fSBkYXRhLWN5PXsnaW5kaWNhdG9yQm94J30+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yVGl0bGV9PntpbmRpY2F0b3IubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmluZGljYXRvckRlc2NyaXB0aW9ufT5cbiAgICAgICAgICAgICAge2luZGljYXRvci5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yVmFsdWV9PntyZWFkYWJsZVBlcmNlbnQoaW5kaWNhdG9yLnZhbHVlKX08L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICAgICkpfVxuXG4gICAgPC9hc2lkZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFyZWFEZXRhaWw7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1hcEludHJvZHVjdGlvbiBmcm9tICcuL21hcEludHJvZHVjdGlvbic7XG5pbXBvcnQgQXJlYURldGFpbCBmcm9tICcuL0FyZWFEZXRhaWwnO1xuXG5pbnRlcmZhY2UgSU1hcEluZm9QYW5lbFByb3BzIHtcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBmZWF0dXJlUHJvcGVydGllczogeyBba2V5OnN0cmluZ106IHN0cmluZyB8IG51bWJlciB9IHwgdW5kZWZpbmVkLFxuICAgIHNlbGVjdGVkRmVhdHVyZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWRcbiAgfVxuXG5jb25zdCBNYXBJbmZvUGFuZWwgPSAoe2NsYXNzTmFtZSwgZmVhdHVyZVByb3BlcnRpZXMsIHNlbGVjdGVkRmVhdHVyZUlkfTpJTWFwSW5mb1BhbmVsUHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSA+XG4gICAgICB7KGZlYXR1cmVQcm9wZXJ0aWVzICYmIHNlbGVjdGVkRmVhdHVyZUlkICkgP1xuICAgICAgICAgIDxBcmVhRGV0YWlsIHByb3BlcnRpZXM9e2ZlYXR1cmVQcm9wZXJ0aWVzfSAvPiA6XG4gICAgICAgICAgPE1hcEludHJvZHVjdGlvbiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFwSW5mb1BhbmVsO1xuIiwiaW1wb3J0IHtTdHlsZSwgRmlsbFBhaW50fSBmcm9tICdtYXBsaWJyZS1nbCc7XG5pbXBvcnQgY2hyb21hIGZyb20gJ2Nocm9tYS1qcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vZGF0YS9jb25zdGFudHMnO1xuaW1wb3J0IHtGbGFnQ29udGFpbmVyfSBmcm9tICcuLi9jb250ZXh0cy9GbGFnQ29udGV4dCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBoZXhUb0hTTEEoaGV4OnN0cmluZywgYWxwaGE6bnVtYmVyKSB7XG4gIHJldHVybiBjaHJvbWEoaGV4KS5hbHBoYShhbHBoYSkuY3NzKCdoc2wnKTtcbn1cblxuLyoqXG4gKiBgTWFrZVBhaW50YCBnZW5lcmF0ZXMgYSB6b29tLWZhZGVkIE1hcGxpYnJlIHN0eWxlIGZvcm1hdHRlZCBsYXllciBnaXZlbiBhIHNldCBvZiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZCA6IHRoZSBmaWVsZCB3aXRoaW4gdGhlIGRhdGEgdG8gY29uc3VsdFxuICogQHBhcmFtIHtudW1iZXJ9IG1pblJhbXAgOiB0aGUgbWluaW11bSB2YWx1ZSB0aGlzIGNhbiBhc3N1bWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtZWRSYW1wIDogdGhlIG1lZGl1bSB2YWx1ZSB0aGlzIGNhbiBhc3N1bWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSYW1wIDogdGhlIG1heGltdW0gdmFsdWUgdGhpcyBjYW4gYXNzdW1lXG4gKiBAcmV0dXJuIHtGaWxsUGFpbnR9IGEgbWFwbGlicmVnbCBmaWxsIGxheWVyXG4gKiovXG5mdW5jdGlvbiBtYWtlUGFpbnQoe1xuICBmaWVsZCxcbiAgbWluUmFtcCxcbiAgbWVkUmFtcCxcbiAgbWF4UmFtcCxcbn06IHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG1pblJhbXA6IG51bWJlcjtcbiAgICBtZWRSYW1wOiBudW1iZXI7XG4gICAgbWF4UmFtcDogbnVtYmVyO1xuICB9KTogRmlsbFBhaW50IHtcbiAgY29uc3QgcGFpbnREZXNjcmlwdG9yIDogRmlsbFBhaW50ID0ge1xuICAgICdmaWxsLWNvbG9yJzogW1xuICAgICAgJ3N0ZXAnLFxuICAgICAgWydnZXQnLCBmaWVsZF0sXG4gICAgICBoZXhUb0hTTEEoY29uc3RhbnRzLk1JTl9DT0xPUiwgY29uc3RhbnRzLkRFRkFVTFRfTEFZRVJfT1BBQ0lUWSApLFxuICAgICAgbWluUmFtcCxcbiAgICAgIGhleFRvSFNMQShjb25zdGFudHMuTUlOX0NPTE9SLCBjb25zdGFudHMuREVGQVVMVF9MQVlFUl9PUEFDSVRZICksXG4gICAgICBtZWRSYW1wLFxuICAgICAgaGV4VG9IU0xBKGNvbnN0YW50cy5NRURfQ09MT1IsIGNvbnN0YW50cy5ERUZBVUxUX0xBWUVSX09QQUNJVFkgKSxcbiAgICAgIG1heFJhbXAsXG4gICAgICBoZXhUb0hTTEEoY29uc3RhbnRzLk1BWF9DT0xPUiwgY29uc3RhbnRzLkRFRkFVTFRfTEFZRVJfT1BBQ0lUWSApLFxuICAgIF0sXG4gIH07XG4gIHJldHVybiBwYWludERlc2NyaXB0b3I7XG59XG5cbmNvbnN0IGltYWdlU3VmZml4ID0gY29uc3RhbnRzLmlzTW9iaWxlID8gJycgOiAnQDJ4JztcblxuZXhwb3J0IGNvbnN0IG1ha2VNYXBTdHlsZSA9IChmbGFnQ29udGFpbmVyOiBGbGFnQ29udGFpbmVyKSA6IFN0eWxlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAndmVyc2lvbic6IDgsXG4gICAgJ3NvdXJjZXMnOiB7XG4gICAgICAnY2FydG8nOiB7XG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICd0aWxlcyc6XG4gICAgICBbXG4gICAgICAgIGBodHRwczovL2EuYmFzZW1hcHMuY2FydG9jZG4uY29tL2xpZ2h0X25vbGFiZWxzL3t6fS97eH0ve3l9JHtpbWFnZVN1ZmZpeH0ucG5nYCxcbiAgICAgICAgYGh0dHBzOi8vYi5iYXNlbWFwcy5jYXJ0b2Nkbi5jb20vbGlnaHRfbm9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICBgaHR0cHM6Ly9jLmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9ub2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgIGBodHRwczovL2QuYmFzZW1hcHMuY2FydG9jZG4uY29tL2xpZ2h0X25vbGFiZWxzL3t6fS97eH0ve3l9JHtpbWFnZVN1ZmZpeH0ucG5nYCxcbiAgICAgIF0sXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NLFxuICAgICAgfSxcbiAgICAgICdnZW8nOiB7XG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICd0aWxlcyc6IFtcbiAgICAgICAgICAnaHR0cHM6Ly9tdDAuZ29vZ2xlLmNvbS92dC9seXJzPXAmaGw9ZW4meD17eH0meT17eX0mej17en0nLFxuICAgICAgICBdLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgICBbY29uc3RhbnRzLkhJR0hfU0NPUkVfU09VUkNFX05BTUVdOiB7XG4gICAgICAvLyBcIlNjb3JlLWhpZ2hcIiByZXByZXNlbnRzIHRoZSBmdWxsIHNldCBvZiBkYXRhXG4gICAgICAvLyBhdCB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGxldmVsLiBJdCBpcyBvbmx5IHNob3duXG4gICAgICAvLyBhdCBoaWdoIHpvb20gbGV2ZWxzIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGlzc3VlcyBhdCBsb3dlciB6b29tc1xuICAgICAgICAndHlwZSc6ICd2ZWN0b3InLFxuICAgICAgICAvLyBPdXIgY3VycmVudCB0aXBwZWNhbm9lIGNvbW1hbmQgZG9lcyBub3Qgc2V0IGFuIGlkLlxuICAgICAgICAvLyBUaGUgYmVsb3cgbGluZSBwcm9tb3RlcyB0aGUgR0VPSUQxMCBwcm9wZXJ0eSB0byB0aGUgSURcbiAgICAgICAgJ3Byb21vdGVJZCc6IGNvbnN0YW50cy5HRU9JRF9QUk9QRVJUWSxcbiAgICAgICAgJ3RpbGVzJzogW1xuICAgICAgICAgICdoaWdoX3RpbGVzJyBpbiBmbGFnQ29udGFpbmVyID9cbiAgICAgICAgICBjb25zdGFudHMuZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lKGZsYWdDb250YWluZXJbJ2hpZ2hfdGlsZXMnXSkgOlxuICAgICAgICAgIGNvbnN0YW50cy5GRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTCxcbiAgICAgICAgXSxcbiAgICAgICAgLy8gU2VldGluZyBtYXh6b29tIGhlcmUgZW5hYmxlcyAnb3Zlcnpvb21pbmcnXG4gICAgICAgIC8vIGUuZy4gY29udGludWVkIHpvb21pbmcgYmV5b25kIHRoZSBtYXggYm91bmRzLlxuICAgICAgICAvLyBNb3JlIGhlcmU6IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvb3Zlcnpvb20vXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdILFxuICAgICAgICAnbWF4em9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUFYX1pPT01fSElHSCxcbiAgICAgIH0sXG4gICAgICBbY29uc3RhbnRzLkxPV19TQ09SRV9TT1VSQ0VfTkFNRV06IHtcbiAgICAgIC8vIFwiU2NvcmUtbG93XCIgcmVwcmVzZW50cyBhIHRpbGVzZXQgYXQgdGhlIGxldmVsIG9mIGJ1Y2tldGVkIHRyYWN0cy5cbiAgICAgIC8vIGNlbnN1cyBibG9jayBncm91cCBpbmZvcm1hdGlvbiBpcyBgZGlzc29sdmVgZCBpbnRvIHRyYWN0cywgdGhlblxuICAgICAgLy8gZWFjaCB0cmFjdCBpcyBgZGlzc29sdmVgZCBpbnRvIG9uZSBvZiB0ZW4gYnVja2V0cy4gSXQgaXMgbWVhbnRcbiAgICAgIC8vIHRvIGdpdmUgdXMgYSBmYXZvcmFibGUgdHJhZGVvZmYgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQgZmlkZWxpdHkuXG4gICAgICAgICd0eXBlJzogJ3ZlY3RvcicsXG4gICAgICAgICdwcm9tb3RlSWQnOiBjb25zdGFudHMuR0VPSURfUFJPUEVSVFksXG4gICAgICAgICd0aWxlcyc6IFtcbiAgICAgICAgICAnbG93X3RpbGVzJyBpbiBmbGFnQ29udGFpbmVyID9cbiAgICAgICAgICBjb25zdGFudHMuZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lKGZsYWdDb250YWluZXJbJ2xvd190aWxlcyddKSA6XG4gICAgICAgICAgY29uc3RhbnRzLkZFQVRVUkVfVElMRV9MT1dfWk9PTV9VUkwsXG4gICAgICAgIC8vIEZvciBsb2NhbCBkZXZlbG9wbWVudCwgdXNlOlxuICAgICAgICAvLyAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL2RhdGEvdGxfMjAxMF9iZ193aXRoX2RhdGEve3p9L3t4fS97eX0ucGJmJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0xPVyxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0xPVyxcbiAgICAgIH0sXG4gICAgICAnbGFiZWxzJzoge1xuICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAndGlsZXMnOiBbXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1hLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1iLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1jLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1kLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgJ2xheWVycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ2lkJzogJ2NhcnRvJyxcbiAgICAgICAgJ3NvdXJjZSc6ICdjYXJ0bycsXG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ2lkJzogJ2dlbycsXG4gICAgICAgICdzb3VyY2UnOiAnZ2VvJyxcbiAgICAgICAgJ3R5cGUnOiAncmFzdGVyJyxcbiAgICAgICAgJ2xheW91dCc6IHtcbiAgICAgICAgLy8gTWFrZSB0aGUgbGF5ZXIgaW52aXNpYmxlIGJ5IGRlZmF1bHQuXG4gICAgICAgICAgJ3Zpc2liaWxpdHknOiAnbm9uZScsXG4gICAgICAgIH0sXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ2lkJzogY29uc3RhbnRzLkhJR0hfU0NPUkVfTEFZRVJfTkFNRSxcbiAgICAgICAgJ3NvdXJjZSc6IGNvbnN0YW50cy5ISUdIX1NDT1JFX1NPVVJDRV9OQU1FLFxuICAgICAgICAnc291cmNlLWxheWVyJzogY29uc3RhbnRzLlNDT1JFX1NPVVJDRV9MQVlFUixcbiAgICAgICAgJ3R5cGUnOiAnZmlsbCcsXG4gICAgICAgICdwYWludCc6IG1ha2VQYWludCh7XG4gICAgICAgICAgZmllbGQ6IGNvbnN0YW50cy5TQ09SRV9QUk9QRVJUWV9ISUdILFxuICAgICAgICAgIG1pblJhbXA6IGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9MT1csXG4gICAgICAgICAgbWVkUmFtcDogY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1RIUkVTSE9MRCxcbiAgICAgICAgICBtYXhSYW1wOiBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfUFJJT1JJVElaRUQsXG4gICAgICAgIH0pLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT01fSElHSCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdpZCc6IGNvbnN0YW50cy5MT1dfU0NPUkVfTEFZRVJfTkFNRSxcbiAgICAgICAgJ3NvdXJjZSc6IGNvbnN0YW50cy5MT1dfU0NPUkVfU09VUkNFX05BTUUsXG4gICAgICAgICdzb3VyY2UtbGF5ZXInOiBjb25zdGFudHMuU0NPUkVfU09VUkNFX0xBWUVSLFxuICAgICAgICAndHlwZSc6ICdmaWxsJyxcbiAgICAgICAgJ2ZpbHRlcic6IFsnYWxsJyxcbiAgICAgICAgICBbJz4nLCBjb25zdGFudHMuU0NPUkVfUFJPUEVSVFlfTE9XLCBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfVEhSRVNIT0xEXSxcbiAgICAgICAgXSxcbiAgICAgICAgJ3BhaW50JzogbWFrZVBhaW50KHtcbiAgICAgICAgICBmaWVsZDogY29uc3RhbnRzLlNDT1JFX1BST1BFUlRZX0xPVyxcbiAgICAgICAgICBtaW5SYW1wOiBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfTE9XLFxuICAgICAgICAgIG1lZFJhbXA6IGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9USFJFU0hPTEQsXG4gICAgICAgICAgbWF4UmFtcDogY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVELFxuICAgICAgICB9KSxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0xPVyxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0xPVyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAvLyBXZSBwdXQgbGFiZWxzIGxhc3QgdG8gZW5zdXJlIHByb21pbmVuY2VcbiAgICAgICAgJ2lkJzogJ2xhYmVscy1vbmx5LWxheWVyJyxcbiAgICAgICAgJ3R5cGUnOiAncmFzdGVyJyxcbiAgICAgICAgJ3NvdXJjZSc6ICdsYWJlbHMnLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn07XG5cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBtYXBBbmRJbmZvUGFuZWxDb250YWluZXIgPSBcIko0ME1hcC1tb2R1bGUtLW1hcEFuZEluZm9QYW5lbENvbnRhaW5lci0tcS1vZHlcIjtcbmV4cG9ydCB2YXIgajQwUG9wdXAgPSBcIko0ME1hcC1tb2R1bGUtLWo0MFBvcHVwLS0zeUpHclwiO1xuZXhwb3J0IHZhciBuYXZpZ2F0aW9uQ29udHJvbCA9IFwiSjQwTWFwLW1vZHVsZS0tbmF2aWdhdGlvbkNvbnRyb2wtLTJBeWJmXCI7XG5leHBvcnQgdmFyIGZ1bGxzY3JlZW5Db250cm9sID0gXCJKNDBNYXAtbW9kdWxlLS1mdWxsc2NyZWVuQ29udHJvbC0tMVVCS2VcIjtcbmV4cG9ydCB2YXIgZ2VvbG9jYXRlQ29udHJvbCA9IFwiSjQwTWFwLW1vZHVsZS0tZ2VvbG9jYXRlQ29udHJvbC0tM0tWQWtcIjtcbmV4cG9ydCB2YXIgbWFwSW5mb1BhbmVsID0gXCJKNDBNYXAtbW9kdWxlLS1tYXBJbmZvUGFuZWwtLUYzalI0XCI7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8vIEV4dGVybmFsIExpYnM6XG5pbXBvcnQgUmVhY3QsIHtNb3VzZUV2ZW50LCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge01hcCwgTWFwYm94R2VvSlNPTkZlYXR1cmUsIExuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJ21hcGxpYnJlLWdsJztcbmltcG9ydCBSZWFjdE1hcEdMLCB7XG4gIE1hcEV2ZW50LFxuICBWaWV3cG9ydFByb3BzLFxuICBXZWJNZXJjYXRvclZpZXdwb3J0LFxuICBOYXZpZ2F0aW9uQ29udHJvbCxcbiAgR2VvbG9jYXRlQ29udHJvbCxcbiAgUG9wdXAsXG4gIEZseVRvSW50ZXJwb2xhdG9yLFxuICBGdWxsc2NyZWVuQ29udHJvbCxcbiAgTWFwUmVmLCBTb3VyY2UsIExheWVyfSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IGJib3ggZnJvbSAnQHR1cmYvYmJveCc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMy1lYXNlJztcbmltcG9ydCB7aXNNb2JpbGV9IGZyb20gJ3JlYWN0LWRldmljZS1kZXRlY3QnO1xuXG4vLyBDb250ZXh0czpcbmltcG9ydCB7dXNlRmxhZ3N9IGZyb20gJy4uL2NvbnRleHRzL0ZsYWdDb250ZXh0JztcblxuLy8gQ29tcG9uZW50czpcbmltcG9ydCBUZXJyaXRvcnlGb2N1c0NvbnRyb2wgZnJvbSAnLi90ZXJyaXRvcnlGb2N1c0NvbnRyb2wnO1xuaW1wb3J0IE1hcEluZm9QYW5lbCBmcm9tICcuL21hcEluZm9QYW5lbCc7XG5pbXBvcnQgQXJlYURldGFpbCBmcm9tICcuL0FyZWFEZXRhaWwnO1xuXG4vLyBTdHlsZXMgYW5kIGNvbnN0YW50c1xuaW1wb3J0IHttYWtlTWFwU3R5bGV9IGZyb20gJy4uL2RhdGEvbWFwU3R5bGUnO1xuaW1wb3J0ICdtYXBsaWJyZS1nbC9kaXN0L21hcGxpYnJlLWdsLmNzcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vZGF0YS9jb25zdGFudHMnO1xuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vSjQwTWFwLm1vZHVsZS5zY3NzJztcblxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIEN5cHJlc3M/OiBvYmplY3Q7XG4gICAgdW5kZXJseWluZ01hcDogTWFwO1xuICB9XG59XG5cbmludGVyZmFjZSBJSjQwSW50ZXJmYWNlIHtcbiAgbG9jYXRpb246IExvY2F0aW9uO1xufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXRhaWxWaWV3SW50ZXJmYWNlIHtcbiAgbGF0aXR1ZGU6IG51bWJlclxuICBsb25naXR1ZGU6IG51bWJlclxuICB6b29tOiBudW1iZXJcbiAgcHJvcGVydGllczogY29uc3RhbnRzLko0MFByb3BlcnRpZXMsXG59O1xuXG5jb25zdCBKNDBNYXAgPSAoe2xvY2F0aW9ufTogSUo0MEludGVyZmFjZSkgPT4ge1xuICAvLyBIYXNoIHBvcnRpb24gb2YgVVJMIGlzIG9mIHRoZSBmb3JtICN6b29tL2xhdC9sbmdcbiAgY29uc3QgW3pvb20sIGxhdCwgbG5nXSA9IGxvY2F0aW9uLmhhc2guc2xpY2UoMSkuc3BsaXQoJy8nKTtcbiAgY29uc3QgW3ZpZXdwb3J0LCBzZXRWaWV3cG9ydF0gPSB1c2VTdGF0ZTxWaWV3cG9ydFByb3BzPih7XG4gICAgbGF0aXR1ZGU6IGxhdCAmJiBwYXJzZUZsb2F0KGxhdCkgfHwgY29uc3RhbnRzLkRFRkFVTFRfQ0VOVEVSWzBdLFxuICAgIGxvbmdpdHVkZTogbG5nICYmIHBhcnNlRmxvYXQobG5nKSB8fCBjb25zdGFudHMuREVGQVVMVF9DRU5URVJbMV0sXG4gICAgem9vbTogem9vbSAmJiBwYXJzZUZsb2F0KHpvb20pIHx8IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gIH0pO1xuXG4gIGNvbnN0IFtzZWxlY3RlZEZlYXR1cmUsIHNldFNlbGVjdGVkRmVhdHVyZV0gPSB1c2VTdGF0ZTxNYXBib3hHZW9KU09ORmVhdHVyZT4oKTtcbiAgY29uc3QgW2RldGFpbFZpZXdEYXRhLCBzZXREZXRhaWxWaWV3RGF0YV0gPSB1c2VTdGF0ZTxJRGV0YWlsVmlld0ludGVyZmFjZT4oKTtcbiAgY29uc3QgW3RyYW5zaXRpb25JblByb2dyZXNzLCBzZXRUcmFuc2l0aW9uSW5Qcm9ncmVzc10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtnZW9sb2NhdGlvbkluUHJvZ3Jlc3MsIHNldEdlb2xvY2F0aW9uSW5Qcm9ncmVzc10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtpc01vYmlsZU1hcFN0YXRlLCBzZXRJc01vYmlsZU1hcFN0YXRlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCBtYXBSZWYgPSB1c2VSZWY8TWFwUmVmPihudWxsKTtcbiAgY29uc3QgZmxhZ3MgPSB1c2VGbGFncygpO1xuXG4gIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUlkID0gKHNlbGVjdGVkRmVhdHVyZSAmJiBzZWxlY3RlZEZlYXR1cmUuaWQpIHx8ICcnO1xuICBjb25zdCBmaWx0ZXIgPSB1c2VNZW1vKCgpID0+IFsnaW4nLCBjb25zdGFudHMuR0VPSURfUFJPUEVSVFksIHNlbGVjdGVkRmVhdHVyZUlkXSwgW3NlbGVjdGVkRmVhdHVyZV0pO1xuXG4gIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQ6IE1hcEV2ZW50KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZSA9IGV2ZW50LmZlYXR1cmVzICYmIGV2ZW50LmZlYXR1cmVzWzBdO1xuICAgIGlmIChmZWF0dXJlKSB7XG4gICAgICBjb25zdCBbbWluTG5nLCBtaW5MYXQsIG1heExuZywgbWF4TGF0XSA9IGJib3goZmVhdHVyZSk7XG4gICAgICBjb25zdCBuZXdWaWV3UG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCEsIHdpZHRoOiB2aWV3cG9ydC53aWR0aCF9KTtcbiAgICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IG5ld1ZpZXdQb3J0LmZpdEJvdW5kcyhcbiAgICAgICAgICBbXG4gICAgICAgICAgICBbbWluTG5nLCBtaW5MYXRdLFxuICAgICAgICAgICAgW21heExuZywgbWF4TGF0XSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDQwLFxuICAgICAgICAgIH0sXG4gICAgICApO1xuICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IHNlbGVjdGVkRmVhdHVyZUlkKSB7XG4gICAgICAgIHNldFNlbGVjdGVkRmVhdHVyZShmZWF0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGVkRmVhdHVyZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcG9wdXBJbmZvID0ge1xuICAgICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICB9O1xuICAgICAgZ29Ub1BsYWNlKFtcbiAgICAgICAgW21pbkxuZywgbWluTGF0XSxcbiAgICAgICAgW21heExuZywgbWF4TGF0XSxcbiAgICAgIF0pO1xuICAgICAgc2V0RGV0YWlsVmlld0RhdGEocG9wdXBJbmZvKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25Mb2FkID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuQ3lwcmVzcyAmJiBtYXBSZWYuY3VycmVudCkge1xuICAgICAgd2luZG93LnVuZGVybHlpbmdNYXAgPSBtYXBSZWYuY3VycmVudC5nZXRNYXAoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNb2JpbGUpIHNldElzTW9iaWxlTWFwU3RhdGUodHJ1ZSk7XG4gIH07XG5cblxuICBjb25zdCBnb1RvUGxhY2UgPSAoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlICkgPT4ge1xuICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCEsIHdpZHRoOiB2aWV3cG9ydC53aWR0aCF9KVxuICAgICAgICAuZml0Qm91bmRzKGJvdW5kcyBhcyBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sIHtcbiAgICAgICAgICBwYWRkaW5nOiAyMCxcbiAgICAgICAgICBvZmZzZXQ6IFswLCAtMTAwXSxcbiAgICAgICAgfSk7XG4gICAgc2V0Vmlld3BvcnQoe1xuICAgICAgLi4udmlld3BvcnQsXG4gICAgICBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSxcbiAgICAgIHpvb20sXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb246IDEwMDAsXG4gICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgRmx5VG9JbnRlcnBvbGF0b3IoKSxcbiAgICAgIHRyYW5zaXRpb25FYXNpbmc6IGQzLmVhc2VDdWJpYyxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgYnV0dG9uSUQgPSBldmVudC50YXJnZXQgJiYgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQ7XG5cbiAgICBzd2l0Y2ggKGJ1dHRvbklEKSB7XG4gICAgICBjYXNlICc0OCc6XG4gICAgICAgIGdvVG9QbGFjZShjb25zdGFudHMuTE9XRVJfNDhfQk9VTkRTKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBSyc6XG4gICAgICAgIGdvVG9QbGFjZShjb25zdGFudHMuQUxBU0tBX0JPVU5EUyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSEknOlxuICAgICAgICBnb1RvUGxhY2UoY29uc3RhbnRzLkhBV0FJSV9CT1VORFMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BSJzpcbiAgICAgICAgZ29Ub1BsYWNlKGNvbnN0YW50cy5QVUVSVE9fUklDT19CT1VORFMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uVHJhbnNpdGlvblN0YXJ0ID0gKCkgPT4ge1xuICAgIHNldFRyYW5zaXRpb25JblByb2dyZXNzKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9ICgpID0+IHtcbiAgICBzZXRUcmFuc2l0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XG4gIH07XG5cbiAgY29uc3Qgb25HZW9sb2NhdGUgPSAoKSA9PiB7XG4gICAgc2V0R2VvbG9jYXRpb25JblByb2dyZXNzKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrR2VvbG9jYXRlID0gKCkgPT4ge1xuICAgIHNldEdlb2xvY2F0aW9uSW5Qcm9ncmVzcyh0cnVlKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubWFwQW5kSW5mb1BhbmVsQ29udGFpbmVyfT5cbiAgICAgIDxSZWFjdE1hcEdMXG4gICAgICAgIHsuLi52aWV3cG9ydH1cbiAgICAgICAgbWFwU3R5bGU9e21ha2VNYXBTdHlsZShmbGFncyl9XG4gICAgICAgIG1pblpvb209e2NvbnN0YW50cy5HTE9CQUxfTUlOX1pPT019XG4gICAgICAgIG1heFpvb209e2NvbnN0YW50cy5HTE9CQUxfTUFYX1pPT019XG4gICAgICAgIG1hcE9wdGlvbnM9e3toYXNoOiB0cnVlfX1cbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgaGVpZ2h0PXtpc01vYmlsZU1hcFN0YXRlID8gJzQ0dmgnIDogJzEwMCUnfVxuICAgICAgICBkcmFnUm90YXRlPXtmYWxzZX1cbiAgICAgICAgdG91Y2hSb3RhdGU9e2ZhbHNlfVxuICAgICAgICBpbnRlcmFjdGl2ZUxheWVySWRzPXtbY29uc3RhbnRzLkhJR0hfU0NPUkVfTEFZRVJfTkFNRV19XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2U9e3NldFZpZXdwb3J0fVxuICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICBvbkxvYWQ9e29uTG9hZH1cbiAgICAgICAgb25UcmFuc2l0aW9uU3RhcnQ9e29uVHJhbnNpdGlvblN0YXJ0fVxuICAgICAgICBvblRyYW5zaXRpb25FbmQ9e29uVHJhbnNpdGlvbkVuZH1cbiAgICAgICAgcmVmPXttYXBSZWZ9XG4gICAgICAgIGRhdGEtY3k9eydyZWFjdE1hcEdMJ31cbiAgICAgID5cbiAgICAgICAgPFNvdXJjZVxuICAgICAgICAgIGlkPXtjb25zdGFudHMuSElHSF9TQ09SRV9TT1VSQ0VfTkFNRX1cbiAgICAgICAgICB0eXBlPVwidmVjdG9yXCJcbiAgICAgICAgICBwcm9tb3RlSWQ9e2NvbnN0YW50cy5HRU9JRF9QUk9QRVJUWX1cbiAgICAgICAgICB0aWxlcz17W2NvbnN0YW50cy5GRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTF19XG4gICAgICAgICAgbWF4em9vbT17Y29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdIfVxuICAgICAgICAgIG1pbnpvb209e2NvbnN0YW50cy5HTE9CQUxfTUFYX1pPT01fSElHSH1cbiAgICAgICAgPlxuICAgICAgICAgIDxMYXllclxuICAgICAgICAgICAgaWQ9e2NvbnN0YW50cy5DVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9ISUdITElHSFRfTEFZRVJfTkFNRX1cbiAgICAgICAgICAgIHNvdXJjZS1sYXllcj17Y29uc3RhbnRzLlNDT1JFX1NPVVJDRV9MQVlFUn1cbiAgICAgICAgICAgIHR5cGU9J2xpbmUnXG4gICAgICAgICAgICBwYWludD17e1xuICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IGNvbnN0YW50cy5ERUZBVUxUX09VVExJTkVfQ09MT1IsXG4gICAgICAgICAgICAgICdsaW5lLXdpZHRoJzogY29uc3RhbnRzLkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX1dJRFRILFxuICAgICAgICAgICAgICAnbGluZS1vcGFjaXR5JzogY29uc3RhbnRzLkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX09QQUNJVFksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgbWluem9vbT17Y29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdITElHSFR9XG4gICAgICAgICAgICBtYXh6b29tPXtjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0hJR0hMSUdIVH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPExheWVyXG4gICAgICAgICAgICBpZD17Y29uc3RhbnRzLkJMT0NLX0dST1VQX0JPVU5EQVJZX0xBWUVSX05BTUV9XG4gICAgICAgICAgICB0eXBlPSdsaW5lJ1xuICAgICAgICAgICAgc291cmNlLWxheWVyPXtjb25zdGFudHMuU0NPUkVfU09VUkNFX0xBWUVSfVxuICAgICAgICAgICAgcGFpbnQ9e3tcbiAgICAgICAgICAgICAgJ2xpbmUtY29sb3InOiBjb25zdGFudHMuQk9SREVSX0hJR0hMSUdIVF9DT0xPUixcbiAgICAgICAgICAgICAgJ2xpbmUtd2lkdGgnOiBjb25zdGFudHMuSElHSExJR0hUX0JPUkRFUl9XSURUSCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgIG1pbnpvb209e2NvbnN0YW50cy5HTE9CQUxfTUlOX1pPT01fSElHSH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NvdXJjZT5cbiAgICAgICAgeygnZnMnIGluIGZsYWdzICYmIGRldGFpbFZpZXdEYXRhICYmICF0cmFuc2l0aW9uSW5Qcm9ncmVzcykgJiYgKFxuICAgICAgICAgIDxQb3B1cFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuajQwUG9wdXB9XG4gICAgICAgICAgICB0aXBTaXplPXs1fVxuICAgICAgICAgICAgYW5jaG9yPVwidG9wXCJcbiAgICAgICAgICAgIGxvbmdpdHVkZT17ZGV0YWlsVmlld0RhdGEubG9uZ2l0dWRlIX1cbiAgICAgICAgICAgIGxhdGl0dWRlPXtkZXRhaWxWaWV3RGF0YS5sYXRpdHVkZSF9XG4gICAgICAgICAgICBjbG9zZU9uQ2xpY2s9e3RydWV9XG4gICAgICAgICAgICBvbkNsb3NlPXtzZXREZXRhaWxWaWV3RGF0YX1cbiAgICAgICAgICAgIGNhcHR1cmVTY3JvbGw9e3RydWV9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFyZWFEZXRhaWwgcHJvcGVydGllcz17ZGV0YWlsVmlld0RhdGEucHJvcGVydGllc30gLz5cbiAgICAgICAgICA8L1BvcHVwPlxuICAgICAgICApfVxuICAgICAgICA8TmF2aWdhdGlvbkNvbnRyb2xcbiAgICAgICAgICBzaG93Q29tcGFzcz17ZmFsc2V9XG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMubmF2aWdhdGlvbkNvbnRyb2x9XG4gICAgICAgIC8+XG4gICAgICAgIHsnZ2wnIGluIGZsYWdzID8gPEdlb2xvY2F0ZUNvbnRyb2xcbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5nZW9sb2NhdGVDb250cm9sfVxuICAgICAgICAgIHBvc2l0aW9uT3B0aW9ucz17e2VuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZX19XG4gICAgICAgICAgb25HZW9sb2NhdGU9e29uR2VvbG9jYXRlfVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgLy8gVHlwZXMgaGF2ZSBub3QgY2F1Z2h0IHVwIHlldCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aXNnbC9yZWFjdC1tYXAtZ2wvaXNzdWVzLzE0OTJcbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrR2VvbG9jYXRlfVxuICAgICAgICAvPiA6ICcnfVxuICAgICAgICB7Z2VvbG9jYXRpb25JblByb2dyZXNzID8gPGRpdj5HZW9sb2NhdGlvbiBpbiBwcm9ncmVzcy4uLjwvZGl2PiA6ICcnfVxuICAgICAgICA8VGVycml0b3J5Rm9jdXNDb250cm9sIG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbj17b25DbGlja1RlcnJpdG9yeUZvY3VzQnV0dG9ufS8+XG4gICAgICAgIHsnZnMnIGluIGZsYWdzID8gPEZ1bGxzY3JlZW5Db250cm9sIGNsYXNzTmFtZT17c3R5bGVzLmZ1bGxzY3JlZW5Db250cm9sfS8+IDonJyB9XG4gICAgICA8L1JlYWN0TWFwR0w+XG4gICAgICA8TWFwSW5mb1BhbmVsXG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLm1hcEluZm9QYW5lbH1cbiAgICAgICAgZmVhdHVyZVByb3BlcnRpZXM9e2RldGFpbFZpZXdEYXRhPy5wcm9wZXJ0aWVzfVxuICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZD17c2VsZWN0ZWRGZWF0dXJlPy5pZH1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYXA7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgbWFwQ2FwdGlvblRleHRMaW5rID0gXCJtYXBXcmFwcGVyLW1vZHVsZS0tbWFwQ2FwdGlvblRleHRMaW5rLS0yM2IyblwiOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG5pbXBvcnQgSjQwTWFwIGZyb20gJy4uL0o0ME1hcCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL21hcFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcbmltcG9ydCBBbGVydFdyYXBwZXIgZnJvbSAnLi4vQWxlcnRXcmFwcGVyJztcblxuaW50ZXJmYWNlIElNYXBXcmFwcGVyUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbn1cblxuY29uc3QgTWFwV3JhcHBlciA9ICh7bG9jYXRpb259OiBJTWFwV3JhcHBlclByb3BzKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICAgIGRvd25sb2FkTGlua1RleHQ6IHtcbiAgICAgIGlkOiAnbWFwd3JhcHBlci5kb3dubG9hZC5saW5rJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRG93bmxvYWQgdGhlIGRyYWZ0IGxpc3Qgb2YgcHJpb3JpdGl6ZWQgY29tbXVuaXRpZXMgKHByZS1kZWNpc2lvbmFsKSBhbmQgZGF0YXNldHMgdXNlZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ2Rvd25sb2FkIGxpbmsgZm9yIGRhdGFzZXRzJyxcbiAgICB9LFxuICAgIGRvd25sb2FkQ29udGVudHM6IHtcbiAgICAgIGlkOiAnbWFwd3JhcHBlci5kb3dubG9hZC5jb250ZW50cycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1pJUCBmaWxlIHdpbGwgY29udGFpbiBvbmUgLnhsc3gsIG9uZSAuY3N2IGFuZCBvbmUgLnBkZiAoMzAgTUIpLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ2Rvd25sb2FkIGxpbmsgY29udGVudHMnLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e2ZhbHNlfSBzaG93TGltaXRlZERhdGFBbGVydD17dHJ1ZX0vPlxuICAgICAgPEo0ME1hcCBsb2NhdGlvbj17bG9jYXRpb259Lz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubWFwQ2FwdGlvblRleHRMaW5rfT5cbiAgICAgICAgPGEgaHJlZj17Y29uc3RhbnRzLkRPV05MT0FEX1pJUF9VUkx9PlxuICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZG93bmxvYWRMaW5rVGV4dCl9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRvd25sb2FkQ29udGVudHMpfTwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCBNYXBXcmFwcGVyO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGxlZ2VuZENvbnRhaW5lciA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kQ29udGFpbmVyLS0yRmFLSFwiO1xuZXhwb3J0IHZhciBsZWdlbmRUb29sdGlwVGV4dCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kVG9vbHRpcFRleHQtLTN3cTZmXCI7XG5leHBvcnQgdmFyIGxlZ2VuZEhlYWRlciA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kSGVhZGVyLS0yR1pLNlwiO1xuZXhwb3J0IHZhciBzd2F0Y2hDb250YWluZXIgPSBcIm1hcExlZ2VuZC1tb2R1bGUtLXN3YXRjaENvbnRhaW5lci0tMXZVMkpcIjtcbmV4cG9ydCB2YXIgbGVnZW5kSXRlbSA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kSXRlbS0tMlZ4VlpcIjtcbmV4cG9ydCB2YXIgaW5mb0ljb25XcmFwcGVyID0gXCJtYXBMZWdlbmQtbW9kdWxlLS1pbmZvSWNvbldyYXBwZXItLTJfMUtnXCI7XG5leHBvcnQgdmFyIGluZm9JY29uID0gXCJtYXBMZWdlbmQtbW9kdWxlLS1pbmZvSWNvbi0tM01SZThcIjtcbmV4cG9ydCB2YXIgY29sb3JTd2F0Y2ggPSBcIm1hcExlZ2VuZC1tb2R1bGUtLWNvbG9yU3dhdGNoLS1fU1F3VFwiO1xuZXhwb3J0IHZhciBwcmlvcml0aXplZCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tcHJpb3JpdGl6ZWQtLTJ2a1FHXCI7XG5leHBvcnQgdmFyIHRocmVzaG9sZCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tdGhyZXNob2xkLS0yLTFLcVwiO1xuZXhwb3J0IHZhciBub25Qcmlvcml0aXplZCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbm9uUHJpb3JpdGl6ZWQtLVhiR3pOXCI7XG5leHBvcnQgdmFyIGxlZ2VuZFRvb2x0aXBUaGVtZSA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kVG9vbHRpcFRoZW1lLS0zUEdEeVwiO1xuZXhwb3J0IHZhciBwbGFjZVRvcCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tcGxhY2UtdG9wLS0ydF9lZFwiOyIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURJMElESTBJaUJvWldsbmFIUTlJakkwSWlCMmFXVjNRbTk0UFNJd0lEQWdNalFnTWpRaUlIZHBaSFJvUFNJeU5DSStQR2MrUEhCaGRHZ2daRDBpVFRBc01HZ3lOSFl5TkVnd1ZqQjZJaUJtYVd4c1BTSnViMjVsSWk4K1BIQmhkR2dnWkQwaVRURXhMRGRvTW5ZeWFDMHlWamQ2SUUweE1Td3hNV2d5ZGpab0xUSldNVEY2SUUweE1pd3lRell1TkRnc01pd3lMRFl1TkRnc01pd3hNbk0wTGpRNExERXdMREV3TERFd2N6RXdMVFF1TkRnc01UQXRNVEJUTVRjdU5USXNNaXd4TWl3eWVpQk5NVElzTWpBZ1l5MDBMalF4TERBdE9DMHpMalU1TFRndE9ITXpMalU1TFRnc09DMDRjemdzTXk0MU9TdzRMRGhUTVRZdU5ERXNNakFzTVRJc01qQjZJaTgrUEM5blBqd3ZjM1puUGc9PVwiIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCB7VG9vbHRpcH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9tYXBMZWdlbmQubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IGluZm9JY29uIGZyb20gJy9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2luZm9fb3V0bGluZS5zdmcnO1xuXG4vLyBUb2RvIFZTOiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBpbiB0aGUgcmUtZGVzaWduIG9mIHRoZSB0b29sLXRpcFxuLy8gY29uc3QgZ2V0VG9vbFRpcENvbnRlbnQgPSAodHlwZTpzdHJpbmcpID0+IHtcbi8vICAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbi8vICAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4vLyAgICAgcHJpb3JpdHlIZWFkZXI6IHtcbi8vICAgICAgIGlkOiAndG9vbHRpcC5pbmZvLnByaW9yaXR5LmhlYWRlcicsXG4vLyAgICAgICBkZWZhdWx0TWVzc2FnZTogY29uc3RhbnRzLlBSSU9SSVRJWkVEX0NPTU1VTklUWSxcbi8vICAgICAgIGRlc2NyaXB0aW9uOiAndGhlIGhlYWRlciBvZiB0aGUgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IHRvb2x0aXAnLFxuLy8gICAgIH0sXG4vLyAgICAgdGhyZXNob2xkSGVhZGVyOiB7XG4vLyAgICAgICBpZDogJ3Rvb2x0aXAuaW5mby50aHJlc2hvbGQuaGVhZGVyJyxcbi8vICAgICAgIGRlZmF1bHRNZXNzYWdlOiBjb25zdGFudHMuVEhSRVNIT0xEX0NPTU1VTklUWSxcbi8vICAgICAgIGRlc2NyaXB0aW9uOiAndGhlIGhlYWRlciBvZiB0aGUgdGhyZXNob2xkIGNvbW11bml0eSB0b29sdGlwJyxcbi8vICAgICB9LFxuLy8gICAgIHByaW9yaXR5VGV4dDoge1xuLy8gICAgICAgaWQ6ICd0b29sdGlwLmluZm8ucHJpb3JpdHkudGV4dCcsXG4vLyAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0EgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IGlzIG9uZSB0aGF0IGhhcyBhIGN1bXVsYXRpdmUgaW5kZXggc2NvcmUgb2YgWHRoICcgK1xuLy8gICAgICAgJ3BlcmNlbnRpbGUgYW5kIGFib3ZlLiA0MCUgb2YgdGhlIGJlbmVmaXRzIGZyb20gaW52ZXN0bWVudHMgb3V0bGluZWQgYnkgdGhlICcgK1xuLy8gICAgICAgJ0p1c3RpY2U0MCBJbml0aWF0aXZlIHNob3VsZCBnbyB0byBwcmlvcml0aXplZCBjb21tdW5pdGllcy4nLFxuLy8gICAgICAgZGVzY3JpcHRpb246ICd0aGUgdGV4dCBvZiB0aGUgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IHRvb2x0aXAnLFxuLy8gICAgIH0sXG4vLyAgICAgdGhyZXNob2xkVGV4dDoge1xuLy8gICAgICAgaWQ6ICd0b29sdGlwLmluZm8udGhyZXNob2xkLnRleHQnLFxuLy8gICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDb21tdW5pdGllcyB3aXRoIGEgY3VtdWxhdGl2ZSBpbmRleCBzY29yZSBiZXR3ZWVuIFkgLSBYLjk5dGggcGVyY2VudGlsZSBhcmUgJyArXG4vLyAgICAgICdjb25zaWRlcmVkIHRocmVzaG9sZCBjb21tdW5pdGllcy4gV2hpbGUgdGhlc2UgY29tbXVuaXRpZXMgYXJlIGN1cnJlbnRseSBub3QgY29uc2lkZXJlZCBhICcgK1xuLy8gICAgICAncHJpb3JpdGl6ZWQgY29tbXVuaXR5LCB0aGlzIG1heSBjaGFuZ2UgYmFzZWQgb24gdXBkYXRlcyB0byB0aGUgc2NvcmluZyBtZXRob2QuJyxcbi8vICAgICAgIGRlc2NyaXB0aW9uOiAndGhlIHRleHQgb2YgdGhlIHRocmVzaG9sZCBjb21tdW5pdHkgdG9vbHRpcCcsXG4vLyAgICAgfSxcbi8vICAgfSk7XG5cbi8vICAgcmV0dXJuICh0eXBlID09PSAncHJpb3JpdGl6ZWQnKSA/XG4vLyAgICAgKFxuLy8gICAgIDxkaXY+XG4vLyAgICAgICA8aDI+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5wcmlvcml0eUhlYWRlcil9PC9oMj5cbi8vICAgICAgIDxwIGNsYXNzTmFtZT17c3R5bGVzLmxlZ2VuZFRvb2x0aXBUZXh0fT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnByaW9yaXR5VGV4dCl9PC9wPlxuLy8gICAgIDwvZGl2PlxuLy8gICAgICkgOlxuLy8gICAgIChcbi8vICAgICAgIDxkaXY+XG4vLyAgICAgICAgIDxoMj57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnRocmVzaG9sZEhlYWRlcil9PC9oMj5cbi8vICAgICAgICAgPHAgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kVG9vbHRpcFRleHR9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMudGhyZXNob2xkVGV4dCl9PC9wPlxuLy8gICAgICAgPC9kaXY+XG4vLyAgICAgKTtcbi8vIH07XG5cbmNvbnN0IE1hcExlZ2VuZCA9ICgpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuICAvLyBUeXBlIGRlZmluaXRpb25zIHJlcXVpcmVkIGZvciBAdHJ1c3N3b3JrcyB0b29sdGlwLiBUaGlzIHR5cGUgZGVmaW5lcyB0aGUgZGl2IHRoYXQgd3JhcHMgdGhlIGljb24uXG4gIC8vIFRoaXMgYWxsb3dzIHRvIHBhc3MgY2hpbGRyZW4gYW5kIG90aGVyIGF0dHJpYnV0ZXMuXG4gIHR5cGUgSWNvbldyYXBwZXJQcm9wcyA9IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHtcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgfT4gJlxuICAgIEpTWC5JbnRyaW5zaWNFbGVtZW50c1snZGl2J10gJlxuICAgIFJlYWN0LlJlZkF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4gIGNvbnN0IEljb25XcmFwcGVyOiBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PEljb25XcmFwcGVyUHJvcHM+ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAgICh7Y2xhc3NOYW1lLCBjaGlsZHJlbiwgLi4udG9vbHRpcFByb3BzfTogSWNvbldyYXBwZXJQcm9wcywgcmVmKSA9PiAoXG4gICAgICAgIDxkaXYgcmVmPXtyZWZ9IGNsYXNzTmFtZT17c3R5bGVzLmluZm9JY29uV3JhcHBlcn0gey4uLnRvb2x0aXBQcm9wc30+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICk7XG4gIEljb25XcmFwcGVyLmRpc3BsYXlOYW1lID0gJ2N1c3RvbSBpbmZvIHdyYXBwZXInO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5sZWdlbmRDb250YWluZXJ9PlxuICAgICAgPGgzIGNsYXNzTmFtZT17c3R5bGVzLmxlZ2VuZEhlYWRlcn0+e2ludGwuZm9ybWF0TWVzc2FnZShjb25zdGFudHMuRVhQTE9SRV9UT09MX1BBR0VfVEVYVC5MRUdFTkRfTEFCRUwpfTwvaDM+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnN3YXRjaENvbnRhaW5lcn0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kSXRlbX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jb2xvclN3YXRjaH0gaWQ9e3N0eWxlcy5wcmlvcml0aXplZH0gLz5cbiAgICAgICAgICA8c3Bhbj57aW50bC5mb3JtYXRNZXNzYWdlKGNvbnN0YW50cy5FWFBMT1JFX1RPT0xfUEFHRV9URVhULlBSSU9SSVRZX0xBQkVMKX08L3NwYW4+XG5cbiAgICAgICAgICB7LyogVXNpbmcgQHRydXNzd29ya3MgdG9vbHRpcCAqL31cbiAgICAgICAgICA8VG9vbHRpcDxJY29uV3JhcHBlclByb3BzPlxuICAgICAgICAgICAgbGFiZWw9e2BcbiAgICAgICAgICAgIENvbW11bml0aWVzIHRoYXQgaGF2ZSBjdW11bGF0aXZlIFxuICAgICAgICAgICAgaW5kZXggc2NvcmUgb2YgWHRoIHBlcmNlbnRpbGVcbiAgICAgICAgICAgIGFuZCBhYm92ZVxuICAgICAgICAgICAgICBgfVxuICAgICAgICAgICAgcG9zaXRpb249J2xlZnQnXG4gICAgICAgICAgICBhc0N1c3RvbT17SWNvbldyYXBwZXJ9PlxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9e3N0eWxlcy5pbmZvSWNvbn0gc3JjPXtpbmZvSWNvbn0gLz5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kSXRlbX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jb2xvclN3YXRjaH0gaWQ9e3N0eWxlcy50aHJlc2hvbGR9IC8+XG4gICAgICAgICAgPHNwYW4+e2ludGwuZm9ybWF0TWVzc2FnZShjb25zdGFudHMuRVhQTE9SRV9UT09MX1BBR0VfVEVYVC5USFJFU0hPTERfTEFCRUwpfTwvc3Bhbj5cblxuICAgICAgICAgIHsvKiBVc2luZyBAdHJ1c3N3b3JrcyB0b29sdGlwICovfVxuICAgICAgICAgIDxUb29sdGlwPEljb25XcmFwcGVyUHJvcHM+XG4gICAgICAgICAgICBsYWJlbD17YFxuICAgICAgICAgICAgIENvbW11bml0aWVzIHdpdGggYSBjdW11bGF0aXZlIFxuICAgICAgICAgICAgIGluZGV4IHNjb3JlIGJldHdlZW4gWSAtIFguOTl0aFxuICAgICAgICAgICAgIHBlcmNlbnRpbGVcbiAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgIHBvc2l0aW9uPSdsZWZ0J1xuICAgICAgICAgICAgYXNDdXN0b209e0ljb25XcmFwcGVyfT5cbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPXtzdHlsZXMuaW5mb0ljb259IHNyYz17aW5mb0ljb259IC8+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFwTGVnZW5kO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGV4cGxvcmVQYWdlSGVhZGVyID0gXCJjZWpzdC1tb2R1bGUtLWV4cGxvcmVQYWdlSGVhZGVyLS0yVHdEelwiO1xuZXhwb3J0IHZhciBleHBsb3JlUGFnZVN1YkhlYWRlciA9IFwiY2Vqc3QtbW9kdWxlLS1leHBsb3JlUGFnZVN1YkhlYWRlci0tU0YtMUpcIjtcbmV4cG9ydCB2YXIgZXhwbG9yZVBhZ2VIZWFkZXJUZXh0ID0gXCJjZWpzdC1tb2R1bGUtLWV4cGxvcmVQYWdlSGVhZGVyVGV4dC0tUlNwVUxcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWxlcnRXcmFwcGVyJztcbmltcG9ydCBIb3dZb3VDYW5IZWxwIGZyb20gJy4uL2NvbXBvbmVudHMvSG93WW91Q2FuSGVscCc7XG5pbXBvcnQgSjQwTWFpbkdyaWRDb250YWluZXIgZnJvbSAnLi4vY29tcG9uZW50cy9KNDBNYWluR3JpZENvbnRhaW5lcic7XG5pbXBvcnQgTGF5b3V0IGZyb20gJy4uL2NvbXBvbmVudHMvbGF5b3V0JztcbmltcG9ydCBNYXBXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWFwV3JhcHBlcic7XG5pbXBvcnQgTWFwTGVnZW5kIGZyb20gJy4uL2NvbXBvbmVudHMvTWFwTGVnZW5kJztcblxuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vY2Vqc3QubW9kdWxlLnNjc3MnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cblxuaW50ZXJmYWNlIElNYXBQYWdlUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb247XG59XG5cbmNvbnN0IENFSlNUUGFnZSA9ICh7bG9jYXRpb259OiBJTWFwUGFnZVByb3BzKSA9PiB7XG4gIC8vIFdlIHRlbXBvcmFyaWx5IHJlbW92ZWQgTWFwQ29udHJvbHMsIHdoaWNoIHdvdWxkIGVuYWJsZSB5b3UgdG8gYHNldEZlYXR1cmVzYCBhbHNvLCBmb3Igbm93XG4gIC8vICAgV2Ugd2lsbCBicmluZyBiYWNrIGxhdGVyIHdoZW4gd2UgaGF2ZSBpbnRlcmFjdGl2ZSBjb250cm9scy5cbiAgcmV0dXJuICg8TGF5b3V0IGxvY2F0aW9uPXtsb2NhdGlvbn0+XG4gICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXt0cnVlfSBzaG93TGltaXRlZERhdGFBbGVydD17ZmFsc2V9Lz5cbiAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgPEo0ME1haW5HcmlkQ29udGFpbmVyIGNsYXNzTmFtZT17J2o0MC1tYWluLWNvbnRlbnQnfT5cbiAgICAgIDxHcmlkIHJvdz48R3JpZCBjb2w+XG4gICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgIDxoMSBjbGFzc05hbWU9e3N0eWxlcy5leHBsb3JlUGFnZUhlYWRlcn0+RXhwbG9yZSB0aGUgdG9vbDwvaDE+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5leHBsb3JlUGFnZVN1YkhlYWRlcn0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmV4cGxvcmVQYWdlSGVhZGVyVGV4dH0+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICBab29tIGludG8gdGhlIG1hcCB0byBzZWUgd2hpY2ggY29tbXVuaXRpZXMgdGhlIHRvb2wgaGFzIGN1cnJlbnRseVxuICAgICAgICAgICAgICBpZGVudGlmaWVkIGFzIHByaW9yaXRpemVkICh0aGUgdG9wIDI1JSBvZiBjb21tdW5pdGllcykgb3Igb24gdGhlXG4gICAgICAgICAgICAgIHRocmVzaG9sZC4gTGVhcm4gbW9yZSBhYm91dCB0aGUgZm9ybXVsYSBhbmQgZGF0YXNldHMgdGhhdCB3ZXJlXG4gICAgICAgICAgICAgIHVzZWQgdG8gcHJpb3JpdGl6ZSB0aGVzZSBjb21tdW5pdGllcyBvbiB0aGVcbiAgICAgICAgICAgICAgICB7YCBgfVxuICAgICAgICAgICAgICAgIDxMaW5rIHRvPXsnL21ldGhvZG9sb2d5J30+RGF0YSAmIG1ldGhvZG9sb2d5PC9MaW5rPlxuICAgICAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICAgIHBhZ2UuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPE1hcExlZ2VuZCAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L0dyaWQ+PC9HcmlkPlxuXG4gICAgICA8R3JpZCByb3c+PEdyaWQgY29sPlxuICAgICAgICA8c2VjdGlvbj5cbiAgICAgICAgICA8TWFwV3JhcHBlciBsb2NhdGlvbj17bG9jYXRpb259Lz5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9HcmlkPjwvR3JpZD5cblxuICAgICAgPEdyaWQgcm93PjxHcmlkIGNvbD5cbiAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgPEhvd1lvdUNhbkhlbHAvPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L0dyaWQ+PC9HcmlkPlxuICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gIDwvTGF5b3V0Pik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDRUpTVFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6666\n")}}]); \ No newline at end of file diff --git a/main/component---src-pages-cejst-tsx-5dc23ba646a4748f7e4c.js b/main/component---src-pages-cejst-tsx-5dc23ba646a4748f7e4c.js deleted file mode 100644 index 3977c94e..00000000 --- a/main/component---src-pages-cejst-tsx-5dc23ba646a4748f7e4c.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[281],{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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jaHJvbWEtanMvY2hyb21hLmpzP2JmNDQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBNEQsZ0NBQWdDLENBQXdGO0FBQ3RMLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQSxxSEFBcUgsaUJBQWlCO0FBQ3RJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87OztBQUdQLDhDQUE4QyxpQkFBaUI7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLE9BQU87QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxZQUFZO0FBQ25CO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQSxxQkFBcUIsT0FBTztBQUM1QjtBQUNBOztBQUVBLGlCQUFpQjs7QUFFakI7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUEsbUJBQW1COztBQUVuQjtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUEsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxFQUFFLGFBQWEsRUFBRTtBQUNqRCxpQ0FBaUMsRUFBRSxhQUFhLEVBQUU7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxpQkFBaUI7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FB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OztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkMsc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsT0FBTztBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsV0FBVztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDs7QUFFQSx5QkFBeUIsV0FBVztBQUNwQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0EsU0FBUzs7O0FBR1Q7O0FBRUEseUJBQXlCLFdBQVc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsdUJBQXVCLDhCQUE4QjtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLHNEQUFzRCxxQkFBcUI7QUFDM0U7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekIsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiMzg3My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2hyb21hLmpzIC0gSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBjb2xvciBjb252ZXJzaW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE5LCBHcmVnb3IgQWlzY2hcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIFRoZSBuYW1lIEdyZWdvciBBaXNjaCBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4gKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHUkVHT1IgQUlTQ0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCxcbiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBjaHJvbWEuanMgaW5jbHVkZXMgY29sb3JzIGZyb20gY29sb3JicmV3ZXIyLm9yZywgd2hpY2ggYXJlIHJlbGVhc2VkIHVuZGVyXG4gKiB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDAyIEN5bnRoaWEgQnJld2VyLCBNYXJrIEhhcnJvd2VyLFxuICogYW5kIFRoZSBQZW5uc3lsdmFuaWEgU3RhdGUgVW5pdmVyc2l0eS5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCxcbiAqIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljXG4gKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIE5hbWVkIGNvbG9ycyBhcmUgdGFrZW4gZnJvbSBYMTEgQ29sb3IgTmFtZXMuXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3JcbiAqXG4gKiBAcHJlc2VydmVcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiBnbG9iYWwuY2hyb21hID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGxpbWl0ID0gZnVuY3Rpb24gbGltaXQoeCwgbWluLCBtYXgpIHtcbiAgICBpZiAobWluID09PSB2b2lkIDApIG1pbiA9IDA7XG4gICAgaWYgKG1heCA9PT0gdm9pZCAwKSBtYXggPSAxO1xuICAgIHJldHVybiB4IDwgbWluID8gbWluIDogeCA+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")},5087:function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function (window, document, exportName, undefined) {\n 'use strict';\n\n var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n var TEST_ELEMENT = document.createElement('div');\n var TYPE_FUNCTION = 'function';\n var round = Math.round;\n var abs = Math.abs;\n var now = Date.now;\n /**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\n\n function setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n }\n /**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\n\n\n function invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n\n return false;\n }\n /**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\n\n\n function each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n }\n /**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\n\n\n function deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function () {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '').replace(/^\\s+at\\s+/gm, '').replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n var log = window.console && (window.console.warn || window.console.log);\n\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n\n return method.apply(this, arguments);\n };\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\n\n\n var assign;\n\n if (typeof Object.assign !== 'function') {\n assign = function assign(target) {\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 index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n\n return output;\n };\n } else {\n assign = Object.assign;\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\n\n\n var extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n\n while (i < keys.length) {\n if (!merge || merge && dest[keys[i]] === undefined) {\n dest[keys[i]] = src[keys[i]];\n }\n\n i++;\n }\n\n return dest;\n }, 'extend', 'Use `assign`.');\n /**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\n\n var merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n }, 'merge', 'Use `assign`.');\n /**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\n\n function inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n }\n /**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\n\n\n function bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n }\n /**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\n\n\n function boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n\n return val;\n }\n /**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\n\n\n function ifUndefined(val1, val2) {\n return val1 === undefined ? val2 : val1;\n }\n /**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function addEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.addEventListener(type, handler, false);\n });\n }\n /**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function removeEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.removeEventListener(type, handler, false);\n });\n }\n /**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\n\n\n function hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n\n node = node.parentNode;\n }\n\n return false;\n }\n /**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\n\n\n function inStr(str, find) {\n return str.indexOf(find) > -1;\n }\n /**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\n\n\n function splitStr(str) {\n return str.trim().split(/\\s+/g);\n }\n /**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\n\n\n function inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n\n while (i < src.length) {\n if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {\n return i;\n }\n\n i++;\n }\n\n return -1;\n }\n }\n /**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\n\n\n function toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n }\n /**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\n\n\n function uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n }\n /**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\n\n\n function prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n var i = 0;\n\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = prefix ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n\n i++;\n }\n\n return undefined;\n }\n /**\n * get a unique id\n * @returns {number} uniqueId\n */\n\n\n var _uniqueId = 1;\n\n function uniqueId() {\n return _uniqueId++;\n }\n /**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\n\n\n function getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return doc.defaultView || doc.parentWindow || window;\n }\n\n var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n var SUPPORT_TOUCH = ('ontouchstart' in window);\n var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\n var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n var INPUT_TYPE_TOUCH = 'touch';\n var INPUT_TYPE_PEN = 'pen';\n var INPUT_TYPE_MOUSE = 'mouse';\n var INPUT_TYPE_KINECT = 'kinect';\n var COMPUTE_INTERVAL = 25;\n var INPUT_START = 1;\n var INPUT_MOVE = 2;\n var INPUT_END = 4;\n var INPUT_CANCEL = 8;\n var DIRECTION_NONE = 1;\n var DIRECTION_LEFT = 2;\n var DIRECTION_RIGHT = 4;\n var DIRECTION_UP = 8;\n var DIRECTION_DOWN = 16;\n var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n var PROPS_XY = ['x', 'y'];\n var PROPS_CLIENT_XY = ['clientX', 'clientY'];\n /**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\n\n function Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n\n this.domHandler = function (ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n }\n\n Input.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function handler() {},\n\n /**\n * bind the events\n */\n init: function init() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function destroy() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n };\n /**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\n\n function createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n\n return new Type(manager, inputHandler);\n }\n /**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\n\n\n function inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n } // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n\n\n input.eventType = eventType; // compute scale, rotation etc\n\n computeInputData(manager, input); // emit secret event\n\n manager.emit('hammer.input', input);\n manager.recognize(input);\n manager.session.prevInput = input;\n }\n /**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\n\n\n function computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length; // store the first input to calculate the distance and direction\n\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n } // to compute scale and rotation we need to store the multiple touches\n\n\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n computeIntervalInputData(session, input); // find the correct target\n\n var target = manager.element;\n\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n\n input.target = target;\n }\n\n function computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n }\n /**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\n\n\n function computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity,\n velocityX,\n velocityY,\n direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n }\n /**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\n\n\n function simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n }\n /**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\n\n\n function getCenter(pointers) {\n var pointersLength = pointers.length; // no need to loop when only one touch\n\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0,\n y = 0,\n i = 0;\n\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n }\n /**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\n\n\n function getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n }\n /**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\n\n\n function getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n }\n /**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\n\n\n function getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.sqrt(x * x + y * y);\n }\n /**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\n\n\n function getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n }\n /**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\n\n\n function getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n }\n /**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\n\n\n function getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n }\n\n var MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n };\n var MOUSE_ELEMENT_EVENTS = 'mousedown';\n var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n /**\n * Mouse events input\n * @constructor\n * @extends Input\n */\n\n function MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n }\n\n inherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down\n\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n } // mouse must be down\n\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n });\n var POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n }; // in IE10 the pointer types is defined as an enum\n\n var IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n\n };\n var POINTER_ELEMENT_EVENTS = 'pointerdown';\n var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive\n\n if (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n }\n /**\n * Pointer events input\n * @constructor\n * @extends Input\n */\n\n\n function PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n Input.apply(this, arguments);\n this.store = this.manager.session.pointerEvents = [];\n }\n\n inherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store\n\n var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down\n\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n } // it not found, so the pointer hasn't been down (so it's probably a hover)\n\n\n if (storeIndex < 0) {\n return;\n } // update the event in the store\n\n\n store[storeIndex] = ev;\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n });\n var SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Touch events input\n * @constructor\n * @extends Input\n */\n\n function SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n Input.apply(this, arguments);\n }\n\n inherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events?\n\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state\n\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n }\n\n var TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\n\n function TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n Input.apply(this, arguments);\n }\n\n inherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds; // when there is only one touch, the process can be simplified\n\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target; // get target touches from touches\n\n targetTouches = allTouches.filter(function (touch) {\n return hasParent(touch.target, target);\n }); // collect touches\n\n if (type === INPUT_START) {\n i = 0;\n\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n } // filter changed touches to only contain touches that exist in the collected target ids\n\n\n i = 0;\n\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n } // cleanup removed touches\n\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];\n }\n /**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\n\n var DEDUP_TIMEOUT = 2500;\n var DEDUP_DISTANCE = 25;\n\n function TouchMouseInput() {\n Input.apply(this, arguments);\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n this.primaryTouch = null;\n this.lastTouches = [];\n }\n\n inherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,\n isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n } // when we're in a touch event, record touches to de-dupe synthetic mouse event\n\n\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n });\n\n function recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n }\n\n function setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {\n x: touch.clientX,\n y: touch.clientY\n };\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n\n var removeLastTouch = function removeLastTouch() {\n var i = lts.indexOf(lastTouch);\n\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n }\n\n function isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX,\n y = eventData.srcEvent.clientY;\n\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x),\n dy = Math.abs(y - t.y);\n\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n\n return false;\n }\n\n var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value\n\n var TOUCH_ACTION_COMPUTE = 'compute';\n var TOUCH_ACTION_AUTO = 'auto';\n var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n\n var TOUCH_ACTION_NONE = 'none';\n var TOUCH_ACTION_PAN_X = 'pan-x';\n var TOUCH_ACTION_PAN_Y = 'pan-y';\n var TOUCH_ACTION_MAP = getTouchActionProps();\n /**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\n\n function TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n }\n\n TouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function set(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function update() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function compute() {\n var actions = [];\n each(this.manager.recognizers, function (recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function preventDefaults(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection; // if the touch action did prevented once this session\n\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function preventSrc(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n };\n /**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\n\n function cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n } // pan-x OR pan-y\n\n\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n } // manipulation\n\n\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n }\n\n function getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n }\n /**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\n\n\n var STATE_POSSIBLE = 1;\n var STATE_BEGAN = 2;\n var STATE_CHANGED = 4;\n var STATE_ENDED = 8;\n var STATE_RECOGNIZED = STATE_ENDED;\n var STATE_CANCELLED = 16;\n var STATE_FAILED = 32;\n /**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\n\n function Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n this.id = uniqueId();\n this.manager = null; // default is enable true\n\n this.options.enable = ifUndefined(this.options.enable, true);\n this.state = STATE_POSSIBLE;\n this.simultaneous = {};\n this.requireFail = [];\n }\n\n Recognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function set(options) {\n assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state\n\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function recognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function dropRecognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function requireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function dropRequireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function hasRequireFailures() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function canRecognizeWith(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function emit(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n } // 'panstart' and 'panmove'\n\n\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) {\n // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n } // panend and pancancel\n\n\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function tryEmit(input) {\n if (this.canEmit()) {\n return this.emit(input);\n } // it's failing anyway\n\n\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function canEmit() {\n var i = 0;\n\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n\n i++;\n }\n\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing?\n\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n } // reset when we've reached the end\n\n\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone); // the recognizer has recognized a gesture\n // so trigger an event\n\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function process(inputData) {},\n // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function getTouchAction() {},\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function reset() {}\n };\n /**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\n\n function stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n\n return '';\n }\n /**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\n\n\n function directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n\n return '';\n }\n /**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\n\n\n function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n\n if (manager) {\n return manager.get(otherRecognizer);\n }\n\n return otherRecognizer;\n }\n /**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\n\n\n function AttrRecognizer() {\n Recognizer.apply(this, arguments);\n }\n\n inherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function attrTest(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function process(input) {\n var state = this.state;\n var eventType = input.eventType;\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED\n\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n\n return state | STATE_CHANGED;\n }\n\n return STATE_FAILED;\n }\n });\n /**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n this.pX = null;\n this.pY = null;\n }\n\n inherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n getTouchAction: function getTouchAction() {\n var direction = this.options.direction;\n var actions = [];\n\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n\n return actions;\n },\n directionTest: function directionTest(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY; // lock to axis?\n\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n attrTest: function attrTest(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n },\n emit: function emit(input) {\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n emit: function emit(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\n\n function PressRecognizer() {\n Recognizer.apply(this, arguments);\n this._timer = null;\n this._input = null;\n }\n\n inherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251,\n // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_AUTO];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n this._input = input; // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && input.eventType & INPUT_END) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n });\n /**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n getTouchAction: function getTouchAction() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n attrTest: function attrTest(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n emit: function emit(input) {\n var direction = directionStr(input.offsetDirection);\n\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n });\n /**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\n\n function TapRecognizer() {\n Recognizer.apply(this, arguments); // previous time and center,\n // used for tap counting\n\n this.pTime = false;\n this.pCenter = false;\n this._timer = null;\n this._input = null;\n this.count = 0;\n }\n\n inherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300,\n // max time between the multi-tap taps\n time: 250,\n // max time of the pointer to be down (like finger on the screen)\n threshold: 9,\n // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n this.reset();\n\n if (input.eventType & INPUT_START && this.count === 0) {\n return this.failTimeout();\n } // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input; // if tap count matches we have recognized it,\n // else it has began recognizing...\n\n var tapCount = this.count % options.taps;\n\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n\n return STATE_FAILED;\n },\n failTimeout: function failTimeout() {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n }\n /**\n * @const {string}\n */\n\n\n Hammer.VERSION = '2.0.7';\n /**\n * default settings\n * @namespace\n */\n\n Hammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {\n enable: false\n }], [PinchRecognizer, {\n enable: false\n }, ['rotate']], [SwipeRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }], [PanRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }, ['swipe']], [TapRecognizer], [TapRecognizer, {\n event: 'doubletap',\n taps: 2\n }, ['tap']], [PressRecognizer]],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n };\n var STOP = 1;\n var FORCED_STOP = 2;\n /**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n this.options.inputTarget = this.options.inputTarget || element;\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n toggleCssProps(this, true);\n each(this.options.recognizers, function (item) {\n var recognizer = this.add(new item[0](item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n }\n\n Manager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function set(options) {\n assign(this.options, options); // Options that need a little more setup\n\n if (options.touchAction) {\n this.touchAction.update();\n }\n\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function stop(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n var session = this.session;\n\n if (session.stopped) {\n return;\n } // run the touch-action polyfill\n\n\n this.touchAction.preventDefaults(inputData);\n var recognizer;\n var recognizers = this.recognizers; // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n\n var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized\n // or when we're in a new session\n\n if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n\n while (i < recognizers.length) {\n recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) {\n // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n\n\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function get(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function add(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n } // remove existing\n\n\n var existing = this.get(recognizer.options.event);\n\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function remove(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer); // let's make sure this recognizer exists\n\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function on(events, handler) {\n if (events === undefined) {\n return;\n }\n\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function off(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function emit(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n } // no handlers, so skip it all\n\n\n var handlers = this.handlers[event] && this.handlers[event].slice();\n\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n\n data.preventDefault = function () {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function destroy() {\n this.element && toggleCssProps(this, false);\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n };\n /**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\n\n function toggleCssProps(manager, add) {\n var element = manager.element;\n\n if (!element.style) {\n return;\n }\n\n var prop;\n each(manager.options.cssProps, function (value, name) {\n prop = prefixed(element.style, name);\n\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n\n if (!add) {\n manager.oldCssProps = {};\n }\n }\n /**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\n\n\n function triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n }\n\n assign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n }); // this prevents errors when Hammer is loaded in the presence of an AMD\n // style loader but by script tag, not by the loader.\n\n var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line\n\n freeGlobal.Hammer = Hammer;\n\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return Hammer;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n})(window, document, 'Hammer');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9oYW1tZXJqcy9oYW1tZXIuanM/ZWJmYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMklBQTJJLFVBQVU7QUFDcko7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFVBQVU7QUFDdkIsZUFBZSxPQUFPO0FBQ3RCOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QiwwQkFBMEI7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQixlQUFlLE9BQU87QUFDdEI7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZSxPQUFPO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixhQUFhLFNBQVM7QUFDdEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCLGFBQWEsTUFBTTtBQUNuQixlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxFQUFFO0FBQ2YsYUFBYSxFQUFFO0FBQ2YsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0Qjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsWUFBWTtBQUN6QixjQUFjLFFBQVE7QUFDdEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZSxRQUFRO0FBQ3ZCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsTUFBTTtBQUNyQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsZUFBZTtBQUM3Qjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU0sT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDN0MsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQixlQUFlLE1BQU0sR0FBRyxLQUFLLEVBQUUsS0FBSztBQUNwQzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsaUJBQWlCO0FBQ2hDOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQSxnQ0FBZ0M7O0FBRWhDLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7O0FBRTdDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZSxPQUFPO0FBQ3RCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxNQUFNO0FBQ25CLGNBQWMsT0FBTztBQUNyQjs7O0FBR0E7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsT0FBTztBQUNyQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsY0FBYyxPQUFPO0FBQ3JCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU8sS0FBSztBQUN6QixhQUFhLE9BQU8sS0FBSztBQUN6QixhQUFhLE1BQU07QUFDbkIsY0FBYyxPQUFPO0FBQ3JCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQixjQUFjLE9BQU87QUFDckI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQixhQUFhLE1BQU07QUFDbkIsY0FBYyxPQUFPO0FBQ3JCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkIsYUFBYSxNQUFNO0FBQ25CLGNBQWMsT0FBTztBQUNyQjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FOztBQUVwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7O0FBRXBELGlFQUFpRTs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsZ0VBQWdFOztBQUVoRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBLFlBQVk7QUFDWixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsZ0JBQWdCO0FBQy9COztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBLFlBQVk7QUFDWixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsZ0JBQWdCO0FBQy9COztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsNkJBQTZCO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0VBQWdFOztBQUVoRTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCOztBQUVBO0FBQ0EsNEJBQTRCLDhCQUE4QjtBQUMxRDtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUIsaUJBQWlCLFdBQVc7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQixXQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGlCQUFpQixXQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQixpQkFBaUIsV0FBVztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxhQUFhOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixpQkFBaUIsTUFBTTtBQUN2QjtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQixlQUFlLE9BQU87QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0JBQWtCO0FBQy9CLGFBQWEsV0FBVztBQUN4QixlQUFlO0FBQ2Y7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixpQkFBaUIsRUFBRTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEs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QUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQSxvR0FBb0c7O0FBRXBHOztBQUVBLE1BQU0sSUFBMEM7QUFDaEQsSUFBSSxtQ0FBTztBQUNYO0FBQ0EsS0FBSztBQUFBLGtHQUFDO0FBQ04sR0FBRyxNQUFNLEVBSU47QUFDSCxDQUFDIiwiZmlsZSI6IjUwODcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgSGFtbWVyLkpTIC0gdjIuMC43IC0gMjAxNi0wNC0yMlxuICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyO1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xuICB2YXIgVEVTVF9FTEVNRU5UID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBUWVBFX0ZVTkNUSU9OID0gJ2Z1bmN0aW9uJztcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbiAgdmFyIGFicyA9IE1hdGguYWJzO1xuICB2YXIgbm93ID0gRGF0ZS5ub3c7XG4gIC8qKlxuICAgKiBzZXQgYSB0aW1lb3V0IHdpdGggYSBnaXZlbiBzY29wZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBmdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xuICB9XG4gIC8qKlxuICAgKiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgZm4gb24gZWFjaCBlbnRyeVxuICAgKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAgICogdGhpcyBpcyB1c2VkIGJ5IGFsbCB0aGUgbWV0aG9kcyB0aGF0IGFjY2VwdCBhIHNpbmdsZSBhbmQgYXJyYXkgYXJndW1lbnQuXG4gICAqIEBwYXJhbSB7KnxBcnJheX0gYXJnXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBlYWNoKGFyZywgY29udGV4dFtmbl0sIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiB3YWxrIG9iamVjdHMgYW5kIGFycmF5c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvYmouZm9yRWFjaCkge1xuICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCBvYmoubGVuZ3RoKSB7XG4gICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogd3JhcCBhIG1ldGhvZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgc3RhY2sgdHJhY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgdGhlIHN1cHBsaWVkIG1ldGhvZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJykucmVwbGFjZSgvXlxccythdFxccysvZ20sICcnKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSwgJ3thbm9ueW1vdXN9KClAJykgOiAnVW5rbm93biBTdGFjayBUcmFjZSc7XG4gICAgICB2YXIgbG9nID0gd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLndhcm4gfHwgd2luZG93LmNvbnNvbGUubG9nKTtcblxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBleHRlbmQgb2JqZWN0LlxuICAgKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0c190b19hc3NpZ25cbiAgICogQHJldHVybnMge09iamVjdH0gdGFyZ2V0XG4gICAqL1xuXG5cbiAgdmFyIGFzc2lnbjtcblxuICBpZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0KSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShuZXh0S2V5KSkge1xuICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuICB9XG4gIC8qKlxuICAgKiBleHRlbmQgb2JqZWN0LlxuICAgKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgKi9cblxuXG4gIHZhciBleHRlbmQgPSBkZXByZWNhdGUoZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNyYyk7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKCFtZXJnZSB8fCBtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVzdFtrZXlzW2ldXSA9IHNyY1trZXlzW2ldXTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcbiAgLyoqXG4gICAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gICAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyB0aGF0IGV4aXN0IGluIGRlc3Qgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgc3JjXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgKi9cblxuICB2YXIgbWVyZ2UgPSBkZXByZWNhdGUoZnVuY3Rpb24gbWVyZ2UoZGVzdCwgc3JjKSB7XG4gICAgcmV0dXJuIGV4dGVuZChkZXN0LCBzcmMsIHRydWUpO1xuICB9LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuICAvKipcbiAgICogc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNoaWxkXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXVxuICAgKi9cblxuICBmdW5jdGlvbiBpbmhlcml0KGNoaWxkLCBiYXNlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGJhc2VQID0gYmFzZS5wcm90b3R5cGUsXG4gICAgICAgIGNoaWxkUDtcbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgYXNzaWduKGNoaWxkUCwgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBzaW1wbGUgZnVuY3Rpb24gYmluZFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gYmluZEZuKGZuLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5kRm4oKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICAgKiB0aGlzIGZpcnN0IGl0ZW0gaW4gYXJncyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufEZ1bmN0aW9ufSB2YWxcbiAgICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGJvb2xPckZuKHZhbCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgdmFsID09IFRZUEVfRlVOQ1RJT04pIHtcbiAgICAgIHJldHVybiB2YWwuYXBwbHkoYXJncyA/IGFyZ3NbMF0gfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIC8qKlxuICAgKiB1c2UgdGhlIHZhbDIgd2hlbiB2YWwxIGlzIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0geyp9IHZhbDFcbiAgICogQHBhcmFtIHsqfSB2YWwyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlmVW5kZWZpbmVkKHZhbDEsIHZhbDIpIHtcbiAgICByZXR1cm4gdmFsMSA9PT0gdW5kZWZpbmVkID8gdmFsMiA6IHZhbDE7XG4gIH1cbiAgLyoqXG4gICAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBub2RlIGlzIGluIHRoZSBnaXZlbiBwYXJlbnRcbiAgICogQG1ldGhvZCBoYXNQYXJlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG5cblxuICBmdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGluU3RyKHN0ciwgZmluZCkge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xuICB9XG4gIC8qKlxuICAgKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gd29yZHNcbiAgICovXG5cblxuICBmdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbiAgfVxuICAvKipcbiAgICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5RmlsbFxuICAgKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtmaW5kQnlLZXldXG4gICAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICAgIGlmIChzcmMuaW5kZXhPZiAmJiAhZmluZEJ5S2V5KSB7XG4gICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCBzcmMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCB8fCAhZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBjb252ZXJ0IGFycmF5LWxpa2Ugb2JqZWN0cyB0byByZWFsIGFycmF5c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG5cblxuICBmdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xuICB9XG4gIC8qKlxuICAgKiB1bmlxdWUgYXJyYXkgd2l0aCBvYmplY3RzIGJhc2VkIG9uIGEga2V5IChsaWtlICdpZCcpIG9yIGp1c3QgYnkgdGhlIGFycmF5J3MgdmFsdWVcbiAgICogQHBhcmFtIHtBcnJheX0gc3JjIFt7aWQ6MX0se2lkOjJ9LHtpZDoxfV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NvcnQ9RmFsc2VdXG4gICAqIEByZXR1cm5zIHtBcnJheX0gW3tpZDoxfSx7aWQ6Mn1dXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgIHZhciB2YWwgPSBrZXkgPyBzcmNbaV1ba2V5XSA6IHNyY1tpXTtcblxuICAgICAgaWYgKGluQXJyYXkodmFsdWVzLCB2YWwpIDwgMCkge1xuICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWVzW2ldID0gdmFsO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KGZ1bmN0aW9uIHNvcnRVbmlxdWVBcnJheShhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGFba2V5XSA+IGJba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcHJlZml4ZWQob2JqLCBwcm9wZXJ0eSkge1xuICAgIHZhciBwcmVmaXgsIHByb3A7XG4gICAgdmFyIGNhbWVsUHJvcCA9IHByb3BlcnR5WzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgIHByb3AgPSBwcmVmaXggPyBwcmVmaXggKyBjYW1lbFByb3AgOiBwcm9wZXJ0eTtcblxuICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogZ2V0IGEgdW5pcXVlIGlkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHVuaXF1ZUlkXG4gICAqL1xuXG5cbiAgdmFyIF91bmlxdWVJZCA9IDE7XG5cbiAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIF91bmlxdWVJZCsrO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtEb2N1bWVudFZpZXd8V2luZG93fVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3cgfHwgd2luZG93O1xuICB9XG5cbiAgdmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcbiAgdmFyIFNVUFBPUlRfVE9VQ0ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcbiAgdmFyIFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMgPSBwcmVmaXhlZCh3aW5kb3csICdQb2ludGVyRXZlbnQnKSAhPT0gdW5kZWZpbmVkO1xuICB2YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgdmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xuICB2YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbiAgdmFyIElOUFVUX1RZUEVfTU9VU0UgPSAnbW91c2UnO1xuICB2YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcbiAgdmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcbiAgdmFyIElOUFVUX1NUQVJUID0gMTtcbiAgdmFyIElOUFVUX01PVkUgPSAyO1xuICB2YXIgSU5QVVRfRU5EID0gNDtcbiAgdmFyIElOUFVUX0NBTkNFTCA9IDg7XG4gIHZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG4gIHZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG4gIHZhciBESVJFQ1RJT05fUklHSFQgPSA0O1xuICB2YXIgRElSRUNUSU9OX1VQID0gODtcbiAgdmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG4gIHZhciBESVJFQ1RJT05fSE9SSVpPTlRBTCA9IERJUkVDVElPTl9MRUZUIHwgRElSRUNUSU9OX1JJR0hUO1xuICB2YXIgRElSRUNUSU9OX1ZFUlRJQ0FMID0gRElSRUNUSU9OX1VQIHwgRElSRUNUSU9OX0RPV047XG4gIHZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG4gIHZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG4gIHZhciBQUk9QU19DTElFTlRfWFkgPSBbJ2NsaWVudFgnLCAnY2xpZW50WSddO1xuICAvKipcbiAgICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtJbnB1dH1cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDsgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuXG4gICAgdGhpcy5kb21IYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIElucHV0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSBpbnB1dEV2ZW50IGRhdGEgYW5kIHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgdGhpcy5ldlRhcmdldCAmJiBhZGRFdmVudExpc3RlbmVycyh0aGlzLnRhcmdldCwgdGhpcy5ldlRhcmdldCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgIHRoaXMuZXZXaW4gJiYgYWRkRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgdGhpcy5ldldpbiAmJiByZW1vdmVFdmVudExpc3RlbmVycyhnZXRXaW5kb3dGb3JFbGVtZW50KHRoaXMuZWxlbWVudCksIHRoaXMuZXZXaW4sIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAgICogY2FsbGVkIGJ5IHRoZSBNYW5hZ2VyIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gICAqIEByZXR1cm5zIHtJbnB1dH1cbiAgICovXG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gICAgdmFyIFR5cGU7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRDbGFzcztcblxuICAgIGlmIChpbnB1dENsYXNzKSB7XG4gICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgIFR5cGUgPSBQb2ludGVyRXZlbnRJbnB1dDtcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfT05MWV9UT1VDSCkge1xuICAgICAgVHlwZSA9IFRvdWNoSW5wdXQ7XG4gICAgfSBlbHNlIGlmICghU1VQUE9SVF9UT1VDSCkge1xuICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFR5cGUgPSBUb3VjaE1vdXNlSW5wdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUeXBlKG1hbmFnZXIsIGlucHV0SGFuZGxlcik7XG4gIH1cbiAgLyoqXG4gICAqIGhhbmRsZSBpbnB1dCBldmVudHNcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5wdXRIYW5kbGVyKG1hbmFnZXIsIGV2ZW50VHlwZSwgaW5wdXQpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW4gPSBpbnB1dC5wb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGNoYW5nZWRQb2ludGVyc0xlbiA9IGlucHV0LmNoYW5nZWRQb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGlzRmlyc3QgPSBldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMDtcbiAgICB2YXIgaXNGaW5hbCA9IGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHBvaW50ZXJzTGVuIC0gY2hhbmdlZFBvaW50ZXJzTGVuID09PSAwO1xuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICBtYW5hZ2VyLnNlc3Npb24gPSB7fTtcbiAgICB9IC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG5cblxuICAgIGlucHV0LmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG5cbiAgICBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KTsgLy8gZW1pdCBzZWNyZXQgZXZlbnRcblxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuICAgIG1hbmFnZXIucmVjb2duaXplKGlucHV0KTtcbiAgICBtYW5hZ2VyLnNlc3Npb24ucHJldklucHV0ID0gaW5wdXQ7XG4gIH1cbiAgLyoqXG4gICAqIGV4dGVuZCB0aGUgZGF0YSB3aXRoIHNvbWUgdXNhYmxlIHByb3BlcnRpZXMgbGlrZSBzY2FsZSwgcm90YXRlLCB2ZWxvY2l0eSBldGNcbiAgICogQHBhcmFtIHtPYmplY3R9IG1hbmFnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCkge1xuICAgIHZhciBzZXNzaW9uID0gbWFuYWdlci5zZXNzaW9uO1xuICAgIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDsgLy8gc3RvcmUgdGhlIGZpcnN0IGlucHV0IHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYW5kIGRpcmVjdGlvblxuXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgIHNlc3Npb24uZmlyc3RJbnB1dCA9IHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KTtcbiAgICB9IC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcblxuXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID4gMSAmJiAhc2Vzc2lvbi5maXJzdE11bHRpcGxlKSB7XG4gICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXIgPSBnZXRDZW50ZXIocG9pbnRlcnMpO1xuICAgIGlucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgIGlucHV0LmRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGZpcnN0SW5wdXQudGltZVN0YW1wO1xuICAgIGlucHV0LmFuZ2xlID0gZ2V0QW5nbGUob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGlucHV0LmRpc3RhbmNlID0gZ2V0RGlzdGFuY2Uob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIHZhciBvdmVyYWxsVmVsb2NpdHkgPSBnZXRWZWxvY2l0eShpbnB1dC5kZWx0YVRpbWUsIGlucHV0LmRlbHRhWCwgaW5wdXQuZGVsdGFZKTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYID0gb3ZlcmFsbFZlbG9jaXR5Lng7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WSA9IG92ZXJhbGxWZWxvY2l0eS55O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eSA9IGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpID8gb3ZlcmFsbFZlbG9jaXR5LnggOiBvdmVyYWxsVmVsb2NpdHkueTtcbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG4gICAgaW5wdXQubWF4UG9pbnRlcnMgPSAhc2Vzc2lvbi5wcmV2SW5wdXQgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiBpbnB1dC5wb2ludGVycy5sZW5ndGggPiBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycyA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6IHNlc3Npb24ucHJldklucHV0Lm1heFBvaW50ZXJzO1xuICAgIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCk7IC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG5cbiAgICB2YXIgdGFyZ2V0ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gICAgaWYgKGhhc1BhcmVudChpbnB1dC5zcmNFdmVudC50YXJnZXQsIHRhcmdldCkpIHtcbiAgICAgIHRhcmdldCA9IGlucHV0LnNyY0V2ZW50LnRhcmdldDtcbiAgICB9XG5cbiAgICBpbnB1dC50YXJnZXQgPSB0YXJnZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG4gICAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2SW5wdXQgPSBzZXNzaW9uLnByZXZJbnB1dCB8fCB7fTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgIHg6IHByZXZJbnB1dC5kZWx0YVggfHwgMCxcbiAgICAgICAgeTogcHJldklucHV0LmRlbHRhWSB8fCAwXG4gICAgICB9O1xuICAgICAgb2Zmc2V0ID0gc2Vzc2lvbi5vZmZzZXREZWx0YSA9IHtcbiAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgIHk6IGNlbnRlci55XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xuICB9XG4gIC8qKlxuICAgKiB2ZWxvY2l0eSBpcyBjYWxjdWxhdGVkIGV2ZXJ5IHggbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KSB7XG4gICAgdmFyIGxhc3QgPSBzZXNzaW9uLmxhc3RJbnRlcnZhbCB8fCBpbnB1dCxcbiAgICAgICAgZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gbGFzdC50aW1lU3RhbXAsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICB2ZWxvY2l0eVgsXG4gICAgICAgIHZlbG9jaXR5WSxcbiAgICAgICAgZGlyZWN0aW9uO1xuXG4gICAgaWYgKGlucHV0LmV2ZW50VHlwZSAhPSBJTlBVVF9DQU5DRUwgJiYgKGRlbHRhVGltZSA+IENPTVBVVEVfSU5URVJWQUwgfHwgbGFzdC52ZWxvY2l0eSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgdmFyIGRlbHRhWCA9IGlucHV0LmRlbHRhWCAtIGxhc3QuZGVsdGFYO1xuICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuICAgICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgIHZlbG9jaXR5WSA9IHYueTtcbiAgICAgIHZlbG9jaXR5ID0gYWJzKHYueCkgPiBhYnModi55KSA/IHYueCA6IHYueTtcbiAgICAgIGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1c2UgbGF0ZXN0IHZlbG9jaXR5IGluZm8gaWYgaXQgZG9lc24ndCBvdmVydGFrZSBhIG1pbmltdW0gcGVyaW9kXG4gICAgICB2ZWxvY2l0eSA9IGxhc3QudmVsb2NpdHk7XG4gICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgIHZlbG9jaXR5WSA9IGxhc3QudmVsb2NpdHlZO1xuICAgICAgZGlyZWN0aW9uID0gbGFzdC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaW5wdXQudmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICBpbnB1dC52ZWxvY2l0eVggPSB2ZWxvY2l0eVg7XG4gICAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgfVxuICAvKipcbiAgICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICogQHJldHVybnMge09iamVjdH0gY2xvbmVkSW5wdXREYXRhXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgICBjbGllbnRZOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRZKVxuICAgICAgfTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVN0YW1wOiBub3coKSxcbiAgICAgIHBvaW50ZXJzOiBwb2ludGVycyxcbiAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgIGRlbHRhWDogaW5wdXQuZGVsdGFYLFxuICAgICAgZGVsdGFZOiBpbnB1dC5kZWx0YVlcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBvaW50ZXJzXG4gICAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGB4YCBhbmQgYHlgIHByb3BlcnRpZXNcbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7IC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG5cbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFgpLFxuICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgIHggKz0gcG9pbnRlcnNbaV0uY2xpZW50WDtcbiAgICAgIHkgKz0gcG9pbnRlcnNbaV0uY2xpZW50WTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogcm91bmQoeCAvIHBvaW50ZXJzTGVuZ3RoKSxcbiAgICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybiB7TnVtYmVyfSBkaXJlY3Rpb25cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICByZXR1cm4gRElSRUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgaWYgKGFicyh4KSA+PSBhYnMoeSkpIHtcbiAgICAgIHJldHVybiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cblxuICAgIHJldHVybiB5IDwgMCA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICB9XG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gcDEge3gsIHl9XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuXG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG4gICAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gcDFcbiAgICogQHBhcmFtIHtPYmplY3R9IHAyXG4gICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldEFuZ2xlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cblxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXRBbmdsZShlbmRbMV0sIGVuZFswXSwgUFJPUFNfQ0xJRU5UX1hZKSArIGdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAgICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0U2NhbGUoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShlbmRbMF0sIGVuZFsxXSwgUFJPUFNfQ0xJRU5UX1hZKSAvIGdldERpc3RhbmNlKHN0YXJ0WzBdLCBzdGFydFsxXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbiAgfVxuXG4gIHZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gICAgbW91c2Vkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gICAgbW91c2V1cDogSU5QVVRfRU5EXG4gIH07XG4gIHZhciBNT1VTRV9FTEVNRU5UX0VWRU5UUyA9ICdtb3VzZWRvd24nO1xuICB2YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG4gIC8qKlxuICAgKiBNb3VzZSBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG4gICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7IC8vIG1vdXNlZG93biBzdGF0ZVxuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGluaGVyaXQoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTUVoYW5kbGVyKGV2KSB7XG4gICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBvbiBzdGFydCB3ZSB3YW50IHRvIGhhdmUgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGRvd25cblxuICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIGV2LmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCAhPT0gMSkge1xuICAgICAgICBldmVudFR5cGUgPSBJTlBVVF9FTkQ7XG4gICAgICB9IC8vIG1vdXNlIG11c3QgYmUgZG93blxuXG5cbiAgICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIGV2ZW50VHlwZSwge1xuICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB2YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbiAgfTsgLy8gaW4gSUUxMCB0aGUgcG9pbnRlciB0eXBlcyBpcyBkZWZpbmVkIGFzIGFuIGVudW1cblxuICB2YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG5cbiAgfTtcbiAgdmFyIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAncG9pbnRlcmRvd24nO1xuICB2YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJzsgLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5cbiAgaWYgKHdpbmRvdy5NU1BvaW50ZXJFdmVudCAmJiAhd2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAnTVNQb2ludGVyRG93bic7XG4gICAgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ01TUG9pbnRlck1vdmUgTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsJztcbiAgfVxuICAvKipcbiAgICogUG9pbnRlciBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gUE9JTlRFUl9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5zdG9yZSA9IHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXTtcbiAgfVxuXG4gIGluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICAgIHZhciByZW1vdmVQb2ludGVyID0gZmFsc2U7XG4gICAgICB2YXIgZXZlbnRUeXBlTm9ybWFsaXplZCA9IGV2LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdtcycsICcnKTtcbiAgICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuICAgICAgdmFyIGlzVG91Y2ggPSBwb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIOyAvLyBnZXQgaW5kZXggb2YgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG4gICAgICB2YXIgc3RvcmVJbmRleCA9IGluQXJyYXkoc3RvcmUsIGV2LnBvaW50ZXJJZCwgJ3BvaW50ZXJJZCcpOyAvLyBzdGFydCBhbmQgbW91c2UgbXVzdCBiZSBkb3duXG5cbiAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAoZXYuYnV0dG9uID09PSAwIHx8IGlzVG91Y2gpKSB7XG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgIHN0b3JlLnB1c2goZXYpO1xuICAgICAgICAgIHN0b3JlSW5kZXggPSBzdG9yZS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgfSAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcblxuXG4gICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG5cbiAgICAgIHN0b3JlW3N0b3JlSW5kZXhdID0gZXY7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZW1vdmVQb2ludGVyKSB7XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICBzdG9yZS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIFNJTkdMRV9UT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxuICB9O1xuICB2YXIgU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCc7XG4gIHZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4gIC8qKlxuICAgKiBUb3VjaCBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChTaW5nbGVUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRFaGFuZGxlcihldikge1xuICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBzaG91bGQgd2UgaGFuZGxlIHRoZSB0b3VjaCBldmVudHM/XG5cbiAgICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTsgLy8gd2hlbiBkb25lLCByZXNldCB0aGUgc3RhcnRlZCBzdGF0ZVxuXG4gICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHRvdWNoZXNbMF0ubGVuZ3RoIC0gdG91Y2hlc1sxXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAgICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAgICovXG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBhbGwgPSB1bmlxdWVBcnJheShhbGwuY29uY2F0KGNoYW5nZWQpLCAnaWRlbnRpZmllcicsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBbYWxsLCBjaGFuZ2VkXTtcbiAgfVxuXG4gIHZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxuICB9O1xuICB2YXIgVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4gIC8qKlxuICAgKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgSW5wdXRcbiAgICovXG5cbiAgZnVuY3Rpb24gVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gVE9VQ0hfVEFSR0VUX0VWRU5UUztcbiAgICB0aGlzLnRhcmdldElkcyA9IHt9O1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBpbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgdmFyIHR5cGUgPSBUT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG4gICAgICB2YXIgdG91Y2hlcyA9IGdldFRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG5cbiAgICAgIGlmICghdG91Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAgICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAgICovXG5cbiAgZnVuY3Rpb24gZ2V0VG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGxUb3VjaGVzID0gdG9BcnJheShldi50b3VjaGVzKTtcbiAgICB2YXIgdGFyZ2V0SWRzID0gdGhpcy50YXJnZXRJZHM7IC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICByZXR1cm4gW2FsbFRvdWNoZXMsIGFsbFRvdWNoZXNdO1xuICAgIH1cblxuICAgIHZhciBpLFxuICAgICAgICB0YXJnZXRUb3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlcyA9IHRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpLFxuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyA9IFtdLFxuICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldDsgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuXG4gICAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uICh0b3VjaCkge1xuICAgICAgcmV0dXJuIGhhc1BhcmVudCh0b3VjaC50YXJnZXQsIHRhcmdldCk7XG4gICAgfSk7IC8vIGNvbGxlY3QgdG91Y2hlc1xuXG4gICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IC8vIGZpbHRlciBjaGFuZ2VkIHRvdWNoZXMgdG8gb25seSBjb250YWluIHRvdWNoZXMgdGhhdCBleGlzdCBpbiB0aGUgY29sbGVjdGVkIHRhcmdldCBpZHNcblxuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGNoYW5nZWRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5wdXNoKGNoYW5nZWRUb3VjaGVzW2ldKTtcbiAgICAgIH0gLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcblxuXG4gICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGRlbGV0ZSB0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWRUYXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbLy8gbWVyZ2UgdGFyZ2V0VG91Y2hlcyB3aXRoIGNoYW5nZWRUYXJnZXRUb3VjaGVzIHNvIGl0IGNvbnRhaW5zIEFMTCB0b3VjaGVzLCBpbmNsdWRpbmcgJ2VuZCcgYW5kICdjYW5jZWwnXG4gICAgdW5pcXVlQXJyYXkodGFyZ2V0VG91Y2hlcy5jb25jYXQoY2hhbmdlZFRhcmdldFRvdWNoZXMpLCAnaWRlbnRpZmllcicsIHRydWUpLCBjaGFuZ2VkVGFyZ2V0VG91Y2hlc107XG4gIH1cbiAgLyoqXG4gICAqIENvbWJpbmVkIHRvdWNoIGFuZCBtb3VzZSBpbnB1dFxuICAgKlxuICAgKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAgICogVGhpcyBiZWNhdXNlIHRvdWNoIGRldmljZXMgYWxzbyBlbWl0IG1vdXNlIGV2ZW50cyB3aGlsZSBkb2luZyBhIHRvdWNoLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgSW5wdXRcbiAgICovXG5cblxuICB2YXIgREVEVVBfVElNRU9VVCA9IDI1MDA7XG4gIHZhciBERURVUF9ESVNUQU5DRSA9IDI1O1xuXG4gIGZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBoYW5kbGVyID0gYmluZEZuKHRoaXMuaGFuZGxlciwgdGhpcyk7XG4gICAgdGhpcy50b3VjaCA9IG5ldyBUb3VjaElucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5tb3VzZSA9IG5ldyBNb3VzZUlucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgIHRoaXMubGFzdFRvdWNoZXMgPSBbXTtcbiAgfVxuXG4gIGluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgdmFyIGlzVG91Y2ggPSBpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICBpc01vdXNlID0gaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfTU9VU0U7XG5cbiAgICAgIGlmIChpc01vdXNlICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcblxuXG4gICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICByZWNvcmRUb3VjaGVzLmNhbGwodGhpcywgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgaW5wdXREYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy50b3VjaC5kZXN0cm95KCk7XG4gICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgIHRoaXMucHJpbWFyeVRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyO1xuICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldExhc3RUb3VjaChldmVudERhdGEpIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdO1xuXG4gICAgaWYgKHRvdWNoLmlkZW50aWZpZXIgPT09IHRoaXMucHJpbWFyeVRvdWNoKSB7XG4gICAgICB2YXIgbGFzdFRvdWNoID0ge1xuICAgICAgICB4OiB0b3VjaC5jbGllbnRYLFxuICAgICAgICB5OiB0b3VjaC5jbGllbnRZXG4gICAgICB9O1xuICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICB2YXIgbHRzID0gdGhpcy5sYXN0VG91Y2hlcztcblxuICAgICAgdmFyIHJlbW92ZUxhc3RUb3VjaCA9IGZ1bmN0aW9uIHJlbW92ZUxhc3RUb3VjaCgpIHtcbiAgICAgICAgdmFyIGkgPSBsdHMuaW5kZXhPZihsYXN0VG91Y2gpO1xuXG4gICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLFxuICAgICAgICB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgIHZhciBkeCA9IE1hdGguYWJzKHggLSB0LngpLFxuICAgICAgICAgIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG5cbiAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbiAgdmFyIE5BVElWRV9UT1VDSF9BQ1RJT04gPSBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gIT09IHVuZGVmaW5lZDsgLy8gbWFnaWNhbCB0b3VjaEFjdGlvbiB2YWx1ZVxuXG4gIHZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbiAgdmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xuICB2YXIgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTiA9ICdtYW5pcHVsYXRpb24nOyAvLyBub3QgaW1wbGVtZW50ZWRcblxuICB2YXIgVE9VQ0hfQUNUSU9OX05PTkUgPSAnbm9uZSc7XG4gIHZhciBUT1VDSF9BQ1RJT05fUEFOX1ggPSAncGFuLXgnO1xuICB2YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbiAgdmFyIFRPVUNIX0FDVElPTl9NQVAgPSBnZXRUb3VjaEFjdGlvblByb3BzKCk7XG4gIC8qKlxuICAgKiBUb3VjaCBBY3Rpb25cbiAgICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG5cbiAgZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIFRvdWNoQWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlIG9uIHRoZSBlbGVtZW50IG9yIGVuYWJsZSB0aGUgcG9seWZpbGxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGlmICh2YWx1ZSA9PSBUT1VDSF9BQ1RJT05fQ09NUFVURSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtQUkVGSVhFRF9UT1VDSF9BQ1RJT05dID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBqdXN0IHJlLXNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY29tcHV0ZSB0aGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcmVjb2duaXplcidzIHNldHRpbmdzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBjb21wdXRlOiBmdW5jdGlvbiBjb21wdXRlKCkge1xuICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgIGVhY2godGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLCBmdW5jdGlvbiAocmVjb2duaXplcikge1xuICAgICAgICBpZiAoYm9vbE9yRm4ocmVjb2duaXplci5vcHRpb25zLmVuYWJsZSwgW3JlY29nbml6ZXJdKSkge1xuICAgICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24gcHJldmVudERlZmF1bHRzKGlucHV0KSB7XG4gICAgICB2YXIgc3JjRXZlbnQgPSBpbnB1dC5zcmNFdmVudDtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247IC8vIGlmIHRoZSB0b3VjaCBhY3Rpb24gZGlkIHByZXZlbnRlZCBvbmNlIHRoaXMgc2Vzc2lvblxuXG4gICAgICBpZiAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKSB7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7XG4gICAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1hdO1xuXG4gICAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgICAvL2RvIG5vdCBwcmV2ZW50IGRlZmF1bHRzIGlmIHRoaXMgaXMgYSB0YXAgZ2VzdHVyZVxuICAgICAgICB2YXIgaXNUYXBQb2ludGVyID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSAxO1xuICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgdmFyIGlzVGFwVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgMjUwO1xuXG4gICAgICAgIGlmIChpc1RhcFBvaW50ZXIgJiYgaXNUYXBNb3ZlbWVudCAmJiBpc1RhcFRvdWNoVGltZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgIC8vIGBwYW4teCBwYW4teWAgbWVhbnMgYnJvd3NlciBoYW5kbGVzIGFsbCBzY3JvbGxpbmcvcGFubmluZywgZG8gbm90IHByZXZlbnRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzTm9uZSB8fCBoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMIHx8IGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZlbnRTcmMoc3JjRXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yIChzY3JvbGxpbmcgaW4gbW9zdCBjYXNlcylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICAgKi9cbiAgICBwcmV2ZW50U3JjOiBmdW5jdGlvbiBwcmV2ZW50U3JjKHNyY0V2ZW50KSB7XG4gICAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiB3aGVuIHRoZSB0b3VjaEFjdGlvbnMgYXJlIGNvbGxlY3RlZCB0aGV5IGFyZSBub3QgYSB2YWxpZCB2YWx1ZSwgc28gd2UgbmVlZCB0byBjbGVhbiB0aGluZ3MgdXAuICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICAvLyBub25lXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7IC8vIGlmIGJvdGggcGFuLXggYW5kIHBhbi15IGFyZSBzZXQgKGRpZmZlcmVudCByZWNvZ25pemVyc1xuICAgIC8vIGZvciBkaWZmZXJlbnQgZGlyZWN0aW9ucywgZS5nLiBob3Jpem9udGFsIHBhbiBidXQgdmVydGljYWwgc3dpcGU/KVxuICAgIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAgIC8vIHJlY29nbml6ZXJzIHdpbGwgd29yaywgc2luY2UgdGhlIGJyb3dzZXIgd291bGQgaGFuZGxlIGFsbCBwYW5uaW5nXG5cbiAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfSAvLyBwYW4teCBPUiBwYW4teVxuXG5cbiAgICBpZiAoaGFzUGFuWCB8fCBoYXNQYW5ZKSB7XG4gICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9IC8vIG1hbmlwdWxhdGlvblxuXG5cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OO1xuICAgIH1cblxuICAgIHJldHVybiBUT1VDSF9BQ1RJT05fQVVUTztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uUHJvcHMoKSB7XG4gICAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHRvdWNoTWFwID0ge307XG4gICAgdmFyIGNzc1N1cHBvcnRzID0gd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLnN1cHBvcnRzO1xuICAgIFsnYXV0bycsICdtYW5pcHVsYXRpb24nLCAncGFuLXknLCAncGFuLXgnLCAncGFuLXggcGFuLXknLCAnbm9uZSddLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICB0b3VjaE1hcFt2YWxdID0gY3NzU3VwcG9ydHMgPyB3aW5kb3cuQ1NTLnN1cHBvcnRzKCd0b3VjaC1hY3Rpb24nLCB2YWwpIDogdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hNYXA7XG4gIH1cbiAgLyoqXG4gICAqIFJlY29nbml6ZXIgZmxvdyBleHBsYWluZWQ7ICpcbiAgICogQWxsIHJlY29nbml6ZXJzIGhhdmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgUE9TU0lCTEUgd2hlbiBhIGlucHV0IHNlc3Npb24gc3RhcnRzLlxuICAgKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAgICogRXhhbXBsZSBzZXNzaW9uIGZvciBtb3VzZS1pbnB1dDogbW91c2Vkb3duIC0+IG1vdXNlbW92ZSAtPiBtb3VzZXVwXG4gICAqXG4gICAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAgICogd2hpY2ggZGV0ZXJtaW5lcyB3aXRoIHN0YXRlIGl0IHNob3VsZCBiZS5cbiAgICpcbiAgICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICAgKiBQT1NTSUJMRSB0byBnaXZlIGl0IGFub3RoZXIgY2hhbmdlIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICAgKlxuICAgKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gICAqICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogICAgICArLS0tLS0rLS0tLS0rICAgICAgICAgICAgICAgfFxuICAgKiAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICB8XG4gICAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLStcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHxcbiAgICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRlZC9SZWNvZ25pemVkXG4gICAqL1xuXG5cbiAgdmFyIFNUQVRFX1BPU1NJQkxFID0gMTtcbiAgdmFyIFNUQVRFX0JFR0FOID0gMjtcbiAgdmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xuICB2YXIgU1RBVEVfRU5ERUQgPSA4O1xuICB2YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xuICB2YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG4gIHZhciBTVEFURV9GQUlMRUQgPSAzMjtcbiAgLyoqXG4gICAqIFJlY29nbml6ZXJcbiAgICogRXZlcnkgcmVjb2duaXplciBuZWVkcyB0byBleHRlbmQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cbiAgZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsOyAvLyBkZWZhdWx0IGlzIGVuYWJsZSB0cnVlXG5cbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgIHRoaXMuc2ltdWx0YW5lb3VzID0ge307XG4gICAgdGhpcy5yZXF1aXJlRmFpbCA9IFtdO1xuICB9XG5cbiAgUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KG9wdGlvbnMpIHtcbiAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOyAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuXG4gICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlY29nbml6ZSBzaW11bHRhbmVvdXMgd2l0aCBhbiBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICByZWNvZ25pemVXaXRoOiBmdW5jdGlvbiByZWNvZ25pemVXaXRoKG90aGVyUmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIHNpbXVsdGFuZW91cyA9IHRoaXMuc2ltdWx0YW5lb3VzO1xuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgIHNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdID0gb3RoZXJSZWNvZ25pemVyO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIucmVjb2duaXplV2l0aCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHNpbXVsdGFuZW91cyBsaW5rLiBpdCBkb2VzbnQgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVjb2duaXplV2l0aDogZnVuY3Rpb24gZHJvcFJlY29nbml6ZVdpdGgob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbiByZXF1aXJlRmFpbHVyZShvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSByZXF1aXJlRmFpbHVyZSBsaW5rLiBpdCBkb2VzIG5vdCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24gZHJvcFJlcXVpcmVGYWlsdXJlKG90aGVyUmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uIGhhc1JlcXVpcmVGYWlsdXJlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlmIHRoZSByZWNvZ25pemVyIGNhbiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVjb2duaXplV2l0aDogZnVuY3Rpb24gY2FuUmVjb2duaXplV2l0aChvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFlvdSBzaG91bGQgdXNlIGB0cnlFbWl0YCBpbnN0ZWFkIG9mIGBlbWl0YCBkaXJlY3RseSB0byBjaGVja1xuICAgICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgfSAvLyAncGFuc3RhcnQnIGFuZCAncGFubW92ZSdcblxuXG4gICAgICBpZiAoc3RhdGUgPCBTVEFURV9FTkRFRCkge1xuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7XG4gICAgICAgIC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgICB9IC8vIHBhbmVuZCBhbmQgcGFuY2FuY2VsXG5cblxuICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24gdHJ5RW1pdChpbnB1dCkge1xuICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgICAgfSAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG5cblxuICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FuIHdlIGVtaXQ/XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuRW1pdDogZnVuY3Rpb24gY2FuRW1pdCgpIHtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCkge1xuICAgICAgICBpZiAoISh0aGlzLnJlcXVpcmVGYWlsW2ldLnN0YXRlICYgKFNUQVRFX0ZBSUxFRCB8IFNUQVRFX1BPU1NJQkxFKSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbiByZWNvZ25pemUoaW5wdXREYXRhKSB7XG4gICAgICAvLyBtYWtlIGEgbmV3IGNvcHkgb2YgdGhlIGlucHV0RGF0YVxuICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgaW5wdXREYXRhIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgb3RoZXIgcmVjb2duaXplcnNcbiAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTsgLy8gaXMgaXMgZW5hYmxlZCBhbmQgYWxsb3cgcmVjb2duaXppbmc/XG5cbiAgICAgIGlmICghYm9vbE9yRm4odGhpcy5vcHRpb25zLmVuYWJsZSwgW3RoaXMsIGlucHV0RGF0YUNsb25lXSkpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG5cblxuICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfUkVDT0dOSVpFRCB8IFNUQVRFX0NBTkNFTExFRCB8IFNUQVRFX0ZBSUxFRCkpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTsgLy8gdGhlIHJlY29nbml6ZXIgaGFzIHJlY29nbml6ZWQgYSBnZXN0dXJlXG4gICAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEIHwgU1RBVEVfQ0FOQ0VMTEVEKSkge1xuICAgICAgICB0aGlzLnRyeUVtaXQoaW5wdXREYXRhQ2xvbmUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWNvZ25pemVyXG4gICAgICogdGhlIGFjdHVhbCByZWNvZ25pemluZyBoYXBwZW5zIGluIHRoaXMgbWV0aG9kXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICogQHJldHVybnMge0NvbnN0fSBTVEFURVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXREYXRhKSB7fSxcbiAgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcHJlZmVycmVkIHRvdWNoLWFjdGlvblxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHt9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIGdlc3R1cmUgaXNuJ3QgYWxsb3dlZCB0byByZWNvZ25pemVcbiAgICAgKiBsaWtlIHdoZW4gYW5vdGhlciBpcyBiZWluZyByZWNvZ25pemVkIG9yIGl0IGlzIGRpc2FibGVkXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7fVxuICB9O1xuICAvKipcbiAgICogZ2V0IGEgdXNhYmxlIHN0cmluZywgdXNlZCBhcyBldmVudCBwb3N0Zml4XG4gICAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IHN0YXRlXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlICYgU1RBVEVfQ0FOQ0VMTEVEKSB7XG4gICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICByZXR1cm4gJ2VuZCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0NIQU5HRUQpIHtcbiAgICAgIHJldHVybiAnbW92ZSc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0JFR0FOKSB7XG4gICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgLyoqXG4gICAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICAgKiBAcGFyYW0ge0NvbnN0fSBkaXJlY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG5cblxuICBmdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgcmV0dXJuICdkb3duJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fVVApIHtcbiAgICAgIHJldHVybiAndXAnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgYSByZWNvZ25pemVyIGJ5IG5hbWUgaWYgaXQgaXMgYm91bmQgdG8gYSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAgICogQHJldHVybnMge1JlY29nbml6ZXJ9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcblxuICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChBdHRyUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICAgIHZhciBvcHRpb25Qb2ludGVycyA9IHRoaXMub3B0aW9ucy5wb2ludGVycztcbiAgICAgIHJldHVybiBvcHRpb25Qb2ludGVycyA9PT0gMCB8fCBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvblBvaW50ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcbiAgICAgIHZhciBpc1JlY29nbml6ZWQgPSBzdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQpO1xuICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTsgLy8gb24gY2FuY2VsIGlucHV0IGFuZCB3ZSd2ZSByZWNvZ25pemVkIGJlZm9yZSwgcmV0dXJuIFNUQVRFX0NBTkNFTExFRFxuXG4gICAgICBpZiAoaXNSZWNvZ25pemVkICYmIChldmVudFR5cGUgJiBJTlBVVF9DQU5DRUwgfHwgIWlzVmFsaWQpKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWNvZ25pemVkIHx8IGlzVmFsaWQpIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBQYW5cbiAgICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFBhblJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnBYID0gbnVsbDtcbiAgICB0aGlzLnBZID0gbnVsbDtcbiAgfVxuXG4gIGluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICdwYW4nLFxuICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fQUxMXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgIHZhciBhY3Rpb25zID0gW107XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGlvbnM7XG4gICAgfSxcbiAgICBkaXJlY3Rpb25UZXN0OiBmdW5jdGlvbiBkaXJlY3Rpb25UZXN0KGlucHV0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBpbnB1dC5kaXN0YW5jZTtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5kaXJlY3Rpb247XG4gICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgIHZhciB5ID0gaW5wdXQuZGVsdGFZOyAvLyBsb2NrIHRvIGF4aXM/XG5cbiAgICAgIGlmICghKGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHggPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHggPCAwID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHkgPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG4gICAgICAgICAgaGFzTW92ZWQgPSB5ICE9IHRoaXMucFk7XG4gICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgIHJldHVybiBoYXNNb3ZlZCAmJiBkaXN0YW5jZSA+IG9wdGlvbnMudGhyZXNob2xkICYmIGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgICByZXR1cm4gQXR0clJlY29nbml6ZXIucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgISh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pICYmIHRoaXMuZGlyZWN0aW9uVGVzdChpbnB1dCkpO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgIHRoaXMucFkgPSBpbnB1dC5kZWx0YVk7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBQaW5jaFxuICAgKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlcnMgYXJlIG1vdmluZyB0b3dhcmQgKHpvb20taW4pIG9yIGF3YXkgZnJvbSBlYWNoIG90aGVyICh6b29tLW91dCkuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICAgKi9cblxuICBmdW5jdGlvbiBQaW5jaFJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIGV2ZW50OiAncGluY2gnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHtcbiAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiYgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGlucHV0KSB7XG4gICAgICBpZiAoaW5wdXQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogUHJlc3NcbiAgICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFByZXNzUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgfVxuXG4gIGluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICdwcmVzcycsXG4gICAgICBwb2ludGVyczogMSxcbiAgICAgIHRpbWU6IDI1MSxcbiAgICAgIC8vIG1pbmltYWwgdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBwcmVzc2VkXG4gICAgICB0aHJlc2hvbGQ6IDkgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcblxuICAgIH0sXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcbiAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgdmFyIHZhbGlkVGltZSA9IGlucHV0LmRlbHRhVGltZSA+IG9wdGlvbnMudGltZTtcbiAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7IC8vIHdlIG9ubHkgYWxsb3cgbGl0dGxlIG1vdmVtZW50XG4gICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG5cbiAgICAgIGlmICghdmFsaWRNb3ZlbWVudCB8fCAhdmFsaWRQb2ludGVycyB8fCBpbnB1dC5ldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAhdmFsaWRUaW1lKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgIHJldHVybiBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIFJvdGF0ZVxuICAgKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gUm90YXRlUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChSb3RhdGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUm90YXRlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICBwb2ludGVyczogMlxuICAgIH0sXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgfSxcbiAgICBhdHRyVGVzdDogZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiAoTWF0aC5hYnMoaW5wdXQucm90YXRpb24pID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBTd2lwZVxuICAgKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92aW5nIGZhc3QgKHZlbG9jaXR5KSwgd2l0aCBlbm91Z2ggZGlzdGFuY2UgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBpbmhlcml0KFN3aXBlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFN3aXBlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICB2ZWxvY2l0eTogMC4zLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCxcbiAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbiBhdHRyVGVzdChpbnB1dCkge1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gICAgICB2YXIgdmVsb2NpdHk7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5O1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiYgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmIGlucHV0Lm1heFBvaW50ZXJzID09IHRoaXMub3B0aW9ucy5wb2ludGVycyAmJiBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQub2Zmc2V0RGlyZWN0aW9uKTtcblxuICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAgICogYmV0d2VlbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIHBvc2l0aW9uLiBUaGUgZGVsYXkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSBtdWx0aS10YXBzIHdpdGhvdXQgZmlyaW5nXG4gICAqIGEgc2luZ2xlIHRhcC5cbiAgICpcbiAgICogVGhlIGV2ZW50RGF0YSBmcm9tIHRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBgdGFwQ291bnRgLCB3aGljaCBjb250YWlucyB0aGUgYW1vdW50IG9mXG4gICAqIG11bHRpLXRhcHMgYmVpbmcgcmVjb2duaXplZC5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gVGFwUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIHByZXZpb3VzIHRpbWUgYW5kIGNlbnRlcixcbiAgICAvLyB1c2VkIGZvciB0YXAgY291bnRpbmdcblxuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcbiAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG5cbiAgaW5oZXJpdChUYXBSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICB0YXBzOiAxLFxuICAgICAgaW50ZXJ2YWw6IDMwMCxcbiAgICAgIC8vIG1heCB0aW1lIGJldHdlZW4gdGhlIG11bHRpLXRhcCB0YXBzXG4gICAgICB0aW1lOiAyNTAsXG4gICAgICAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgdGhyZXNob2xkOiA5LFxuICAgICAgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9NQU5JUFVMQVRJT05dO1xuICAgIH0sXG4gICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcyhpbnB1dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcbiAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIHRoaXMuY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgIH0gLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgIC8vIGFuZCB3ZSd2ZSByZWFjaGVkIGFuIGVuZCBldmVudCwgc28gYSB0YXAgaXMgcG9zc2libGVcblxuXG4gICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfRU5EKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IGlucHV0LnRpbWVTdGFtcCAtIHRoaXMucFRpbWUgPCBvcHRpb25zLmludGVydmFsIDogdHJ1ZTtcbiAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICB0aGlzLnBDZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG5cbiAgICAgICAgaWYgKCF2YWxpZE11bHRpVGFwIHx8ICF2YWxpZEludGVydmFsKSB7XG4gICAgICAgICAgdGhpcy5jb3VudCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDsgLy8gaWYgdGFwIGNvdW50IG1hdGNoZXMgd2UgaGF2ZSByZWNvZ25pemVkIGl0LFxuICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuXG4gICAgICAgIHZhciB0YXBDb3VudCA9IHRoaXMuY291bnQgJSBvcHRpb25zLnRhcHM7XG5cbiAgICAgICAgaWYgKHRhcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gbm8gZmFpbGluZyByZXF1aXJlbWVudHMsIGltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIHRhcCBldmVudFxuICAgICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICAgIGlmICghdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbiBmYWlsVGltZW91dCgpIHtcbiAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdCgpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgdGhpcy5faW5wdXQudGFwQ291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsIHRoaXMuX2lucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKi9cblxuICBmdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIEBjb25zdCB7c3RyaW5nfVxuICAgKi9cblxuXG4gIEhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcbiAgLyoqXG4gICAqIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogQG5hbWVzcGFjZVxuICAgKi9cblxuICBIYW1tZXIuZGVmYXVsdHMgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IGlmIERPTSBldmVudHMgYXJlIGJlaW5nIHRyaWdnZXJlZC5cbiAgICAgKiBCdXQgdGhpcyBpcyBzbG93ZXIgYW5kIHVudXNlZCBieSBzaW1wbGUgaW1wbGVtZW50YXRpb25zLCBzbyBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgZG9tRXZlbnRzOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5L2ZhbGxiYWNrLlxuICAgICAqIFdoZW4gc2V0IHRvIGBjb21wdXRlYCBpdCB3aWxsIG1hZ2ljYWxseSBzZXQgdGhlIGNvcnJlY3QgdmFsdWUgYmFzZWQgb24gdGhlIGFkZGVkIHJlY29nbml6ZXJzLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgY29tcHV0ZVxuICAgICAqL1xuICAgIHRvdWNoQWN0aW9uOiBUT1VDSF9BQ1RJT05fQ09NUFVURSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBlbmFibGU6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAtLSBjYW4gYmUgcmVtb3ZlZC9jaGFuZ2VkXG4gICAgICogQ2hhbmdlIHRoZSBwYXJlbnQgaW5wdXQgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogSWYgTnVsbCwgdGhlbiBpdCBpcyBiZWluZyBzZXQgdGhlIHRvIG1haW4gZWxlbWVudC5cbiAgICAgKiBAdHlwZSB7TnVsbHxFdmVudFRhcmdldH1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRUYXJnZXQ6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBmb3JjZSBhbiBpbnB1dCBjbGFzc1xuICAgICAqIEB0eXBlIHtOdWxsfEZ1bmN0aW9ufVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dENsYXNzOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCByZWNvZ25pemVyIHNldHVwIHdoZW4gY2FsbGluZyBgSGFtbWVyKClgXG4gICAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyIHRoZXNlIHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICovXG4gICAgcHJlc2V0OiBbLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgW1JvdGF0ZVJlY29nbml6ZXIsIHtcbiAgICAgIGVuYWJsZTogZmFsc2VcbiAgICB9XSwgW1BpbmNoUmVjb2duaXplciwge1xuICAgICAgZW5hYmxlOiBmYWxzZVxuICAgIH0sIFsncm90YXRlJ11dLCBbU3dpcGVSZWNvZ25pemVyLCB7XG4gICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG4gICAgfV0sIFtQYW5SZWNvZ25pemVyLCB7XG4gICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG4gICAgfSwgWydzd2lwZSddXSwgW1RhcFJlY29nbml6ZXJdLCBbVGFwUmVjb2duaXplciwge1xuICAgICAgZXZlbnQ6ICdkb3VibGV0YXAnLFxuICAgICAgdGFwczogMlxuICAgIH0sIFsndGFwJ11dLCBbUHJlc3NSZWNvZ25pemVyXV0sXG5cbiAgICAvKipcbiAgICAgKiBTb21lIENTUyBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHdvcmtpbmcgb2YgSGFtbWVyLlxuICAgICAqIEFkZCB0aGVtIHRvIHRoaXMgbWV0aG9kIGFuZCB0aGV5IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlci5cbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICovXG4gICAgY3NzUHJvcHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICovXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgKi9cbiAgICAgIHRvdWNoU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAqIE9uIGlPUywgd2hlbiB5b3UgdG91Y2ggYW5kIGhvbGQgYSB0b3VjaCB0YXJnZXQgc3VjaCBhcyBhIGxpbmssIFNhZmFyaSBkaXNwbGF5c1xuICAgICAgICogYSBjYWxsb3V0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmsuIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHRoYXQgY2FsbG91dC5cbiAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAqL1xuICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLiBVc2VkIGJ5IElFMTA+XG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICovXG4gICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlcyB0aGUgaGlnaGxpZ2h0IGNvbG9yIHNob3duIHdoZW4gdGhlIHVzZXIgdGFwcyBhIGxpbmsgb3IgYSBKYXZhU2NyaXB0XG4gICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ3JnYmEoMCwwLDAsMCknXG4gICAgICAgKi9cbiAgICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgICB9XG4gIH07XG4gIHZhciBTVE9QID0gMTtcbiAgdmFyIEZPUkNFRF9TVE9QID0gMjtcbiAgLyoqXG4gICAqIE1hbmFnZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKi9cblxuICBmdW5jdGlvbiBNYW5hZ2VyKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIEhhbW1lci5kZWZhdWx0cywgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmlucHV0ID0gY3JlYXRlSW5wdXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnRvdWNoQWN0aW9uID0gbmV3IFRvdWNoQWN0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgcmVjb2duaXplciA9IHRoaXMuYWRkKG5ldyBpdGVtWzBdKGl0ZW1bMV0pKTtcbiAgICAgIGl0ZW1bMl0gJiYgcmVjb2duaXplci5yZWNvZ25pemVXaXRoKGl0ZW1bMl0pO1xuICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xuICB9XG5cbiAgTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KG9wdGlvbnMpIHtcbiAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOyAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG5cbiAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcChmb3JjZSkge1xuICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24gcmVjb2duaXplKGlucHV0RGF0YSkge1xuICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247XG5cbiAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuXG5cbiAgICAgIHRoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGlucHV0RGF0YSk7XG4gICAgICB2YXIgcmVjb2duaXplcjtcbiAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7IC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgLy8gc28gdGhlIHJlY29nbml6ZXIncyBzdGF0ZSBuZWVkcyB0byBiZSBCRUdBTiwgQ0hBTkdFRCwgRU5ERUQgb3IgUkVDT0dOSVpFRFxuICAgICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuXG4gICAgICB2YXIgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplcjsgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgIC8vIG9yIHdoZW4gd2UncmUgaW4gYSBuZXcgc2Vzc2lvblxuXG4gICAgICBpZiAoIWN1clJlY29nbml6ZXIgfHwgY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07IC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgICAgLy8gMS4gICBhbGxvdyBpZiB0aGUgc2Vzc2lvbiBpcyBOT1QgZm9yY2VkIHN0b3BwZWQgKHNlZSB0aGUgLnN0b3AoKSBtZXRob2QpXG4gICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgLy8gMy4gICBhbGxvdyBpZiB0aGUgcmVjb2duaXplciBpcyBhbGxvd2VkIHRvIHJ1biBzaW11bHRhbmVvdXMgd2l0aCB0aGUgY3VycmVudCByZWNvZ25pemVkIHJlY29nbml6ZXIuXG4gICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuXG4gICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQgIT09IEZPUkNFRF9TVE9QICYmICggLy8gMVxuICAgICAgICAhY3VyUmVjb2duaXplciB8fCByZWNvZ25pemVyID09IGN1clJlY29nbml6ZXIgfHwgLy8gMlxuICAgICAgICByZWNvZ25pemVyLmNhblJlY29nbml6ZVdpdGgoY3VyUmVjb2duaXplcikpKSB7XG4gICAgICAgICAgLy8gM1xuICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjb2duaXplci5yZXNldCgpO1xuICAgICAgICB9IC8vIGlmIHRoZSByZWNvZ25pemVyIGhhcyBiZWVuIHJlY29nbml6aW5nIHRoZSBpbnB1dCBhcyBhIHZhbGlkIGdlc3R1cmUsIHdlIHdhbnQgdG8gc3RvcmUgdGhpcyBvbmUgYXMgdGhlXG4gICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuXG5cbiAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdldCBhIHJlY29nbml6ZXIgYnkgaXRzIGV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfE51bGx9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQocmVjb2duaXplcikge1xuICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChyZWNvZ25pemVyKSB7XG4gICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ2FkZCcsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyByZW1vdmUgZXhpc3RpbmdcblxuXG4gICAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuXG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoZXhpc3RpbmcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICByZWNvZ25pemVyLm1hbmFnZXIgPSB0aGlzO1xuICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYSByZWNvZ25pemVyIGJ5IG5hbWUgb3IgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUocmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmVjb2duaXplciA9IHRoaXMuZ2V0KHJlY29nbml6ZXIpOyAvLyBsZXQncyBtYWtlIHN1cmUgdGhpcyByZWNvZ25pemVyIGV4aXN0c1xuXG4gICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgIGhhbmRsZXJzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIGV2ZW50LCBsZWF2ZSBlbWl0IGJsYW5rIHRvIHJlbW92ZSBhbGwgaGFuZGxlcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhbmRsZXJdXG4gICAgICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gdGhpc1xuICAgICAqL1xuICAgIG9mZjogZnVuY3Rpb24gb2ZmKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcbiAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFuZGxlcnNbZXZlbnRdICYmIGhhbmRsZXJzW2V2ZW50XS5zcGxpY2UoaW5BcnJheShoYW5kbGVyc1tldmVudF0sIGhhbmRsZXIpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50LCBkYXRhKSB7XG4gICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gdHJpZ2dlciBkb20gZXZlbnRzXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpO1xuICAgICAgfSAvLyBubyBoYW5kbGVycywgc28gc2tpcCBpdCBhbGxcblxuXG4gICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuXG4gICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnR5cGUgPSBldmVudDtcblxuICAgICAgZGF0YS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGF0YS5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICBoYW5kbGVyc1tpXShkYXRhKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXN0cm95IHRoZSBtYW5hZ2VyIGFuZCB1bmJpbmRzIGFsbCBldmVudHNcbiAgICAgKiBpdCBkb2Vzbid0IHVuYmluZCBkb20gZXZlbnRzLCB0aGF0IGlzIHRoZSB1c2VyIG93biByZXNwb25zaWJpbGl0eVxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgJiYgdG9nZ2xlQ3NzUHJvcHModGhpcywgZmFsc2UpO1xuICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogYWRkL3JlbW92ZSB0aGUgY3NzIHByb3BlcnRpZXMgYXMgZGVmaW5lZCBpbiBtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHNcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50LnN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3A7XG4gICAgZWFjaChtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHMsIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgcHJvcCA9IHByZWZpeGVkKGVsZW1lbnQuc3R5bGUsIG5hbWUpO1xuXG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSB8fCAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghYWRkKSB7XG4gICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiB0cmlnZ2VyIGRvbSBldmVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG5cblxuICBmdW5jdGlvbiB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpIHtcbiAgICB2YXIgZ2VzdHVyZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZ2VzdHVyZUV2ZW50LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZ2VzdHVyZUV2ZW50Lmdlc3R1cmUgPSBkYXRhO1xuICAgIGRhdGEudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZ2VzdHVyZUV2ZW50KTtcbiAgfVxuXG4gIGFzc2lnbihIYW1tZXIsIHtcbiAgICBJTlBVVF9TVEFSVDogSU5QVVRfU1RBUlQsXG4gICAgSU5QVVRfTU9WRTogSU5QVVRfTU9WRSxcbiAgICBJTlBVVF9FTkQ6IElOUFVUX0VORCxcbiAgICBJTlBVVF9DQU5DRUw6IElOUFVUX0NBTkNFTCxcbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG4gICAgRElSRUNUSU9OX05PTkU6IERJUkVDVElPTl9OT05FLFxuICAgIERJUkVDVElPTl9MRUZUOiBESVJFQ1RJT05fTEVGVCxcbiAgICBESVJFQ1RJT05fUklHSFQ6IERJUkVDVElPTl9SSUdIVCxcbiAgICBESVJFQ1RJT05fVVA6IERJUkVDVElPTl9VUCxcbiAgICBESVJFQ1RJT05fRE9XTjogRElSRUNUSU9OX0RPV04sXG4gICAgRElSRUNUSU9OX0hPUklaT05UQUw6IERJUkVDVElPTl9IT1JJWk9OVEFMLFxuICAgIERJUkVDVElPTl9WRVJUSUNBTDogRElSRUNUSU9OX1ZFUlRJQ0FMLFxuICAgIERJUkVDVElPTl9BTEw6IERJUkVDVElPTl9BTEwsXG4gICAgTWFuYWdlcjogTWFuYWdlcixcbiAgICBJbnB1dDogSW5wdXQsXG4gICAgVG91Y2hBY3Rpb246IFRvdWNoQWN0aW9uLFxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcbiAgICBSZWNvZ25pemVyOiBSZWNvZ25pemVyLFxuICAgIEF0dHJSZWNvZ25pemVyOiBBdHRyUmVjb2duaXplcixcbiAgICBUYXA6IFRhcFJlY29nbml6ZXIsXG4gICAgUGFuOiBQYW5SZWNvZ25pemVyLFxuICAgIFN3aXBlOiBTd2lwZVJlY29nbml6ZXIsXG4gICAgUGluY2g6IFBpbmNoUmVjb2duaXplcixcbiAgICBSb3RhdGU6IFJvdGF0ZVJlY29nbml6ZXIsXG4gICAgUHJlc3M6IFByZXNzUmVjb2duaXplcixcbiAgICBvbjogYWRkRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2ZmOiByZW1vdmVFdmVudExpc3RlbmVycyxcbiAgICBlYWNoOiBlYWNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBpbmhlcml0OiBpbmhlcml0LFxuICAgIGJpbmRGbjogYmluZEZuLFxuICAgIHByZWZpeGVkOiBwcmVmaXhlZFxuICB9KTsgLy8gdGhpcyBwcmV2ZW50cyBlcnJvcnMgd2hlbiBIYW1tZXIgaXMgbG9hZGVkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTURcbiAgLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG5cbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgZnJlZUdsb2JhbC5IYW1tZXIgPSBIYW1tZXI7XG5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gSGFtbWVyO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEhhbW1lcjtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG4gIH1cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5087\n")},1677:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({\n value: true\n});\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\nvar UAParser = __webpack_require__(4889);\n\nvar UA = new UAParser();\nvar browser = UA.getBrowser();\nvar cpu = UA.getCPU();\nvar device = UA.getDevice();\nvar engine = UA.getEngine();\nvar os = UA.getOS();\nvar ua = UA.getUA();\n\nvar setDefaults = function setDefaults(p) {\n var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \'none\';\n return p ? p : d;\n};\n\nvar getNavigatorInstance = function getNavigatorInstance() {\n if (typeof window !== \'undefined\') {\n if (window.navigator || navigator) {\n return window.navigator || navigator;\n }\n }\n\n return false;\n};\n\nvar isIOS13Check = function isIOS13Check(type) {\n var nav = getNavigatorInstance();\n return nav && nav.platform && (nav.platform.indexOf(type) !== -1 || nav.platform === \'MacIntel\' && nav.maxTouchPoints > 1 && !window.MSStream);\n};\n\nfunction _typeof(obj) {\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n };\n }\n\n return _typeof(obj);\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 _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}\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 _extends() {\n _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 return _extends.apply(this, arguments);\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(source, true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(source).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\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");\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) _setPrototypeOf(subClass, superClass);\n}\n\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}\n\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}\n\nfunction _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\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\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\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === "object" || typeof call === "function")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nvar DeviceTypes = {\n Mobile: \'mobile\',\n Tablet: \'tablet\',\n SmartTv: \'smarttv\',\n Console: \'console\',\n Wearable: \'wearable\',\n Browser: undefined\n};\nvar BrowserTypes = {\n Chrome: \'Chrome\',\n Firefox: "Firefox",\n Opera: "Opera",\n Yandex: "Yandex",\n Safari: "Safari",\n InternetExplorer: "Internet Explorer",\n Edge: "Edge",\n Chromium: "Chromium",\n Ie: \'IE\',\n MobileSafari: "Mobile Safari",\n EdgeChromium: "Edge Chromium",\n MIUI: "MIUI Browser",\n SamsungBrowser: \'Samsung Browser\'\n};\nvar OsTypes = {\n IOS: \'iOS\',\n Android: "Android",\n WindowsPhone: "Windows Phone",\n Windows: \'Windows\',\n MAC_OS: \'Mac OS\'\n};\nvar initialData = {\n isMobile: false,\n isTablet: false,\n isBrowser: false,\n isSmartTV: false,\n isConsole: false,\n isWearable: false\n};\n\nvar checkType = function checkType(type) {\n switch (type) {\n case DeviceTypes.Mobile:\n return {\n isMobile: true\n };\n\n case DeviceTypes.Tablet:\n return {\n isTablet: true\n };\n\n case DeviceTypes.SmartTv:\n return {\n isSmartTV: true\n };\n\n case DeviceTypes.Console:\n return {\n isConsole: true\n };\n\n case DeviceTypes.Wearable:\n return {\n isWearable: true\n };\n\n case DeviceTypes.Browser:\n return {\n isBrowser: true\n };\n\n default:\n return initialData;\n }\n};\n\nvar broPayload = function broPayload(isBrowser, browser, engine, os, ua) {\n return {\n isBrowser: isBrowser,\n browserMajorVersion: setDefaults(browser.major),\n browserFullVersion: setDefaults(browser.version),\n browserName: setDefaults(browser.name),\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar mobilePayload = function mobilePayload(type, device, os, ua) {\n return _objectSpread2({}, type, {\n vendor: setDefaults(device.vendor),\n model: setDefaults(device.model),\n os: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n ua: setDefaults(ua)\n });\n};\n\nvar stvPayload = function stvPayload(isSmartTV, engine, os, ua) {\n return {\n isSmartTV: isSmartTV,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar consolePayload = function consolePayload(isConsole, engine, os, ua) {\n return {\n isConsole: isConsole,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar wearPayload = function wearPayload(isWearable, engine, os, ua) {\n return {\n isWearable: isWearable,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar type = checkType(device.type);\n\nfunction deviceDetect() {\n var isBrowser = type.isBrowser,\n isMobile = type.isMobile,\n isTablet = type.isTablet,\n isSmartTV = type.isSmartTV,\n isConsole = type.isConsole,\n isWearable = type.isWearable;\n\n if (isBrowser) {\n return broPayload(isBrowser, browser, engine, os, ua);\n }\n\n if (isSmartTV) {\n return stvPayload(isSmartTV, engine, os, ua);\n }\n\n if (isConsole) {\n return consolePayload(isConsole, engine, os, ua);\n }\n\n if (isMobile) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isTablet) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isWearable) {\n return wearPayload(isWearable, engine, os, ua);\n }\n}\n\nvar isMobileType = function isMobileType() {\n return device.type === DeviceTypes.Mobile;\n};\n\nvar isTabletType = function isTabletType() {\n return device.type === DeviceTypes.Tablet;\n};\n\nvar isMobileAndTabletType = function isMobileAndTabletType() {\n switch (device.type) {\n case DeviceTypes.Mobile:\n case DeviceTypes.Tablet:\n return true;\n\n default:\n return false;\n }\n};\n\nvar isEdgeChromiumType = function isEdgeChromiumType() {\n return typeof ua === \'string\' && ua.indexOf(\'Edg/\') !== -1;\n};\n\nvar isSmartTVType = function isSmartTVType() {\n return device.type === DeviceTypes.SmartTv;\n};\n\nvar isBrowserType = function isBrowserType() {\n return device.type === DeviceTypes.Browser;\n};\n\nvar isWearableType = function isWearableType() {\n return device.type === DeviceTypes.Wearable;\n};\n\nvar isConsoleType = function isConsoleType() {\n return device.type === DeviceTypes.Console;\n};\n\nvar isAndroidType = function isAndroidType() {\n return os.name === OsTypes.Android;\n};\n\nvar isWindowsType = function isWindowsType() {\n return os.name === OsTypes.Windows;\n};\n\nvar isMacOsType = function isMacOsType() {\n return os.name === OsTypes.MAC_OS;\n};\n\nvar isWinPhoneType = function isWinPhoneType() {\n return os.name === OsTypes.WindowsPhone;\n};\n\nvar isIOSType = function isIOSType() {\n return os.name === OsTypes.IOS;\n};\n\nvar isChromeType = function isChromeType() {\n return browser.name === BrowserTypes.Chrome;\n};\n\nvar isFirefoxType = function isFirefoxType() {\n return browser.name === BrowserTypes.Firefox;\n};\n\nvar isChromiumType = function isChromiumType() {\n return browser.name === BrowserTypes.Chromium;\n};\n\nvar isEdgeType = function isEdgeType() {\n return browser.name === BrowserTypes.Edge;\n};\n\nvar isYandexType = function isYandexType() {\n return browser.name === BrowserTypes.Yandex;\n};\n\nvar isSafariType = function isSafariType() {\n return browser.name === BrowserTypes.Safari || browser.name === BrowserTypes.MobileSafari;\n};\n\nvar isMobileSafariType = function isMobileSafariType() {\n return browser.name === BrowserTypes.MobileSafari;\n};\n\nvar isOperaType = function isOperaType() {\n return browser.name === BrowserTypes.Opera;\n};\n\nvar isIEType = function isIEType() {\n return browser.name === BrowserTypes.InternetExplorer || browser.name === BrowserTypes.Ie;\n};\n\nvar isMIUIType = function isMIUIType() {\n return browser.name === BrowserTypes.MIUI;\n};\n\nvar isSamsungBrowserType = function isSamsungBrowserType() {\n return browser.name === BrowserTypes.SamsungBrowser;\n};\n\nvar isElectronType = function isElectronType() {\n var nav = getNavigatorInstance();\n var ua = nav && nav.userAgent && nav.userAgent.toLowerCase();\n return typeof ua === \'string\' ? /electron/.test(ua) : false;\n};\n\nvar getIOS13 = function getIOS13() {\n var nav = getNavigatorInstance();\n return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === \'MacIntel\' && nav.maxTouchPoints > 1) && !window.MSStream;\n};\n\nvar getIPad13 = function getIPad13() {\n return isIOS13Check(\'iPad\');\n};\n\nvar getIphone13 = function getIphone13() {\n return isIOS13Check(\'iPhone\');\n};\n\nvar getIPod13 = function getIPod13() {\n return isIOS13Check(\'iPod\');\n};\n\nvar getBrowserFullVersion = function getBrowserFullVersion() {\n return setDefaults(browser.version);\n};\n\nvar getBrowserVersion = function getBrowserVersion() {\n return setDefaults(browser.major);\n};\n\nvar getOsVersion = function getOsVersion() {\n return setDefaults(os.version);\n};\n\nvar getOsName = function getOsName() {\n return setDefaults(os.name);\n};\n\nvar getBrowserName = function getBrowserName() {\n return setDefaults(browser.name);\n};\n\nvar getMobileVendor = function getMobileVendor() {\n return setDefaults(device.vendor);\n};\n\nvar getMobileModel = function getMobileModel() {\n return setDefaults(device.model);\n};\n\nvar getEngineName = function getEngineName() {\n return setDefaults(engine.name);\n};\n\nvar getEngineVersion = function getEngineVersion() {\n return setDefaults(engine.version);\n};\n\nvar getUseragent = function getUseragent() {\n return setDefaults(ua);\n};\n\nvar getDeviceType = function getDeviceType() {\n return setDefaults(device.type, \'browser\');\n};\n\nvar isSmartTV = isSmartTVType();\nvar isConsole = isConsoleType();\nvar isWearable = isWearableType();\nvar isMobileSafari = isMobileSafariType() || getIPad13();\nvar isChromium = isChromiumType();\nvar isMobile = isMobileAndTabletType() || getIPad13();\nvar isMobileOnly = isMobileType();\nvar isTablet = isTabletType() || getIPad13();\nvar isBrowser = isBrowserType();\nvar isDesktop = isBrowserType();\nvar isAndroid = isAndroidType();\nvar isWinPhone = isWinPhoneType();\nvar isIOS = isIOSType() || getIPad13();\nvar isChrome = isChromeType();\nvar isFirefox = isFirefoxType();\nvar isSafari = isSafariType();\nvar isOpera = isOperaType();\nvar isIE = isIEType();\nvar osVersion = getOsVersion();\nvar osName = getOsName();\nvar fullBrowserVersion = getBrowserFullVersion();\nvar browserVersion = getBrowserVersion();\nvar browserName = getBrowserName();\nvar mobileVendor = getMobileVendor();\nvar mobileModel = getMobileModel();\nvar engineName = getEngineName();\nvar engineVersion = getEngineVersion();\nvar getUA = getUseragent();\nvar isEdge = isEdgeType() || isEdgeChromiumType();\nvar isYandex = isYandexType();\nvar deviceType = getDeviceType();\nvar isIOS13 = getIOS13();\nvar isIPad13 = getIPad13();\nvar isIPhone13 = getIphone13();\nvar isIPod13 = getIPod13();\nvar isElectron = isElectronType();\nvar isEdgeChromium = isEdgeChromiumType();\nvar isLegacyEdge = isEdgeType() && !isEdgeChromiumType();\nvar isWindows = isWindowsType();\nvar isMacOs = isMacOsType();\nvar isMIUI = isMIUIType();\nvar isSamsungBrowser = isSamsungBrowserType();\n\nvar AndroidView = function AndroidView(_ref) {\n var renderWithFragment = _ref.renderWithFragment,\n children = _ref.children,\n viewClassName = _ref.viewClassName,\n style = _ref.style,\n props = _objectWithoutProperties(_ref, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isAndroid ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar BrowserView = function BrowserView(_ref2) {\n var renderWithFragment = _ref2.renderWithFragment,\n children = _ref2.children,\n viewClassName = _ref2.viewClassName,\n style = _ref2.style,\n props = _objectWithoutProperties(_ref2, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isBrowser ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar IEView = function IEView(_ref3) {\n var renderWithFragment = _ref3.renderWithFragment,\n children = _ref3.children,\n viewClassName = _ref3.viewClassName,\n style = _ref3.style,\n props = _objectWithoutProperties(_ref3, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isIE ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar IOSView = function IOSView(_ref4) {\n var renderWithFragment = _ref4.renderWithFragment,\n children = _ref4.children,\n viewClassName = _ref4.viewClassName,\n style = _ref4.style,\n props = _objectWithoutProperties(_ref4, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isIOS ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar MobileView = function MobileView(_ref5) {\n var renderWithFragment = _ref5.renderWithFragment,\n children = _ref5.children,\n viewClassName = _ref5.viewClassName,\n style = _ref5.style,\n props = _objectWithoutProperties(_ref5, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isMobile ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar TabletView = function TabletView(_ref6) {\n var renderWithFragment = _ref6.renderWithFragment,\n children = _ref6.children,\n viewClassName = _ref6.viewClassName,\n style = _ref6.style,\n props = _objectWithoutProperties(_ref6, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isTablet ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar WinPhoneView = function WinPhoneView(_ref7) {\n var renderWithFragment = _ref7.renderWithFragment,\n children = _ref7.children,\n viewClassName = _ref7.viewClassName,\n style = _ref7.style,\n props = _objectWithoutProperties(_ref7, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isWinPhone ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar MobileOnlyView = function MobileOnlyView(_ref8) {\n var renderWithFragment = _ref8.renderWithFragment,\n children = _ref8.children,\n viewClassName = _ref8.viewClassName,\n style = _ref8.style,\n props = _objectWithoutProperties(_ref8, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isMobileOnly ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar SmartTVView = function SmartTVView(_ref9) {\n var renderWithFragment = _ref9.renderWithFragment,\n children = _ref9.children,\n viewClassName = _ref9.viewClassName,\n style = _ref9.style,\n props = _objectWithoutProperties(_ref9, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isSmartTV ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar ConsoleView = function ConsoleView(_ref10) {\n var renderWithFragment = _ref10.renderWithFragment,\n children = _ref10.children,\n viewClassName = _ref10.viewClassName,\n style = _ref10.style,\n props = _objectWithoutProperties(_ref10, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isConsole ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar WearableView = function WearableView(_ref11) {\n var renderWithFragment = _ref11.renderWithFragment,\n children = _ref11.children,\n viewClassName = _ref11.viewClassName,\n style = _ref11.style,\n props = _objectWithoutProperties(_ref11, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isWearable ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar CustomView = function CustomView(_ref12) {\n var renderWithFragment = _ref12.renderWithFragment,\n children = _ref12.children,\n viewClassName = _ref12.viewClassName,\n style = _ref12.style,\n condition = _ref12.condition,\n props = _objectWithoutProperties(_ref12, ["renderWithFragment", "children", "viewClassName", "style", "condition"]);\n\n return condition ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nfunction withOrientationChange(WrappedComponent) {\n return /*#__PURE__*/function (_React$Component) {\n _inherits(_class, _React$Component);\n\n function _class(props) {\n var _this;\n\n _classCallCheck(this, _class);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));\n _this.isEventListenerAdded = false;\n _this.handleOrientationChange = _this.handleOrientationChange.bind(_assertThisInitialized(_this));\n _this.onOrientationChange = _this.onOrientationChange.bind(_assertThisInitialized(_this));\n _this.onPageLoad = _this.onPageLoad.bind(_assertThisInitialized(_this));\n _this.state = {\n isLandscape: false,\n isPortrait: false\n };\n return _this;\n }\n\n _createClass(_class, [{\n key: "handleOrientationChange",\n value: function handleOrientationChange() {\n if (!this.isEventListenerAdded) {\n this.isEventListenerAdded = true;\n }\n\n var orientation = window.innerWidth > window.innerHeight ? 90 : 0;\n this.setState({\n isPortrait: orientation === 0,\n isLandscape: orientation === 90\n });\n }\n }, {\n key: "onOrientationChange",\n value: function onOrientationChange() {\n this.handleOrientationChange();\n }\n }, {\n key: "onPageLoad",\n value: function onPageLoad() {\n this.handleOrientationChange();\n }\n }, {\n key: "componentDidMount",\n value: function componentDidMount() {\n if ((typeof window === "undefined" ? "undefined" : _typeof(window)) !== undefined && isMobile) {\n if (!this.isEventListenerAdded) {\n this.handleOrientationChange();\n window.addEventListener("load", this.onPageLoad, false);\n } else {\n window.removeEventListener("load", this.onPageLoad, false);\n }\n\n window.addEventListener("resize", this.onOrientationChange, false);\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n window.removeEventListener("resize", this.onOrientationChange, false);\n }\n }, {\n key: "render",\n value: function render() {\n return React__default.createElement(WrappedComponent, _extends({}, this.props, {\n isLandscape: this.state.isLandscape,\n isPortrait: this.state.isPortrait\n }));\n }\n }]);\n\n return _class;\n }(React__default.Component);\n}\n\n__webpack_unused_export__ = AndroidView;\n__webpack_unused_export__ = BrowserTypes;\n__webpack_unused_export__ = BrowserView;\n__webpack_unused_export__ = ConsoleView;\n__webpack_unused_export__ = CustomView;\n__webpack_unused_export__ = IEView;\n__webpack_unused_export__ = IOSView;\n__webpack_unused_export__ = MobileOnlyView;\n__webpack_unused_export__ = MobileView;\n__webpack_unused_export__ = OsTypes;\n__webpack_unused_export__ = SmartTVView;\n__webpack_unused_export__ = TabletView;\n__webpack_unused_export__ = WearableView;\n__webpack_unused_export__ = WinPhoneView;\n__webpack_unused_export__ = browserName;\n__webpack_unused_export__ = browserVersion;\n__webpack_unused_export__ = deviceDetect;\n__webpack_unused_export__ = deviceType;\n__webpack_unused_export__ = engineName;\n__webpack_unused_export__ = engineVersion;\n__webpack_unused_export__ = fullBrowserVersion;\n__webpack_unused_export__ = getUA;\n__webpack_unused_export__ = isAndroid;\n__webpack_unused_export__ = isBrowser;\n__webpack_unused_export__ = isChrome;\n__webpack_unused_export__ = isChromium;\n__webpack_unused_export__ = isConsole;\n__webpack_unused_export__ = isDesktop;\n__webpack_unused_export__ = isEdge;\n__webpack_unused_export__ = isEdgeChromium;\n__webpack_unused_export__ = isElectron;\n__webpack_unused_export__ = isFirefox;\n__webpack_unused_export__ = isIE;\n__webpack_unused_export__ = isIOS;\n__webpack_unused_export__ = isIOS13;\n__webpack_unused_export__ = isIPad13;\n__webpack_unused_export__ = isIPhone13;\n__webpack_unused_export__ = isIPod13;\n__webpack_unused_export__ = isLegacyEdge;\n__webpack_unused_export__ = isMIUI;\n__webpack_unused_export__ = isMacOs;\nexports.tq = isMobile;\n__webpack_unused_export__ = isMobileOnly;\n__webpack_unused_export__ = isMobileSafari;\n__webpack_unused_export__ = isOpera;\n__webpack_unused_export__ = isSafari;\n__webpack_unused_export__ = isSamsungBrowser;\n__webpack_unused_export__ = isSmartTV;\n__webpack_unused_export__ = isTablet;\n__webpack_unused_export__ = isWearable;\n__webpack_unused_export__ = isWinPhone;\n__webpack_unused_export__ = isWindows;\n__webpack_unused_export__ = isYandex;\n__webpack_unused_export__ = mobileModel;\n__webpack_unused_export__ = mobileVendor;\n__webpack_unused_export__ = osName;\n__webpack_unused_export__ = osVersion;\n__webpack_unused_export__ = withOrientationChange;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1kZXZpY2UtZGV0ZWN0L21haW4uanM/N2I2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQWE7O0FBRWIsNkJBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxDQUFDOztBQUVGO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsSUFBTzs7QUFFM0I7O0FBRUEsZUFBZSxtQkFBTyxDQUFDLElBQWlDOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGVBQWUsNkJBQTZCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHlFQUF5RTtBQUN6RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDs7QUFFQSx5QkFBbUI7QUFDbkIseUJBQW9CO0FBQ3BCLHlCQUFtQjtBQUNuQix5QkFBbUI7QUFDbkIseUJBQWtCO0FBQ2xCLHlCQUFjO0FBQ2QseUJBQWU7QUFDZix5QkFBc0I7QUFDdEIseUJBQWtCO0FBQ2xCLHlCQUFlO0FBQ2YseUJBQW1CO0FBQ25CLHlCQUFrQjtBQUNsQix5QkFBb0I7QUFDcEIseUJBQW9CO0FBQ3BCLHlCQUFtQjtBQUNuQix5QkFBc0I7QUFDdEIseUJBQW9CO0FBQ3BCLHlCQUFrQjtBQUNsQix5QkFBa0I7QUFDbEIseUJBQXFCO0FBQ3JCLHlCQUEwQjtBQUMxQix5QkFBYTtBQUNiLHlCQUFpQjtBQUNqQix5QkFBaUI7QUFDakIseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBaUI7QUFDakIseUJBQWlCO0FBQ2pCLHlCQUFjO0FBQ2QseUJBQXNCO0FBQ3RCLHlCQUFrQjtBQUNsQix5QkFBaUI7QUFDakIseUJBQVk7QUFDWix5QkFBYTtBQUNiLHlCQUFlO0FBQ2YseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBZ0I7QUFDaEIseUJBQW9CO0FBQ3BCLHlCQUFjO0FBQ2QseUJBQWU7QUFDZixVQUFnQjtBQUNoQix5QkFBb0I7QUFDcEIseUJBQXNCO0FBQ3RCLHlCQUFlO0FBQ2YseUJBQWdCO0FBQ2hCLHlCQUF3QjtBQUN4Qix5QkFBaUI7QUFDakIseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBa0I7QUFDbEIseUJBQWlCO0FBQ2pCLHlCQUFnQjtBQUNoQix5QkFBbUI7QUFDbkIseUJBQW9CO0FBQ3BCLHlCQUFjO0FBQ2QseUJBQWlCO0FBQ2pCLHlCQUE2QiIsImZpbGUiOiIxNjc3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0KGV4KSB7XG4gIHJldHVybiBleCAmJiB0eXBlb2YgZXggPT09ICdvYmplY3QnICYmICdkZWZhdWx0JyBpbiBleCA/IGV4WydkZWZhdWx0J10gOiBleDtcbn1cblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIFJlYWN0X19kZWZhdWx0ID0gX2ludGVyb3BEZWZhdWx0KFJlYWN0KTtcblxudmFyIFVBUGFyc2VyID0gcmVxdWlyZSgndWEtcGFyc2VyLWpzL2Rpc3QvdWEtcGFyc2VyLm1pbicpO1xuXG52YXIgVUEgPSBuZXcgVUFQYXJzZXIoKTtcbnZhciBicm93c2VyID0gVUEuZ2V0QnJvd3NlcigpO1xudmFyIGNwdSA9IFVBLmdldENQVSgpO1xudmFyIGRldmljZSA9IFVBLmdldERldmljZSgpO1xudmFyIGVuZ2luZSA9IFVBLmdldEVuZ2luZSgpO1xudmFyIG9zID0gVUEuZ2V0T1MoKTtcbnZhciB1YSA9IFVBLmdldFVBKCk7XG5cbnZhciBzZXREZWZhdWx0cyA9IGZ1bmN0aW9uIHNldERlZmF1bHRzKHApIHtcbiAgdmFyIGQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdub25lJztcbiAgcmV0dXJuIHAgPyBwIDogZDtcbn07XG5cbnZhciBnZXROYXZpZ2F0b3JJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldE5hdmlnYXRvckluc3RhbmNlKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAod2luZG93Lm5hdmlnYXRvciB8fCBuYXZpZ2F0b3IpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yIHx8IG5hdmlnYXRvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgaXNJT1MxM0NoZWNrID0gZnVuY3Rpb24gaXNJT1MxM0NoZWNrKHR5cGUpIHtcbiAgdmFyIG5hdiA9IGdldE5hdmlnYXRvckluc3RhbmNlKCk7XG4gIHJldHVybiBuYXYgJiYgbmF2LnBsYXRmb3JtICYmIChuYXYucGxhdGZvcm0uaW5kZXhPZih0eXBlKSAhPT0gLTEgfHwgbmF2LnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmIG5hdi5tYXhUb3VjaFBvaW50cyA+IDEgJiYgIXdpbmRvdy5NU1N0cmVhbSk7XG59O1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG5cbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuXG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxudmFyIERldmljZVR5cGVzID0ge1xuICBNb2JpbGU6ICdtb2JpbGUnLFxuICBUYWJsZXQ6ICd0YWJsZXQnLFxuICBTbWFydFR2OiAnc21hcnR0dicsXG4gIENvbnNvbGU6ICdjb25zb2xlJyxcbiAgV2VhcmFibGU6ICd3ZWFyYWJsZScsXG4gIEJyb3dzZXI6IHVuZGVmaW5lZFxufTtcbnZhciBCcm93c2VyVHlwZXMgPSB7XG4gIENocm9tZTogJ0Nocm9tZScsXG4gIEZpcmVmb3g6IFwiRmlyZWZveFwiLFxuICBPcGVyYTogXCJPcGVyYVwiLFxuICBZYW5kZXg6IFwiWWFuZGV4XCIsXG4gIFNhZmFyaTogXCJTYWZhcmlcIixcbiAgSW50ZXJuZXRFeHBsb3JlcjogXCJJbnRlcm5ldCBFeHBsb3JlclwiLFxuICBFZGdlOiBcIkVkZ2VcIixcbiAgQ2hyb21pdW06IFwiQ2hyb21pdW1cIixcbiAgSWU6ICdJRScsXG4gIE1vYmlsZVNhZmFyaTogXCJNb2JpbGUgU2FmYXJpXCIsXG4gIEVkZ2VDaHJvbWl1bTogXCJFZGdlIENocm9taXVtXCIsXG4gIE1JVUk6IFwiTUlVSSBCcm93c2VyXCIsXG4gIFNhbXN1bmdCcm93c2VyOiAnU2Ftc3VuZyBCcm93c2VyJ1xufTtcbnZhciBPc1R5cGVzID0ge1xuICBJT1M6ICdpT1MnLFxuICBBbmRyb2lkOiBcIkFuZHJvaWRcIixcbiAgV2luZG93c1Bob25lOiBcIldpbmRvd3MgUGhvbmVcIixcbiAgV2luZG93czogJ1dpbmRvd3MnLFxuICBNQUNfT1M6ICdNYWMgT1MnXG59O1xudmFyIGluaXRpYWxEYXRhID0ge1xuICBpc01vYmlsZTogZmFsc2UsXG4gIGlzVGFibGV0OiBmYWxzZSxcbiAgaXNCcm93c2VyOiBmYWxzZSxcbiAgaXNTbWFydFRWOiBmYWxzZSxcbiAgaXNDb25zb2xlOiBmYWxzZSxcbiAgaXNXZWFyYWJsZTogZmFsc2Vcbn07XG5cbnZhciBjaGVja1R5cGUgPSBmdW5jdGlvbiBjaGVja1R5cGUodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERldmljZVR5cGVzLk1vYmlsZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTW9iaWxlOiB0cnVlXG4gICAgICB9O1xuXG4gICAgY2FzZSBEZXZpY2VUeXBlcy5UYWJsZXQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1RhYmxldDogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuU21hcnRUdjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzU21hcnRUVjogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuQ29uc29sZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQ29uc29sZTogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuV2VhcmFibGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1dlYXJhYmxlOiB0cnVlXG4gICAgICB9O1xuXG4gICAgY2FzZSBEZXZpY2VUeXBlcy5Ccm93c2VyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNCcm93c2VyOiB0cnVlXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpbml0aWFsRGF0YTtcbiAgfVxufTtcblxudmFyIGJyb1BheWxvYWQgPSBmdW5jdGlvbiBicm9QYXlsb2FkKGlzQnJvd3NlciwgYnJvd3NlciwgZW5naW5lLCBvcywgdWEpIHtcbiAgcmV0dXJuIHtcbiAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlcixcbiAgICBicm93c2VyTWFqb3JWZXJzaW9uOiBzZXREZWZhdWx0cyhicm93c2VyLm1ham9yKSxcbiAgICBicm93c2VyRnVsbFZlcnNpb246IHNldERlZmF1bHRzKGJyb3dzZXIudmVyc2lvbiksXG4gICAgYnJvd3Nlck5hbWU6IHNldERlZmF1bHRzKGJyb3dzZXIubmFtZSksXG4gICAgZW5naW5lTmFtZTogc2V0RGVmYXVsdHMoZW5naW5lLm5hbWUpLFxuICAgIGVuZ2luZVZlcnNpb246IHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKSxcbiAgICBvc05hbWU6IHNldERlZmF1bHRzKG9zLm5hbWUpLFxuICAgIG9zVmVyc2lvbjogc2V0RGVmYXVsdHMob3MudmVyc2lvbiksXG4gICAgdXNlckFnZW50OiBzZXREZWZhdWx0cyh1YSlcbiAgfTtcbn07XG5cbnZhciBtb2JpbGVQYXlsb2FkID0gZnVuY3Rpb24gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSkge1xuICByZXR1cm4gX29iamVjdFNwcmVhZDIoe30sIHR5cGUsIHtcbiAgICB2ZW5kb3I6IHNldERlZmF1bHRzKGRldmljZS52ZW5kb3IpLFxuICAgIG1vZGVsOiBzZXREZWZhdWx0cyhkZXZpY2UubW9kZWwpLFxuICAgIG9zOiBzZXREZWZhdWx0cyhvcy5uYW1lKSxcbiAgICBvc1ZlcnNpb246IHNldERlZmF1bHRzKG9zLnZlcnNpb24pLFxuICAgIHVhOiBzZXREZWZhdWx0cyh1YSlcbiAgfSk7XG59O1xuXG52YXIgc3R2UGF5bG9hZCA9IGZ1bmN0aW9uIHN0dlBheWxvYWQoaXNTbWFydFRWLCBlbmdpbmUsIG9zLCB1YSkge1xuICByZXR1cm4ge1xuICAgIGlzU21hcnRUVjogaXNTbWFydFRWLFxuICAgIGVuZ2luZU5hbWU6IHNldERlZmF1bHRzKGVuZ2luZS5uYW1lKSxcbiAgICBlbmdpbmVWZXJzaW9uOiBzZXREZWZhdWx0cyhlbmdpbmUudmVyc2lvbiksXG4gICAgb3NOYW1lOiBzZXREZWZhdWx0cyhvcy5uYW1lKSxcbiAgICBvc1ZlcnNpb246IHNldERlZmF1bHRzKG9zLnZlcnNpb24pLFxuICAgIHVzZXJBZ2VudDogc2V0RGVmYXVsdHModWEpXG4gIH07XG59O1xuXG52YXIgY29uc29sZVBheWxvYWQgPSBmdW5jdGlvbiBjb25zb2xlUGF5bG9hZChpc0NvbnNvbGUsIGVuZ2luZSwgb3MsIHVhKSB7XG4gIHJldHVybiB7XG4gICAgaXNDb25zb2xlOiBpc0NvbnNvbGUsXG4gICAgZW5naW5lTmFtZTogc2V0RGVmYXVsdHMoZW5naW5lLm5hbWUpLFxuICAgIGVuZ2luZVZlcnNpb246IHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKSxcbiAgICBvc05hbWU6IHNldERlZmF1bHRzKG9zLm5hbWUpLFxuICAgIG9zVmVyc2lvbjogc2V0RGVmYXVsdHMob3MudmVyc2lvbiksXG4gICAgdXNlckFnZW50OiBzZXREZWZhdWx0cyh1YSlcbiAgfTtcbn07XG5cbnZhciB3ZWFyUGF5bG9hZCA9IGZ1bmN0aW9uIHdlYXJQYXlsb2FkKGlzV2VhcmFibGUsIGVuZ2luZSwgb3MsIHVhKSB7XG4gIHJldHVybiB7XG4gICAgaXNXZWFyYWJsZTogaXNXZWFyYWJsZSxcbiAgICBlbmdpbmVOYW1lOiBzZXREZWZhdWx0cyhlbmdpbmUubmFtZSksXG4gICAgZW5naW5lVmVyc2lvbjogc2V0RGVmYXVsdHMoZW5naW5lLnZlcnNpb24pLFxuICAgIG9zTmFtZTogc2V0RGVmYXVsdHMob3MubmFtZSksXG4gICAgb3NWZXJzaW9uOiBzZXREZWZhdWx0cyhvcy52ZXJzaW9uKSxcbiAgICB1c2VyQWdlbnQ6IHNldERlZmF1bHRzKHVhKVxuICB9O1xufTtcblxudmFyIHR5cGUgPSBjaGVja1R5cGUoZGV2aWNlLnR5cGUpO1xuXG5mdW5jdGlvbiBkZXZpY2VEZXRlY3QoKSB7XG4gIHZhciBpc0Jyb3dzZXIgPSB0eXBlLmlzQnJvd3NlcixcbiAgICAgIGlzTW9iaWxlID0gdHlwZS5pc01vYmlsZSxcbiAgICAgIGlzVGFibGV0ID0gdHlwZS5pc1RhYmxldCxcbiAgICAgIGlzU21hcnRUViA9IHR5cGUuaXNTbWFydFRWLFxuICAgICAgaXNDb25zb2xlID0gdHlwZS5pc0NvbnNvbGUsXG4gICAgICBpc1dlYXJhYmxlID0gdHlwZS5pc1dlYXJhYmxlO1xuXG4gIGlmIChpc0Jyb3dzZXIpIHtcbiAgICByZXR1cm4gYnJvUGF5bG9hZChpc0Jyb3dzZXIsIGJyb3dzZXIsIGVuZ2luZSwgb3MsIHVhKTtcbiAgfVxuXG4gIGlmIChpc1NtYXJ0VFYpIHtcbiAgICByZXR1cm4gc3R2UGF5bG9hZChpc1NtYXJ0VFYsIGVuZ2luZSwgb3MsIHVhKTtcbiAgfVxuXG4gIGlmIChpc0NvbnNvbGUpIHtcbiAgICByZXR1cm4gY29uc29sZVBheWxvYWQoaXNDb25zb2xlLCBlbmdpbmUsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNNb2JpbGUpIHtcbiAgICByZXR1cm4gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNUYWJsZXQpIHtcbiAgICByZXR1cm4gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNXZWFyYWJsZSkge1xuICAgIHJldHVybiB3ZWFyUGF5bG9hZChpc1dlYXJhYmxlLCBlbmdpbmUsIG9zLCB1YSk7XG4gIH1cbn1cblxudmFyIGlzTW9iaWxlVHlwZSA9IGZ1bmN0aW9uIGlzTW9iaWxlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5Nb2JpbGU7XG59O1xuXG52YXIgaXNUYWJsZXRUeXBlID0gZnVuY3Rpb24gaXNUYWJsZXRUeXBlKCkge1xuICByZXR1cm4gZGV2aWNlLnR5cGUgPT09IERldmljZVR5cGVzLlRhYmxldDtcbn07XG5cbnZhciBpc01vYmlsZUFuZFRhYmxldFR5cGUgPSBmdW5jdGlvbiBpc01vYmlsZUFuZFRhYmxldFR5cGUoKSB7XG4gIHN3aXRjaCAoZGV2aWNlLnR5cGUpIHtcbiAgICBjYXNlIERldmljZVR5cGVzLk1vYmlsZTpcbiAgICBjYXNlIERldmljZVR5cGVzLlRhYmxldDpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGlzRWRnZUNocm9taXVtVHlwZSA9IGZ1bmN0aW9uIGlzRWRnZUNocm9taXVtVHlwZSgpIHtcbiAgcmV0dXJuIHR5cGVvZiB1YSA9PT0gJ3N0cmluZycgJiYgdWEuaW5kZXhPZignRWRnLycpICE9PSAtMTtcbn07XG5cbnZhciBpc1NtYXJ0VFZUeXBlID0gZnVuY3Rpb24gaXNTbWFydFRWVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5TbWFydFR2O1xufTtcblxudmFyIGlzQnJvd3NlclR5cGUgPSBmdW5jdGlvbiBpc0Jyb3dzZXJUeXBlKCkge1xuICByZXR1cm4gZGV2aWNlLnR5cGUgPT09IERldmljZVR5cGVzLkJyb3dzZXI7XG59O1xuXG52YXIgaXNXZWFyYWJsZVR5cGUgPSBmdW5jdGlvbiBpc1dlYXJhYmxlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5XZWFyYWJsZTtcbn07XG5cbnZhciBpc0NvbnNvbGVUeXBlID0gZnVuY3Rpb24gaXNDb25zb2xlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5Db25zb2xlO1xufTtcblxudmFyIGlzQW5kcm9pZFR5cGUgPSBmdW5jdGlvbiBpc0FuZHJvaWRUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5BbmRyb2lkO1xufTtcblxudmFyIGlzV2luZG93c1R5cGUgPSBmdW5jdGlvbiBpc1dpbmRvd3NUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5XaW5kb3dzO1xufTtcblxudmFyIGlzTWFjT3NUeXBlID0gZnVuY3Rpb24gaXNNYWNPc1R5cGUoKSB7XG4gIHJldHVybiBvcy5uYW1lID09PSBPc1R5cGVzLk1BQ19PUztcbn07XG5cbnZhciBpc1dpblBob25lVHlwZSA9IGZ1bmN0aW9uIGlzV2luUGhvbmVUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5XaW5kb3dzUGhvbmU7XG59O1xuXG52YXIgaXNJT1NUeXBlID0gZnVuY3Rpb24gaXNJT1NUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5JT1M7XG59O1xuXG52YXIgaXNDaHJvbWVUeXBlID0gZnVuY3Rpb24gaXNDaHJvbWVUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuQ2hyb21lO1xufTtcblxudmFyIGlzRmlyZWZveFR5cGUgPSBmdW5jdGlvbiBpc0ZpcmVmb3hUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuRmlyZWZveDtcbn07XG5cbnZhciBpc0Nocm9taXVtVHlwZSA9IGZ1bmN0aW9uIGlzQ2hyb21pdW1UeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuQ2hyb21pdW07XG59O1xuXG52YXIgaXNFZGdlVHlwZSA9IGZ1bmN0aW9uIGlzRWRnZVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5FZGdlO1xufTtcblxudmFyIGlzWWFuZGV4VHlwZSA9IGZ1bmN0aW9uIGlzWWFuZGV4VHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLllhbmRleDtcbn07XG5cbnZhciBpc1NhZmFyaVR5cGUgPSBmdW5jdGlvbiBpc1NhZmFyaVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5TYWZhcmkgfHwgYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuTW9iaWxlU2FmYXJpO1xufTtcblxudmFyIGlzTW9iaWxlU2FmYXJpVHlwZSA9IGZ1bmN0aW9uIGlzTW9iaWxlU2FmYXJpVHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLk1vYmlsZVNhZmFyaTtcbn07XG5cbnZhciBpc09wZXJhVHlwZSA9IGZ1bmN0aW9uIGlzT3BlcmFUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuT3BlcmE7XG59O1xuXG52YXIgaXNJRVR5cGUgPSBmdW5jdGlvbiBpc0lFVHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLkludGVybmV0RXhwbG9yZXIgfHwgYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuSWU7XG59O1xuXG52YXIgaXNNSVVJVHlwZSA9IGZ1bmN0aW9uIGlzTUlVSVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5NSVVJO1xufTtcblxudmFyIGlzU2Ftc3VuZ0Jyb3dzZXJUeXBlID0gZnVuY3Rpb24gaXNTYW1zdW5nQnJvd3NlclR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5TYW1zdW5nQnJvd3Nlcjtcbn07XG5cbnZhciBpc0VsZWN0cm9uVHlwZSA9IGZ1bmN0aW9uIGlzRWxlY3Ryb25UeXBlKCkge1xuICB2YXIgbmF2ID0gZ2V0TmF2aWdhdG9ySW5zdGFuY2UoKTtcbiAgdmFyIHVhID0gbmF2ICYmIG5hdi51c2VyQWdlbnQgJiYgbmF2LnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdHlwZW9mIHVhID09PSAnc3RyaW5nJyA/IC9lbGVjdHJvbi8udGVzdCh1YSkgOiBmYWxzZTtcbn07XG5cbnZhciBnZXRJT1MxMyA9IGZ1bmN0aW9uIGdldElPUzEzKCkge1xuICB2YXIgbmF2ID0gZ2V0TmF2aWdhdG9ySW5zdGFuY2UoKTtcbiAgcmV0dXJuIG5hdiAmJiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2LnBsYXRmb3JtKSB8fCBuYXYucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMSkgJiYgIXdpbmRvdy5NU1N0cmVhbTtcbn07XG5cbnZhciBnZXRJUGFkMTMgPSBmdW5jdGlvbiBnZXRJUGFkMTMoKSB7XG4gIHJldHVybiBpc0lPUzEzQ2hlY2soJ2lQYWQnKTtcbn07XG5cbnZhciBnZXRJcGhvbmUxMyA9IGZ1bmN0aW9uIGdldElwaG9uZTEzKCkge1xuICByZXR1cm4gaXNJT1MxM0NoZWNrKCdpUGhvbmUnKTtcbn07XG5cbnZhciBnZXRJUG9kMTMgPSBmdW5jdGlvbiBnZXRJUG9kMTMoKSB7XG4gIHJldHVybiBpc0lPUzEzQ2hlY2soJ2lQb2QnKTtcbn07XG5cbnZhciBnZXRCcm93c2VyRnVsbFZlcnNpb24gPSBmdW5jdGlvbiBnZXRCcm93c2VyRnVsbFZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhicm93c2VyLnZlcnNpb24pO1xufTtcblxudmFyIGdldEJyb3dzZXJWZXJzaW9uID0gZnVuY3Rpb24gZ2V0QnJvd3NlclZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhicm93c2VyLm1ham9yKTtcbn07XG5cbnZhciBnZXRPc1ZlcnNpb24gPSBmdW5jdGlvbiBnZXRPc1ZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhvcy52ZXJzaW9uKTtcbn07XG5cbnZhciBnZXRPc05hbWUgPSBmdW5jdGlvbiBnZXRPc05hbWUoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhvcy5uYW1lKTtcbn07XG5cbnZhciBnZXRCcm93c2VyTmFtZSA9IGZ1bmN0aW9uIGdldEJyb3dzZXJOYW1lKCkge1xuICByZXR1cm4gc2V0RGVmYXVsdHMoYnJvd3Nlci5uYW1lKTtcbn07XG5cbnZhciBnZXRNb2JpbGVWZW5kb3IgPSBmdW5jdGlvbiBnZXRNb2JpbGVWZW5kb3IoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhkZXZpY2UudmVuZG9yKTtcbn07XG5cbnZhciBnZXRNb2JpbGVNb2RlbCA9IGZ1bmN0aW9uIGdldE1vYmlsZU1vZGVsKCkge1xuICByZXR1cm4gc2V0RGVmYXVsdHMoZGV2aWNlLm1vZGVsKTtcbn07XG5cbnZhciBnZXRFbmdpbmVOYW1lID0gZnVuY3Rpb24gZ2V0RW5naW5lTmFtZSgpIHtcbiAgcmV0dXJuIHNldERlZmF1bHRzKGVuZ2luZS5uYW1lKTtcbn07XG5cbnZhciBnZXRFbmdpbmVWZXJzaW9uID0gZnVuY3Rpb24gZ2V0RW5naW5lVmVyc2lvbigpIHtcbiAgcmV0dXJuIHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKTtcbn07XG5cbnZhciBnZXRVc2VyYWdlbnQgPSBmdW5jdGlvbiBnZXRVc2VyYWdlbnQoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyh1YSk7XG59O1xuXG52YXIgZ2V0RGV2aWNlVHlwZSA9IGZ1bmN0aW9uIGdldERldmljZVR5cGUoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhkZXZpY2UudHlwZSwgJ2Jyb3dzZXInKTtcbn07XG5cbnZhciBpc1NtYXJ0VFYgPSBpc1NtYXJ0VFZUeXBlKCk7XG52YXIgaXNDb25zb2xlID0gaXNDb25zb2xlVHlwZSgpO1xudmFyIGlzV2VhcmFibGUgPSBpc1dlYXJhYmxlVHlwZSgpO1xudmFyIGlzTW9iaWxlU2FmYXJpID0gaXNNb2JpbGVTYWZhcmlUeXBlKCkgfHwgZ2V0SVBhZDEzKCk7XG52YXIgaXNDaHJvbWl1bSA9IGlzQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNNb2JpbGUgPSBpc01vYmlsZUFuZFRhYmxldFR5cGUoKSB8fCBnZXRJUGFkMTMoKTtcbnZhciBpc01vYmlsZU9ubHkgPSBpc01vYmlsZVR5cGUoKTtcbnZhciBpc1RhYmxldCA9IGlzVGFibGV0VHlwZSgpIHx8IGdldElQYWQxMygpO1xudmFyIGlzQnJvd3NlciA9IGlzQnJvd3NlclR5cGUoKTtcbnZhciBpc0Rlc2t0b3AgPSBpc0Jyb3dzZXJUeXBlKCk7XG52YXIgaXNBbmRyb2lkID0gaXNBbmRyb2lkVHlwZSgpO1xudmFyIGlzV2luUGhvbmUgPSBpc1dpblBob25lVHlwZSgpO1xudmFyIGlzSU9TID0gaXNJT1NUeXBlKCkgfHwgZ2V0SVBhZDEzKCk7XG52YXIgaXNDaHJvbWUgPSBpc0Nocm9tZVR5cGUoKTtcbnZhciBpc0ZpcmVmb3ggPSBpc0ZpcmVmb3hUeXBlKCk7XG52YXIgaXNTYWZhcmkgPSBpc1NhZmFyaVR5cGUoKTtcbnZhciBpc09wZXJhID0gaXNPcGVyYVR5cGUoKTtcbnZhciBpc0lFID0gaXNJRVR5cGUoKTtcbnZhciBvc1ZlcnNpb24gPSBnZXRPc1ZlcnNpb24oKTtcbnZhciBvc05hbWUgPSBnZXRPc05hbWUoKTtcbnZhciBmdWxsQnJvd3NlclZlcnNpb24gPSBnZXRCcm93c2VyRnVsbFZlcnNpb24oKTtcbnZhciBicm93c2VyVmVyc2lvbiA9IGdldEJyb3dzZXJWZXJzaW9uKCk7XG52YXIgYnJvd3Nlck5hbWUgPSBnZXRCcm93c2VyTmFtZSgpO1xudmFyIG1vYmlsZVZlbmRvciA9IGdldE1vYmlsZVZlbmRvcigpO1xudmFyIG1vYmlsZU1vZGVsID0gZ2V0TW9iaWxlTW9kZWwoKTtcbnZhciBlbmdpbmVOYW1lID0gZ2V0RW5naW5lTmFtZSgpO1xudmFyIGVuZ2luZVZlcnNpb24gPSBnZXRFbmdpbmVWZXJzaW9uKCk7XG52YXIgZ2V0VUEgPSBnZXRVc2VyYWdlbnQoKTtcbnZhciBpc0VkZ2UgPSBpc0VkZ2VUeXBlKCkgfHwgaXNFZGdlQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNZYW5kZXggPSBpc1lhbmRleFR5cGUoKTtcbnZhciBkZXZpY2VUeXBlID0gZ2V0RGV2aWNlVHlwZSgpO1xudmFyIGlzSU9TMTMgPSBnZXRJT1MxMygpO1xudmFyIGlzSVBhZDEzID0gZ2V0SVBhZDEzKCk7XG52YXIgaXNJUGhvbmUxMyA9IGdldElwaG9uZTEzKCk7XG52YXIgaXNJUG9kMTMgPSBnZXRJUG9kMTMoKTtcbnZhciBpc0VsZWN0cm9uID0gaXNFbGVjdHJvblR5cGUoKTtcbnZhciBpc0VkZ2VDaHJvbWl1bSA9IGlzRWRnZUNocm9taXVtVHlwZSgpO1xudmFyIGlzTGVnYWN5RWRnZSA9IGlzRWRnZVR5cGUoKSAmJiAhaXNFZGdlQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNXaW5kb3dzID0gaXNXaW5kb3dzVHlwZSgpO1xudmFyIGlzTWFjT3MgPSBpc01hY09zVHlwZSgpO1xudmFyIGlzTUlVSSA9IGlzTUlVSVR5cGUoKTtcbnZhciBpc1NhbXN1bmdCcm93c2VyID0gaXNTYW1zdW5nQnJvd3NlclR5cGUoKTtcblxudmFyIEFuZHJvaWRWaWV3ID0gZnVuY3Rpb24gQW5kcm9pZFZpZXcoX3JlZikge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZi5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZi52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc0FuZHJvaWQgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBCcm93c2VyVmlldyA9IGZ1bmN0aW9uIEJyb3dzZXJWaWV3KF9yZWYyKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMi5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYyLmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWYyLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNCcm93c2VyID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgSUVWaWV3ID0gZnVuY3Rpb24gSUVWaWV3KF9yZWYzKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMy5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYzLmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWYzLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYzLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNJRSA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIElPU1ZpZXcgPSBmdW5jdGlvbiBJT1NWaWV3KF9yZWY0KSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmNC5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY0LmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWY0LnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWY0LnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjQsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNJT1MgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBNb2JpbGVWaWV3ID0gZnVuY3Rpb24gTW9iaWxlVmlldyhfcmVmNSkge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjUucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmNS5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmNS52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmNS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY1LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzTW9iaWxlID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgVGFibGV0VmlldyA9IGZ1bmN0aW9uIFRhYmxldFZpZXcoX3JlZjYpIHtcbiAgdmFyIHJlbmRlcldpdGhGcmFnbWVudCA9IF9yZWY2LnJlbmRlcldpdGhGcmFnbWVudCxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjYuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjYudmlld0NsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZjYuc3R5bGUsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNiwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc1RhYmxldCA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIFdpblBob25lVmlldyA9IGZ1bmN0aW9uIFdpblBob25lVmlldyhfcmVmNykge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjcucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmNy5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmNy52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmNy5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY3LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzV2luUGhvbmUgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBNb2JpbGVPbmx5VmlldyA9IGZ1bmN0aW9uIE1vYmlsZU9ubHlWaWV3KF9yZWY4KSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmOC5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY4LmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWY4LnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWY4LnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjgsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNNb2JpbGVPbmx5ID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgU21hcnRUVlZpZXcgPSBmdW5jdGlvbiBTbWFydFRWVmlldyhfcmVmOSkge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjkucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmOS5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmOS52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmOS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY5LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzU21hcnRUViA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIENvbnNvbGVWaWV3ID0gZnVuY3Rpb24gQ29uc29sZVZpZXcoX3JlZjEwKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTAucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTAuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjEwLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMC5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYxMCwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc0NvbnNvbGUgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBXZWFyYWJsZVZpZXcgPSBmdW5jdGlvbiBXZWFyYWJsZVZpZXcoX3JlZjExKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTEucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTEuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjExLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYxMSwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc1dlYXJhYmxlID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgQ3VzdG9tVmlldyA9IGZ1bmN0aW9uIEN1c3RvbVZpZXcoX3JlZjEyKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTIucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTIuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjEyLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMi5zdHlsZSxcbiAgICAgIGNvbmRpdGlvbiA9IF9yZWYxMi5jb25kaXRpb24sXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMTIsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY29uZGl0aW9uXCJdKTtcblxuICByZXR1cm4gY29uZGl0aW9uID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB3aXRoT3JpZW50YXRpb25DaGFuZ2UoV3JhcHBlZENvbXBvbmVudCkge1xuICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKF9jbGFzcywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBfY2xhc3MocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzcyk7XG5cbiAgICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKF9jbGFzcykuY2FsbCh0aGlzLCBwcm9wcykpO1xuICAgICAgX3RoaXMuaXNFdmVudExpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzLmhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlID0gX3RoaXMuaGFuZGxlT3JpZW50YXRpb25DaGFuZ2UuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgICBfdGhpcy5vbk9yaWVudGF0aW9uQ2hhbmdlID0gX3RoaXMub25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICAgIF90aGlzLm9uUGFnZUxvYWQgPSBfdGhpcy5vblBhZ2VMb2FkLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgaXNQb3J0cmFpdDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKF9jbGFzcywgW3tcbiAgICAgIGtleTogXCJoYW5kbGVPcmllbnRhdGlvbkNoYW5nZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFdmVudExpc3RlbmVyQWRkZWQpIHtcbiAgICAgICAgICB0aGlzLmlzRXZlbnRMaXN0ZW5lckFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmllbnRhdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoID4gd2luZG93LmlubmVySGVpZ2h0ID8gOTAgOiAwO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc1BvcnRyYWl0OiBvcmllbnRhdGlvbiA9PT0gMCxcbiAgICAgICAgICBpc0xhbmRzY2FwZTogb3JpZW50YXRpb24gPT09IDkwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJvbk9yaWVudGF0aW9uQ2hhbmdlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb25PcmllbnRhdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJvblBhZ2VMb2FkXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb25QYWdlTG9hZCgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAoKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZih3aW5kb3cpKSAhPT0gdW5kZWZpbmVkICYmIGlzTW9iaWxlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzRXZlbnRMaXN0ZW5lckFkZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgdGhpcy5vblBhZ2VMb2FkLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLCB0aGlzLm9uUGFnZUxvYWQsIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICAgIGlzTGFuZHNjYXBlOiB0aGlzLnN0YXRlLmlzTGFuZHNjYXBlLFxuICAgICAgICAgIGlzUG9ydHJhaXQ6IHRoaXMuc3RhdGUuaXNQb3J0cmFpdFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIF9jbGFzcztcbiAgfShSZWFjdF9fZGVmYXVsdC5Db21wb25lbnQpO1xufVxuXG5leHBvcnRzLkFuZHJvaWRWaWV3ID0gQW5kcm9pZFZpZXc7XG5leHBvcnRzLkJyb3dzZXJUeXBlcyA9IEJyb3dzZXJUeXBlcztcbmV4cG9ydHMuQnJvd3NlclZpZXcgPSBCcm93c2VyVmlldztcbmV4cG9ydHMuQ29uc29sZVZpZXcgPSBDb25zb2xlVmlldztcbmV4cG9ydHMuQ3VzdG9tVmlldyA9IEN1c3RvbVZpZXc7XG5leHBvcnRzLklFVmlldyA9IElFVmlldztcbmV4cG9ydHMuSU9TVmlldyA9IElPU1ZpZXc7XG5leHBvcnRzLk1vYmlsZU9ubHlWaWV3ID0gTW9iaWxlT25seVZpZXc7XG5leHBvcnRzLk1vYmlsZVZpZXcgPSBNb2JpbGVWaWV3O1xuZXhwb3J0cy5Pc1R5cGVzID0gT3NUeXBlcztcbmV4cG9ydHMuU21hcnRUVlZpZXcgPSBTbWFydFRWVmlldztcbmV4cG9ydHMuVGFibGV0VmlldyA9IFRhYmxldFZpZXc7XG5leHBvcnRzLldlYXJhYmxlVmlldyA9IFdlYXJhYmxlVmlldztcbmV4cG9ydHMuV2luUGhvbmVWaWV3ID0gV2luUGhvbmVWaWV3O1xuZXhwb3J0cy5icm93c2VyTmFtZSA9IGJyb3dzZXJOYW1lO1xuZXhwb3J0cy5icm93c2VyVmVyc2lvbiA9IGJyb3dzZXJWZXJzaW9uO1xuZXhwb3J0cy5kZXZpY2VEZXRlY3QgPSBkZXZpY2VEZXRlY3Q7XG5leHBvcnRzLmRldmljZVR5cGUgPSBkZXZpY2VUeXBlO1xuZXhwb3J0cy5lbmdpbmVOYW1lID0gZW5naW5lTmFtZTtcbmV4cG9ydHMuZW5naW5lVmVyc2lvbiA9IGVuZ2luZVZlcnNpb247XG5leHBvcnRzLmZ1bGxCcm93c2VyVmVyc2lvbiA9IGZ1bGxCcm93c2VyVmVyc2lvbjtcbmV4cG9ydHMuZ2V0VUEgPSBnZXRVQTtcbmV4cG9ydHMuaXNBbmRyb2lkID0gaXNBbmRyb2lkO1xuZXhwb3J0cy5pc0Jyb3dzZXIgPSBpc0Jyb3dzZXI7XG5leHBvcnRzLmlzQ2hyb21lID0gaXNDaHJvbWU7XG5leHBvcnRzLmlzQ2hyb21pdW0gPSBpc0Nocm9taXVtO1xuZXhwb3J0cy5pc0NvbnNvbGUgPSBpc0NvbnNvbGU7XG5leHBvcnRzLmlzRGVza3RvcCA9IGlzRGVza3RvcDtcbmV4cG9ydHMuaXNFZGdlID0gaXNFZGdlO1xuZXhwb3J0cy5pc0VkZ2VDaHJvbWl1bSA9IGlzRWRnZUNocm9taXVtO1xuZXhwb3J0cy5pc0VsZWN0cm9uID0gaXNFbGVjdHJvbjtcbmV4cG9ydHMuaXNGaXJlZm94ID0gaXNGaXJlZm94O1xuZXhwb3J0cy5pc0lFID0gaXNJRTtcbmV4cG9ydHMuaXNJT1MgPSBpc0lPUztcbmV4cG9ydHMuaXNJT1MxMyA9IGlzSU9TMTM7XG5leHBvcnRzLmlzSVBhZDEzID0gaXNJUGFkMTM7XG5leHBvcnRzLmlzSVBob25lMTMgPSBpc0lQaG9uZTEzO1xuZXhwb3J0cy5pc0lQb2QxMyA9IGlzSVBvZDEzO1xuZXhwb3J0cy5pc0xlZ2FjeUVkZ2UgPSBpc0xlZ2FjeUVkZ2U7XG5leHBvcnRzLmlzTUlVSSA9IGlzTUlVSTtcbmV4cG9ydHMuaXNNYWNPcyA9IGlzTWFjT3M7XG5leHBvcnRzLmlzTW9iaWxlID0gaXNNb2JpbGU7XG5leHBvcnRzLmlzTW9iaWxlT25seSA9IGlzTW9iaWxlT25seTtcbmV4cG9ydHMuaXNNb2JpbGVTYWZhcmkgPSBpc01vYmlsZVNhZmFyaTtcbmV4cG9ydHMuaXNPcGVyYSA9IGlzT3BlcmE7XG5leHBvcnRzLmlzU2FmYXJpID0gaXNTYWZhcmk7XG5leHBvcnRzLmlzU2Ftc3VuZ0Jyb3dzZXIgPSBpc1NhbXN1bmdCcm93c2VyO1xuZXhwb3J0cy5pc1NtYXJ0VFYgPSBpc1NtYXJ0VFY7XG5leHBvcnRzLmlzVGFibGV0ID0gaXNUYWJsZXQ7XG5leHBvcnRzLmlzV2VhcmFibGUgPSBpc1dlYXJhYmxlO1xuZXhwb3J0cy5pc1dpblBob25lID0gaXNXaW5QaG9uZTtcbmV4cG9ydHMuaXNXaW5kb3dzID0gaXNXaW5kb3dzO1xuZXhwb3J0cy5pc1lhbmRleCA9IGlzWWFuZGV4O1xuZXhwb3J0cy5tb2JpbGVNb2RlbCA9IG1vYmlsZU1vZGVsO1xuZXhwb3J0cy5tb2JpbGVWZW5kb3IgPSBtb2JpbGVWZW5kb3I7XG5leHBvcnRzLm9zTmFtZSA9IG9zTmFtZTtcbmV4cG9ydHMub3NWZXJzaW9uID0gb3NWZXJzaW9uO1xuZXhwb3J0cy53aXRoT3JpZW50YXRpb25DaGFuZ2UgPSB3aXRoT3JpZW50YXRpb25DaGFuZ2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1677\n')},4889:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_RESULT__;/*!@license\n * UAParser.js v0.7.28\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2021 Faisal Salman \n * Licensed under MIT License\n */\n(function (window, undefined) {\n "use strict";\n\n var LIBVERSION = "0.7.28",\n EMPTY = "",\n UNKNOWN = "?",\n FUNC_TYPE = "function",\n UNDEF_TYPE = "undefined",\n OBJ_TYPE = "object",\n STR_TYPE = "string",\n MAJOR = "major",\n MODEL = "model",\n NAME = "name",\n TYPE = "type",\n VENDOR = "vendor",\n VERSION = "version",\n ARCHITECTURE = "architecture",\n CONSOLE = "console",\n MOBILE = "mobile",\n TABLET = "tablet",\n SMARTTV = "smarttv",\n WEARABLE = "wearable",\n EMBEDDED = "embedded",\n UA_MAX_LENGTH = 255;\n var util = {\n extend: function extend(regexes, extensions) {\n var mergedRegexes = {};\n\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n\n return mergedRegexes;\n },\n has: function has(str1, str2) {\n return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;\n },\n lowerize: function lowerize(str) {\n return str.toLowerCase();\n },\n major: function major(version) {\n return typeof version === STR_TYPE ? version.replace(/[^\\d\\.]/g, "").split(".")[0] : undefined;\n },\n trim: function trim(str, len) {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, "");\n return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n var mapper = {\n rgx: function rgx(ua, arrays) {\n var i = 0,\n j,\n k,\n p,\n q,\n matches,\n match;\n\n while (i < arrays.length && !matches) {\n var regex = arrays[i],\n props = arrays[i + 1];\n j = k = 0;\n\n while (j < regex.length && !matches) {\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length == 2) {\n if (typeof q[1] == FUNC_TYPE) {\n this[q[0]] = q[1].call(this, match);\n } else {\n this[q[0]] = q[1];\n }\n } else if (q.length == 3) {\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n\n i += 2;\n }\n },\n str: function str(_str, map) {\n for (var i in map) {\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (util.has(map[i][j], _str)) {\n return i === UNKNOWN ? undefined : i;\n }\n }\n } else if (util.has(map[i], _str)) {\n return i === UNKNOWN ? undefined : i;\n }\n }\n\n return _str;\n }\n };\n var maps = {\n browser: {\n oldSafari: {\n version: {\n "1.0": "/8",\n 1.2: "/1",\n 1.3: "/3",\n "2.0": "/412",\n "2.0.2": "/416",\n "2.0.3": "/417",\n "2.0.4": "/419",\n "?": "/"\n }\n },\n oldEdge: {\n version: {\n .1: "12.",\n 21: "13.",\n 31: "14.",\n 39: "15.",\n 41: "16.",\n 42: "17.",\n 44: "18."\n }\n }\n },\n os: {\n windows: {\n version: {\n ME: "4.90",\n "NT 3.11": "NT3.51",\n "NT 4.0": "NT4.0",\n 2e3: "NT 5.0",\n XP: ["NT 5.1", "NT 5.2"],\n Vista: "NT 6.0",\n 7: "NT 6.1",\n 8: "NT 6.2",\n 8.1: "NT 6.3",\n 10: ["NT 6.4", "NT 10.0"],\n RT: "ARM"\n }\n }\n }\n };\n var regexes = {\n browser: [[/\\b(?:crmo|crios)\\/([\\w\\.]+)/i], [VERSION, [NAME, "Chrome"]], [/(?:edge|edgios|edga|edg)\\/([\\w\\.]+)/i], [VERSION, [NAME, "Edge"]], [/(opera\\smini)\\/([\\w\\.-]+)/i, /(opera\\s[mobiletab]{3,6})\\b.+version\\/([\\w\\.-]+)/i, /(opera)(?:.+version\\/|[\\/\\s]+)([\\w\\.]+)/i], [NAME, VERSION], [/opios[\\/\\s]+([\\w\\.]+)/i], [VERSION, [NAME, "Opera Mini"]], [/\\sopr\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera"]], [/(kindle)\\/([\\w\\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i, /(avant\\s|iemobile|slim)(?:browser)?[\\/\\s]?([\\w\\.]*)/i, /(ba?idubrowser)[\\/\\s]?([\\w\\.]+)/i, /(?:ms|\\()(ie)\\s([\\w\\.]+)/i, /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\\/([\\w\\.-]+)/i, /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([\\w\\.]+)/i, /(weibo)__([\\d\\.]+)/i], [NAME, VERSION], [/(?:[\\s\\/]uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i], [VERSION, [NAME, "UCBrowser"]], [/(?:windowswechat)?\\sqbcore\\/([\\w\\.]+)\\b.*(?:windowswechat)?/i], [VERSION, [NAME, "WeChat(Win) Desktop"]], [/micromessenger\\/([\\w\\.]+)/i], [VERSION, [NAME, "WeChat"]], [/konqueror\\/([\\w\\.]+)/i], [VERSION, [NAME, "Konqueror"]], [/trident.+rv[:\\s]([\\w\\.]{1,9})\\b.+like\\sgecko/i], [VERSION, [NAME, "IE"]], [/yabrowser\\/([\\w\\.]+)/i], [VERSION, [NAME, "Yandex"]], [/(avast|avg)\\/([\\w\\.]+)/i], [[NAME, /(.+)/, "$1 Secure Browser"], VERSION], [/focus\\/([\\w\\.]+)/i], [VERSION, [NAME, "Firefox Focus"]], [/opt\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera Touch"]], [/coc_coc_browser\\/([\\w\\.]+)/i], [VERSION, [NAME, "Coc Coc"]], [/dolfin\\/([\\w\\.]+)/i], [VERSION, [NAME, "Dolphin"]], [/coast\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera Coast"]], [/xiaomi\\/miuibrowser\\/([\\w\\.]+)/i], [VERSION, [NAME, "MIUI Browser"]], [/fxios\\/([\\w\\.-]+)/i], [VERSION, [NAME, "Firefox"]], [/(qihu|qhbrowser|qihoobrowser|360browser)/i], [[NAME, "360 Browser"]], [/(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i], [[NAME, /(.+)/, "$1 Browser"], VERSION], [/(comodo_dragon)\\/([\\w\\.]+)/i], [[NAME, /_/g, " "], VERSION], [/\\s(electron)\\/([\\w\\.]+)\\ssafari/i, /(tesla)(?:\\sqtcarbrowser|\\/(20[12]\\d\\.[\\w\\.-]+))/i, /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/\\s]?([\\w\\.]+)/i], [NAME, VERSION], [/(MetaSr)[\\/\\s]?([\\w\\.]+)/i, /(LBBROWSER)/i], [NAME], [/;fbav\\/([\\w\\.]+);/i], [VERSION, [NAME, "Facebook"]], [/FBAN\\/FBIOS|FB_IAB\\/FB4A/i], [[NAME, "Facebook"]], [/safari\\s(line)\\/([\\w\\.]+)/i, /\\b(line)\\/([\\w\\.]+)\\/iab/i, /(chromium|instagram)[\\/\\s]([\\w\\.-]+)/i], [NAME, VERSION], [/\\bgsa\\/([\\w\\.]+)\\s.*safari\\//i], [VERSION, [NAME, "GSA"]], [/headlesschrome(?:\\/([\\w\\.]+)|\\s)/i], [VERSION, [NAME, "Chrome Headless"]], [/\\swv\\).+(chrome)\\/([\\w\\.]+)/i], [[NAME, "Chrome WebView"], VERSION], [/droid.+\\sversion\\/([\\w\\.]+)\\b.+(?:mobile\\ssafari|safari)/i], [VERSION, [NAME, "Android Browser"]], [/(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i], [NAME, VERSION], [/version\\/([\\w\\.]+)\\s.*mobile\\/\\w+\\s(safari)/i], [VERSION, [NAME, "Mobile Safari"]], [/version\\/([\\w\\.]+)\\s.*(mobile\\s?safari|safari)/i], [VERSION, NAME], [/webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [/(webkit|khtml)\\/([\\w\\.]+)/i], [NAME, VERSION], [/(navigator|netscape)\\/([\\w\\.-]+)/i], [[NAME, "Netscape"], VERSION], [/ile\\svr;\\srv:([\\w\\.]+)\\).+firefox/i], [VERSION, [NAME, "Firefox Reality"]], [/ekiohf.+(flow)\\/([\\w\\.]+)/i, /(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i, /(firefox)\\/([\\w\\.]+)\\s[\\w\\s\\-]+\\/[\\w\\.]+$/i, /(mozilla)\\/([\\w\\.]+)\\s.+rv\\:.+gecko\\/\\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i, /(links)\\s\\(([\\w\\.]+)/i, /(gobrowser)\\/?([\\w\\.]*)/i, /(ice\\s?browser)\\/v?([\\w\\._]+)/i, /(mosaic)[\\/\\s]([\\w\\.]+)/i], [NAME, VERSION]],\n cpu: [[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i], [[ARCHITECTURE, "amd64"]], [/(ia32(?=;))/i], [[ARCHITECTURE, util.lowerize]], [/((?:i[346]|x)86)[;\\)]/i], [[ARCHITECTURE, "ia32"]], [/\\b(aarch64|armv?8e?l?)\\b/i], [[ARCHITECTURE, "arm64"]], [/\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i], [[ARCHITECTURE, "armhf"]], [/windows\\s(ce|mobile);\\sppc;/i], [[ARCHITECTURE, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i], [[ARCHITECTURE, /ower/, "", util.lowerize]], [/(sun4\\w)[;\\)]/i], [[ARCHITECTURE, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i], [[ARCHITECTURE, util.lowerize]]],\n device: [[/\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus\\s10)/i], [MODEL, [VENDOR, "Samsung"], [TYPE, TABLET]], [/\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy\\snexus)/i, /\\ssamsung[\\s-]([\\w-]+)/i, /sec-(sgh\\w+)/i], [MODEL, [VENDOR, "Samsung"], [TYPE, MOBILE]], [/\\((ip(?:hone|od)[\\s\\w]*);/i], [MODEL, [VENDOR, "Apple"], [TYPE, MOBILE]], [/\\((ipad);[\\w\\s\\),;-]+apple/i, /applecoremedia\\/[\\w\\.]+\\s\\((ipad)/i, /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i], [MODEL, [VENDOR, "Apple"], [TYPE, TABLET]], [/\\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\\d{2})/i], [MODEL, [VENDOR, "Huawei"], [TYPE, TABLET]], [/d\\/huawei([\\w\\s-]+)[;\\)]/i, /\\b(nexus\\s6p|vog-[at]?l\\d\\d|ane-[at]?l[x\\d]\\d|eml-a?l\\d\\da?|lya-[at]?l\\d[\\dc]|clt-a?l\\d\\di?|ele-l\\d\\d)/i, /\\b(\\w{2,4}-[atu][ln][01259][019])[;\\)\\s]/i], [MODEL, [VENDOR, "Huawei"], [TYPE, MOBILE]], [/\\b(poco[\\s\\w]+)(?:\\sbuild|\\))/i, /\\b;\\s(\\w+)\\sbuild\\/hm\\1/i, /\\b(hm[\\s\\-_]?note?[\\s_]?(?:\\d\\w)?)\\sbuild/i, /\\b(redmi[\\s\\-_]?(?:note|k)?[\\w\\s_]+)(?:\\sbuild|\\))/i, /\\b(mi[\\s\\-_]?(?:a\\d|one|one[\\s_]plus|note lte)?[\\s_]?(?:\\d?\\w?)[\\s_]?(?:plus)?)\\sbuild/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, MOBILE]], [/\\b(mi[\\s\\-_]?(?:pad)(?:[\\w\\s_]+))(?:\\sbuild|\\))/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, TABLET]], [/;\\s(\\w+)\\sbuild.+\\soppo/i, /\\s(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i], [MODEL, [VENDOR, "OPPO"], [TYPE, MOBILE]], [/\\svivo\\s(\\w+)(?:\\sbuild|\\))/i, /\\s(v[12]\\d{3}\\w?[at])(?:\\sbuild|;)/i], [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]], [/\\s(rmx[12]\\d{3})(?:\\sbuild|;)/i], [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]], [/\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)\\b[\\w\\s]+build\\//i, /\\smot(?:orola)?[\\s-](\\w*)/i, /((?:moto[\\s\\w\\(\\)]+|xt\\d{3,4}|nexus\\s6)(?=\\sbuild|\\)))/i], [MODEL, [VENDOR, "Motorola"], [TYPE, MOBILE]], [/\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i], [MODEL, [VENDOR, "Motorola"], [TYPE, TABLET]], [/((?=lg)?[vl]k\\-?\\d{3})\\sbuild|\\s3\\.[\\s\\w;-]{10}lg?-([06cv9]{3,4})/i], [MODEL, [VENDOR, "LG"], [TYPE, TABLET]], [/(lm-?f100[nv]?|nexus\\s[45])/i, /lg[e;\\s\\/-]+((?!browser|netcast)\\w+)/i, /\\blg(\\-?[\\d\\w]+)\\sbuild/i], [MODEL, [VENDOR, "LG"], [TYPE, MOBILE]], [/(ideatab[\\w\\-\\s]+)/i, /lenovo\\s?(s(?:5000|6000)(?:[\\w-]+)|tab(?:[\\s\\w]+)|yt[\\d\\w-]{6}|tb[\\d\\w-]{6})/i], [MODEL, [VENDOR, "Lenovo"], [TYPE, TABLET]], [/(?:maemo|nokia).*(n900|lumia\\s\\d+)/i, /nokia[\\s_-]?([\\w\\.-]*)/i], [[MODEL, /_/g, " "], [VENDOR, "Nokia"], [TYPE, MOBILE]], [/droid.+;\\s(pixel\\sc)[\\s)]/i], [MODEL, [VENDOR, "Google"], [TYPE, TABLET]], [/droid.+;\\s(pixel[\\s\\daxl]{0,6})(?:\\sbuild|\\))/i], [MODEL, [VENDOR, "Google"], [TYPE, MOBILE]], [/droid.+\\s([c-g]\\d{4}|so[-l]\\w+|xq-a\\w[4-7][12])(?=\\sbuild\\/|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i], [MODEL, [VENDOR, "Sony"], [TYPE, MOBILE]], [/sony\\stablet\\s[ps]\\sbuild\\//i, /(?:sony)?sgp\\w+(?:\\sbuild\\/|\\))/i], [[MODEL, "Xperia Tablet"], [VENDOR, "Sony"], [TYPE, TABLET]], [/\\s(kb2005|in20[12]5|be20[12][59])\\b/i, /\\ba000(1)\\sbuild/i, /\\boneplus\\s(a\\d{4})[\\s)]/i], [MODEL, [VENDOR, "OnePlus"], [TYPE, MOBILE]], [/(alexa)webm/i, /(kf[a-z]{2}wi)(\\sbuild\\/|\\))/i, /(kf[a-z]+)(\\sbuild\\/|\\)).+silk\\//i], [MODEL, [VENDOR, "Amazon"], [TYPE, TABLET]], [/(sd|kf)[0349hijorstuw]+(\\sbuild\\/|\\)).+silk\\//i], [[MODEL, "Fire Phone"], [VENDOR, "Amazon"], [TYPE, MOBILE]], [/\\((playbook);[\\w\\s\\),;-]+(rim)/i], [MODEL, VENDOR, [TYPE, TABLET]], [/((?:bb[a-f]|st[hv])100-\\d)/i, /\\(bb10;\\s(\\w+)/i], [MODEL, [VENDOR, "BlackBerry"], [TYPE, MOBILE]], [/(?:\\b|asus_)(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus\\s7|padfone|p00[cj])/i], [MODEL, [VENDOR, "ASUS"], [TYPE, TABLET]], [/\\s(z[es]6[027][01][km][ls]|zenfone\\s\\d\\w?)\\b/i], [MODEL, [VENDOR, "ASUS"], [TYPE, MOBILE]], [/(nexus\\s9)/i], [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]], [/(htc)[;_\\s-]{1,2}([\\w\\s]+(?=\\)|\\sbuild)|\\w+)/i, /(zte)-(\\w*)/i, /(alcatel|geeksphone|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i], [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]], [/droid[x\\d\\.\\s;]+\\s([ab][1-7]\\-?[0178a]\\d\\d?)/i], [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]], [/droid.+;\\s(m[1-5]\\snote)\\sbuild/i, /\\bmz-([\\w-]{2,})/i], [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]], [/(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i, /(hp)\\s([\\w\\s]+\\w)/i, /(asus)-?(\\w+)/i, /(microsoft);\\s(lumia[\\s\\w]+)/i, /(lenovo)[_\\s-]?([\\w-]+)/i, /linux;.+(jolla);/i, /droid.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/(archos)\\s(gamepad2?)/i, /(hp).+(touchpad(?!.+tablet)|tablet)/i, /(kindle)\\/([\\w\\.]+)/i, /\\s(nook)[\\w\\s]+build\\/(\\w+)/i, /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i, /[;\\/]\\s?(le[\\s\\-]+pan)[\\s\\-]+(\\w{1,9})\\sbuild/i, /[;\\/]\\s?(trinity)[\\-\\s]*(t\\d{3})\\sbuild/i, /\\b(gigaset)[\\s\\-]+(q\\w{1,9})\\sbuild/i, /\\b(vodafone)\\s([\\w\\s]+)(?:\\)|\\sbuild)/i], [VENDOR, MODEL, [TYPE, TABLET]], [/\\s(surface\\sduo)\\s/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, TABLET]], [/droid\\s[\\d\\.]+;\\s(fp\\du?)\\sbuild/i], [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]], [/\\s(u304aa)\\sbuild/i], [MODEL, [VENDOR, "AT&T"], [TYPE, MOBILE]], [/sie-(\\w*)/i], [MODEL, [VENDOR, "Siemens"], [TYPE, MOBILE]], [/[;\\/]\\s?(rct\\w+)\\sbuild/i], [MODEL, [VENDOR, "RCA"], [TYPE, TABLET]], [/[;\\/\\s](venue[\\d\\s]{2,7})\\sbuild/i], [MODEL, [VENDOR, "Dell"], [TYPE, TABLET]], [/[;\\/]\\s?(q(?:mv|ta)\\w+)\\sbuild/i], [MODEL, [VENDOR, "Verizon"], [TYPE, TABLET]], [/[;\\/]\\s(?:barnes[&\\s]+noble\\s|bn[rt])([\\w\\s\\+]*)\\sbuild/i], [MODEL, [VENDOR, "Barnes & Noble"], [TYPE, TABLET]], [/[;\\/]\\s(tm\\d{3}\\w+)\\sbuild/i], [MODEL, [VENDOR, "NuVision"], [TYPE, TABLET]], [/;\\s(k88)\\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, TABLET]], [/;\\s(nx\\d{3}j)\\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, MOBILE]], [/[;\\/]\\s?(gen\\d{3})\\sbuild.*49h/i], [MODEL, [VENDOR, "Swiss"], [TYPE, MOBILE]], [/[;\\/]\\s?(zur\\d{3})\\sbuild/i], [MODEL, [VENDOR, "Swiss"], [TYPE, TABLET]], [/[;\\/]\\s?((zeki)?tb.*\\b)\\sbuild/i], [MODEL, [VENDOR, "Zeki"], [TYPE, TABLET]], [/[;\\/]\\s([yr]\\d{2})\\sbuild/i, /[;\\/]\\s(dragon[\\-\\s]+touch\\s|dt)(\\w{5})\\sbuild/i], [[VENDOR, "Dragon Touch"], MODEL, [TYPE, TABLET]], [/[;\\/]\\s?(ns-?\\w{0,9})\\sbuild/i], [MODEL, [VENDOR, "Insignia"], [TYPE, TABLET]], [/[;\\/]\\s?((nxa|Next)-?\\w{0,9})\\sbuild/i], [MODEL, [VENDOR, "NextBook"], [TYPE, TABLET]], [/[;\\/]\\s?(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05]))\\sbuild/i], [[VENDOR, "Voice"], MODEL, [TYPE, MOBILE]], [/[;\\/]\\s?(lvtel\\-)?(v1[12])\\sbuild/i], [[VENDOR, "LvTel"], MODEL, [TYPE, MOBILE]], [/;\\s(ph-1)\\s/i], [MODEL, [VENDOR, "Essential"], [TYPE, MOBILE]], [/[;\\/]\\s?(v(100md|700na|7011|917g).*\\b)\\sbuild/i], [MODEL, [VENDOR, "Envizen"], [TYPE, TABLET]], [/[;\\/]\\s?(trio[\\s\\w\\-\\.]+)\\sbuild/i], [MODEL, [VENDOR, "MachSpeed"], [TYPE, TABLET]], [/[;\\/]\\s?tu_(1491)\\sbuild/i], [MODEL, [VENDOR, "Rotor"], [TYPE, TABLET]], [/(shield[\\w\\s]+)\\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, TABLET]], [/(sprint)\\s(\\w+)/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kin\\.[onetw]{3})/i], [[MODEL, /\\./g, " "], [VENDOR, "Microsoft"], [TYPE, MOBILE]], [/droid\\s[\\d\\.]+;\\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, TABLET]], [/droid\\s[\\d\\.]+;\\s(ec30|ps20|tc[2-8]\\d[kx])\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, MOBILE]], [/\\s(ouya)\\s/i, /(nintendo)\\s([wids3utch]+)/i], [VENDOR, MODEL, [TYPE, CONSOLE]], [/droid.+;\\s(shield)\\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, CONSOLE]], [/(playstation\\s[345portablevi]+)/i], [MODEL, [VENDOR, "Sony"], [TYPE, CONSOLE]], [/[\\s\\(;](xbox(?:\\sone)?(?!;\\sxbox))[\\s\\);]/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, CONSOLE]], [/smart-tv.+(samsung)/i], [VENDOR, [TYPE, SMARTTV]], [/hbbtv.+maple;(\\d+)/i], [[MODEL, /^/, "SmartTV"], [VENDOR, "Samsung"], [TYPE, SMARTTV]], [/(?:linux;\\snetcast.+smarttv|lg\\snetcast\\.tv-201\\d)/i], [[VENDOR, "LG"], [TYPE, SMARTTV]], [/(apple)\\s?tv/i], [VENDOR, [MODEL, "Apple TV"], [TYPE, SMARTTV]], [/crkey/i], [[MODEL, "Chromecast"], [VENDOR, "Google"], [TYPE, SMARTTV]], [/droid.+aft([\\w])(\\sbuild\\/|\\))/i], [MODEL, [VENDOR, "Amazon"], [TYPE, SMARTTV]], [/\\(dtv[\\);].+(aquos)/i], [MODEL, [VENDOR, "Sharp"], [TYPE, SMARTTV]], [/hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [/[\\s\\/\\(](android\\s|smart[-\\s]?|opera\\s)tv[;\\)\\s]/i], [[TYPE, SMARTTV]], [/((pebble))app\\/[\\d\\.]+\\s/i], [VENDOR, MODEL, [TYPE, WEARABLE]], [/droid.+;\\s(glass)\\s\\d/i], [MODEL, [VENDOR, "Google"], [TYPE, WEARABLE]], [/droid\\s[\\d\\.]+;\\s(wt63?0{2,3})\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, WEARABLE]], [/(tesla)(?:\\sqtcarbrowser|\\/20[12]\\d\\.[\\w\\.-]+)/i], [VENDOR, [TYPE, EMBEDDED]], [/droid .+?; ([^;]+?)(?: build|\\) applewebkit).+? mobile safari/i], [MODEL, [TYPE, MOBILE]], [/droid .+?;\\s([^;]+?)(?: build|\\) applewebkit).+?(?! mobile) safari/i], [MODEL, [TYPE, TABLET]], [/\\s(tablet|tab)[;\\/]/i, /\\s(mobile)(?:[;\\/]|\\ssafari)/i], [[TYPE, util.lowerize]], [/(android[\\w\\.\\s\\-]{0,9});.+build/i], [MODEL, [VENDOR, "Generic"]], [/(phone)/i], [[TYPE, MOBILE]]],\n engine: [[/windows.+\\sedge\\/([\\w\\.]+)/i], [VERSION, [NAME, "EdgeHTML"]], [/webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i], [VERSION, [NAME, "Blink"]], [/(presto)\\/([\\w\\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, /ekioh(flow)\\/([\\w\\.]+)/i, /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i, /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i], [NAME, VERSION], [/rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i], [VERSION, NAME]],\n os: [[/microsoft\\s(windows)\\s(vista|xp)/i], [NAME, VERSION], [/(windows)\\snt\\s6\\.2;\\s(arm)/i, /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i, /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)(?!.+xbox)/i], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [/(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i], [[NAME, "Windows"], [VERSION, mapper.str, maps.os.windows.version]], [/ip[honead]{2,4}\\b(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i, /cfnetwork\\/.+darwin/i], [[VERSION, /_/g, "."], [NAME, "iOS"]], [/(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i, /(macintosh|mac(?=_powerpc)\\s)(?!.+haiku)/i], [[NAME, "Mac OS"], [VERSION, /_/g, "."]], [/(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|sailfish|contiki)[\\/\\s-]?([\\w\\.]*)/i, /(blackberry)\\w*\\/([\\w\\.]*)/i, /(tizen|kaios)[\\/\\s]([\\w\\.]+)/i, /\\((series40);/i], [NAME, VERSION], [/\\(bb(10);/i], [VERSION, [NAME, "BlackBerry"]], [/(?:symbian\\s?os|symbos|s60(?=;)|series60)[\\/\\s-]?([\\w\\.]*)/i], [VERSION, [NAME, "Symbian"]], [/mozilla.+\\(mobile;.+gecko.+firefox/i], [[NAME, "Firefox OS"]], [/web0s;.+rt(tv)/i, /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i], [VERSION, [NAME, "webOS"]], [/crkey\\/([\\d\\.]+)/i], [VERSION, [NAME, "Chromecast"]], [/(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i], [[NAME, "Chromium OS"], VERSION], [/(nintendo|playstation)\\s([wids345portablevuch]+)/i, /(xbox);\\s+xbox\\s([^\\);]+)/i, /(mint)[\\/\\s\\(\\)]?(\\w*)/i, /(mageia|vectorlinux)[;\\s]/i, /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\\sgnu\\/linux)?(?:\\slinux)?[\\/\\s-]?(?!chrom|package)([\\w\\.-]*)/i, /(hurd|linux)\\s?([\\w\\.]*)/i, /(gnu)\\s?([\\w\\.]*)/i, /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, /(haiku)\\s(\\w+)/i], [NAME, VERSION], [/(sunos)\\s?([\\w\\.\\d]*)/i], [[NAME, "Solaris"], VERSION], [/((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i, /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i, /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms|fuchsia)/i, /(unix)\\s?([\\w\\.]*)/i], [NAME, VERSION]]\n };\n\n var UAParser = function UAParser(ua, extensions) {\n if (typeof ua === "object") {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || (typeof window !== "undefined" && window.navigator && window.navigator.userAgent ? window.navigator.userAgent : EMPTY);\n\n var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_browser, _ua, _rgxmap.browser);\n _browser.major = util.major(_browser.version);\n return _browser;\n };\n\n this.getCPU = function () {\n var _cpu = {\n architecture: undefined\n };\n mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n\n this.getDevice = function () {\n var _device = {\n vendor: undefined,\n model: undefined,\n type: undefined\n };\n mapper.rgx.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n\n this.getEngine = function () {\n var _engine = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n\n this.getOS = function () {\n var _os = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n\n this.getResult = function () {\n return {\n ua: this.getUA(),\n browser: this.getBrowser(),\n engine: this.getEngine(),\n os: this.getOS(),\n device: this.getDevice(),\n cpu: this.getCPU()\n };\n };\n\n this.getUA = function () {\n return _ua;\n };\n\n this.setUA = function (ua) {\n _ua = typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH ? util.trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = {\n NAME: NAME,\n MAJOR: MAJOR,\n VERSION: VERSION\n };\n UAParser.CPU = {\n ARCHITECTURE: ARCHITECTURE\n };\n UAParser.DEVICE = {\n MODEL: MODEL,\n VENDOR: VENDOR,\n TYPE: TYPE,\n CONSOLE: CONSOLE,\n MOBILE: MOBILE,\n SMARTTV: SMARTTV,\n TABLET: TABLET,\n WEARABLE: WEARABLE,\n EMBEDDED: EMBEDDED\n };\n UAParser.ENGINE = {\n NAME: NAME,\n VERSION: VERSION\n };\n UAParser.OS = {\n NAME: NAME,\n VERSION: VERSION\n };\n\n if (typeof exports !== UNDEF_TYPE) {\n if ("object" !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n\n exports.UAParser = UAParser;\n } else {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return UAParser;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n }\n\n var $ = typeof window !== "undefined" && (window.jQuery || window.Zepto);\n\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n\n $.ua.get = function () {\n return parser.getUA();\n };\n\n $.ua.set = function (uastring) {\n parser.setUA(uastring);\n var result = parser.getResult();\n\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n})(typeof window === "object" ? window : this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91YS1wYXJzZXItanMvZGlzdC91YS1wYXJzZXIubWluLmpzP2QxMjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQ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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLFFBQWE7QUFDckI7QUFDQTs7QUFFQSxJQUFJLGdCQUFnQjtBQUNwQixHQUFHO0FBQ0gsUUFBUSxJQUEwQztBQUNsRCxNQUFNLG1DQUFPO0FBQ2I7QUFDQSxPQUFPO0FBQUEsa0dBQUM7QUFDUixLQUFLLE1BQU0sRUFFTjtBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6IjQ4ODkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFAbGljZW5zZVxuICogVUFQYXJzZXIuanMgdjAuNy4yOFxuICogTGlnaHR3ZWlnaHQgSmF2YVNjcmlwdC1iYXNlZCBVc2VyLUFnZW50IHN0cmluZyBwYXJzZXJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWlzYWxtYW4vdWEtcGFyc2VyLWpzXG4gKlxuICogQ29weXJpZ2h0IMKpIDIwMTItMjAyMSBGYWlzYWwgU2FsbWFuIDxmQGZhaXNhbG1hbi5jb20+XG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgTGljZW5zZVxuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgdW5kZWZpbmVkKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBMSUJWRVJTSU9OID0gXCIwLjcuMjhcIixcbiAgICAgIEVNUFRZID0gXCJcIixcbiAgICAgIFVOS05PV04gPSBcIj9cIixcbiAgICAgIEZVTkNfVFlQRSA9IFwiZnVuY3Rpb25cIixcbiAgICAgIFVOREVGX1RZUEUgPSBcInVuZGVmaW5lZFwiLFxuICAgICAgT0JKX1RZUEUgPSBcIm9iamVjdFwiLFxuICAgICAgU1RSX1RZUEUgPSBcInN0cmluZ1wiLFxuICAgICAgTUFKT1IgPSBcIm1ham9yXCIsXG4gICAgICBNT0RFTCA9IFwibW9kZWxcIixcbiAgICAgIE5BTUUgPSBcIm5hbWVcIixcbiAgICAgIFRZUEUgPSBcInR5cGVcIixcbiAgICAgIFZFTkRPUiA9IFwidmVuZG9yXCIsXG4gICAgICBWRVJTSU9OID0gXCJ2ZXJzaW9uXCIsXG4gICAgICBBUkNISVRFQ1RVUkUgPSBcImFyY2hpdGVjdHVyZVwiLFxuICAgICAgQ09OU09MRSA9IFwiY29uc29sZVwiLFxuICAgICAgTU9CSUxFID0gXCJtb2JpbGVcIixcbiAgICAgIFRBQkxFVCA9IFwidGFibGV0XCIsXG4gICAgICBTTUFSVFRWID0gXCJzbWFydHR2XCIsXG4gICAgICBXRUFSQUJMRSA9IFwid2VhcmFibGVcIixcbiAgICAgIEVNQkVEREVEID0gXCJlbWJlZGRlZFwiLFxuICAgICAgVUFfTUFYX0xFTkdUSCA9IDI1NTtcbiAgdmFyIHV0aWwgPSB7XG4gICAgZXh0ZW5kOiBmdW5jdGlvbiBleHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykge1xuICAgICAgdmFyIG1lcmdlZFJlZ2V4ZXMgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiByZWdleGVzKSB7XG4gICAgICAgIGlmIChleHRlbnNpb25zW2ldICYmIGV4dGVuc2lvbnNbaV0ubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgICAgIG1lcmdlZFJlZ2V4ZXNbaV0gPSBleHRlbnNpb25zW2ldLmNvbmNhdChyZWdleGVzW2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXJnZWRSZWdleGVzW2ldID0gcmVnZXhlc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2VkUmVnZXhlcztcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKHN0cjEsIHN0cjIpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygc3RyMSA9PT0gU1RSX1RZUEUgPyBzdHIyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzdHIxLnRvTG93ZXJDYXNlKCkpICE9PSAtMSA6IGZhbHNlO1xuICAgIH0sXG4gICAgbG93ZXJpemU6IGZ1bmN0aW9uIGxvd2VyaXplKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH0sXG4gICAgbWFqb3I6IGZ1bmN0aW9uIG1ham9yKHZlcnNpb24pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gU1RSX1RZUEUgPyB2ZXJzaW9uLnJlcGxhY2UoL1teXFxkXFwuXS9nLCBcIlwiKS5zcGxpdChcIi5cIilbMF0gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICB0cmltOiBmdW5jdGlvbiB0cmltKHN0ciwgbGVuKSB7XG4gICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csIFwiXCIpO1xuICAgICAgcmV0dXJuIHR5cGVvZiBsZW4gPT09IFVOREVGX1RZUEUgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKDAsIFVBX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1hcHBlciA9IHtcbiAgICByZ3g6IGZ1bmN0aW9uIHJneCh1YSwgYXJyYXlzKSB7XG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgaixcbiAgICAgICAgICBrLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgcSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIG1hdGNoO1xuXG4gICAgICB3aGlsZSAoaSA8IGFycmF5cy5sZW5ndGggJiYgIW1hdGNoZXMpIHtcbiAgICAgICAgdmFyIHJlZ2V4ID0gYXJyYXlzW2ldLFxuICAgICAgICAgICAgcHJvcHMgPSBhcnJheXNbaSArIDFdO1xuICAgICAgICBqID0gayA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCByZWdleC5sZW5ndGggJiYgIW1hdGNoZXMpIHtcbiAgICAgICAgICBtYXRjaGVzID0gcmVnZXhbaisrXS5leGVjKHVhKTtcblxuICAgICAgICAgIGlmICghIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBwcm9wcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXNbKytrXTtcbiAgICAgICAgICAgICAgcSA9IHByb3BzW3BdO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcSA9PT0gT0JKX1RZUEUgJiYgcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHEubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PSBGVU5DX1RZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1txWzBdXSA9IHFbMV0uY2FsbCh0aGlzLCBtYXRjaCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PT0gRlVOQ19UWVBFICYmICEocVsxXS5leGVjICYmIHFbMV0udGVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1txWzBdXSA9IG1hdGNoID8gcVsxXS5jYWxsKHRoaXMsIG1hdGNoLCBxWzJdKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcVswXV0gPSBtYXRjaCA/IG1hdGNoLnJlcGxhY2UocVsxXSwgcVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzNdLmNhbGwodGhpcywgbWF0Y2gucmVwbGFjZShxWzFdLCBxWzJdKSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNbcV0gPSBtYXRjaCA/IG1hdGNoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAyO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3RyOiBmdW5jdGlvbiBzdHIoX3N0ciwgbWFwKSB7XG4gICAgICBmb3IgKHZhciBpIGluIG1hcCkge1xuICAgICAgICBpZiAodHlwZW9mIG1hcFtpXSA9PT0gT0JKX1RZUEUgJiYgbWFwW2ldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcFtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHV0aWwuaGFzKG1hcFtpXVtqXSwgX3N0cikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGkgPT09IFVOS05PV04gPyB1bmRlZmluZWQgOiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmhhcyhtYXBbaV0sIF9zdHIpKSB7XG4gICAgICAgICAgcmV0dXJuIGkgPT09IFVOS05PV04gPyB1bmRlZmluZWQgOiBpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfc3RyO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1hcHMgPSB7XG4gICAgYnJvd3Nlcjoge1xuICAgICAgb2xkU2FmYXJpOiB7XG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICBcIjEuMFwiOiBcIi84XCIsXG4gICAgICAgICAgMS4yOiBcIi8xXCIsXG4gICAgICAgICAgMS4zOiBcIi8zXCIsXG4gICAgICAgICAgXCIyLjBcIjogXCIvNDEyXCIsXG4gICAgICAgICAgXCIyLjAuMlwiOiBcIi80MTZcIixcbiAgICAgICAgICBcIjIuMC4zXCI6IFwiLzQxN1wiLFxuICAgICAgICAgIFwiMi4wLjRcIjogXCIvNDE5XCIsXG4gICAgICAgICAgXCI/XCI6IFwiL1wiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbGRFZGdlOiB7XG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAuMTogXCIxMi5cIixcbiAgICAgICAgICAyMTogXCIxMy5cIixcbiAgICAgICAgICAzMTogXCIxNC5cIixcbiAgICAgICAgICAzOTogXCIxNS5cIixcbiAgICAgICAgICA0MTogXCIxNi5cIixcbiAgICAgICAgICA0MjogXCIxNy5cIixcbiAgICAgICAgICA0NDogXCIxOC5cIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBvczoge1xuICAgICAgd2luZG93czoge1xuICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgTUU6IFwiNC45MFwiLFxuICAgICAgICAgIFwiTlQgMy4xMVwiOiBcIk5UMy41MVwiLFxuICAgICAgICAgIFwiTlQgNC4wXCI6IFwiTlQ0LjBcIixcbiAgICAgICAgICAyZTM6IFwiTlQgNS4wXCIsXG4gICAgICAgICAgWFA6IFtcIk5UIDUuMVwiLCBcIk5UIDUuMlwiXSxcbiAgICAgICAgICBWaXN0YTogXCJOVCA2LjBcIixcbiAgICAgICAgICA3OiBcIk5UIDYuMVwiLFxuICAgICAgICAgIDg6IFwiTlQgNi4yXCIsXG4gICAgICAgICAgOC4xOiBcIk5UIDYuM1wiLFxuICAgICAgICAgIDEwOiBbXCJOVCA2LjRcIiwgXCJOVCAxMC4wXCJdLFxuICAgICAgICAgIFJUOiBcIkFSTVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciByZWdleGVzID0ge1xuICAgIGJyb3dzZXI6IFtbL1xcYig/OmNybW98Y3Jpb3MpXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJDaHJvbWVcIl1dLCBbLyg/OmVkZ2V8ZWRnaW9zfGVkZ2F8ZWRnKVxcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRWRnZVwiXV0sIFsvKG9wZXJhXFxzbWluaSlcXC8oW1xcd1xcLi1dKykvaSwgLyhvcGVyYVxcc1ttb2JpbGV0YWJdezMsNn0pXFxiLit2ZXJzaW9uXFwvKFtcXHdcXC4tXSspL2ksIC8ob3BlcmEpKD86Lit2ZXJzaW9uXFwvfFtcXC9cXHNdKykoW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL29waW9zW1xcL1xcc10rKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBNaW5pXCJdXSwgWy9cXHNvcHJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIk9wZXJhXCJdXSwgWy8oa2luZGxlKVxcLyhbXFx3XFwuXSspL2ksIC8obHVuYXNjYXBlfG1heHRob258bmV0ZnJvbnR8amFzbWluZXxibGF6ZXIpW1xcL1xcc10/KFtcXHdcXC5dKikvaSwgLyhhdmFudFxcc3xpZW1vYmlsZXxzbGltKSg/OmJyb3dzZXIpP1tcXC9cXHNdPyhbXFx3XFwuXSopL2ksIC8oYmE/aWR1YnJvd3NlcilbXFwvXFxzXT8oW1xcd1xcLl0rKS9pLCAvKD86bXN8XFwoKShpZSlcXHMoW1xcd1xcLl0rKS9pLCAvKGZsb2NrfHJvY2ttZWx0fG1pZG9yaXxlcGlwaGFueXxzaWxrfHNreWZpcmV8b3ZpYnJvd3Nlcnxib2x0fGlyb258dml2YWxkaXxpcmlkaXVtfHBoYW50b21qc3xib3dzZXJ8cXVhcmt8cXVwemlsbGF8ZmFsa29uKVxcLyhbXFx3XFwuLV0rKS9pLCAvKHJla29ucXxwdWZmaW58YnJhdmV8d2hhbGV8cXFicm93c2VybGl0ZXxxcSlcXC8oW1xcd1xcLl0rKS9pLCAvKHdlaWJvKV9fKFtcXGRcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8oPzpbXFxzXFwvXXVjP1xccz9icm93c2VyfCg/Omp1Yy4rKXVjd2ViKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiVUNCcm93c2VyXCJdXSwgWy8oPzp3aW5kb3dzd2VjaGF0KT9cXHNxYmNvcmVcXC8oW1xcd1xcLl0rKVxcYi4qKD86d2luZG93c3dlY2hhdCk/L2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiV2VDaGF0KFdpbikgRGVza3RvcFwiXV0sIFsvbWljcm9tZXNzZW5nZXJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIldlQ2hhdFwiXV0sIFsva29ucXVlcm9yXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJLb25xdWVyb3JcIl1dLCBbL3RyaWRlbnQuK3J2WzpcXHNdKFtcXHdcXC5dezEsOX0pXFxiLitsaWtlXFxzZ2Vja28vaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJJRVwiXV0sIFsveWFicm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJZYW5kZXhcIl1dLCBbLyhhdmFzdHxhdmcpXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgLyguKykvLCBcIiQxIFNlY3VyZSBCcm93c2VyXCJdLCBWRVJTSU9OXSwgWy9mb2N1c1xcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRmlyZWZveCBGb2N1c1wiXV0sIFsvb3B0XFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBUb3VjaFwiXV0sIFsvY29jX2NvY19icm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJDb2MgQ29jXCJdXSwgWy9kb2xmaW5cXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkRvbHBoaW5cIl1dLCBbL2NvYXN0XFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBDb2FzdFwiXV0sIFsveGlhb21pXFwvbWl1aWJyb3dzZXJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIk1JVUkgQnJvd3NlclwiXV0sIFsvZnhpb3NcXC8oW1xcd1xcLi1dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJGaXJlZm94XCJdXSwgWy8ocWlodXxxaGJyb3dzZXJ8cWlob29icm93c2VyfDM2MGJyb3dzZXIpL2ldLCBbW05BTUUsIFwiMzYwIEJyb3dzZXJcIl1dLCBbLyhvY3VsdXN8c2Ftc3VuZ3xzYWlsZmlzaClicm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgLyguKykvLCBcIiQxIEJyb3dzZXJcIl0sIFZFUlNJT05dLCBbLyhjb21vZG9fZHJhZ29uKVxcLyhbXFx3XFwuXSspL2ldLCBbW05BTUUsIC9fL2csIFwiIFwiXSwgVkVSU0lPTl0sIFsvXFxzKGVsZWN0cm9uKVxcLyhbXFx3XFwuXSspXFxzc2FmYXJpL2ksIC8odGVzbGEpKD86XFxzcXRjYXJicm93c2VyfFxcLygyMFsxMl1cXGRcXC5bXFx3XFwuLV0rKSkvaSwgL20/KHFxYnJvd3NlcnxiYWlkdWJveGFwcHwyMzQ1RXhwbG9yZXIpW1xcL1xcc10/KFtcXHdcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8oTWV0YVNyKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ksIC8oTEJCUk9XU0VSKS9pXSwgW05BTUVdLCBbLztmYmF2XFwvKFtcXHdcXC5dKyk7L2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRmFjZWJvb2tcIl1dLCBbL0ZCQU5cXC9GQklPU3xGQl9JQUJcXC9GQjRBL2ldLCBbW05BTUUsIFwiRmFjZWJvb2tcIl1dLCBbL3NhZmFyaVxccyhsaW5lKVxcLyhbXFx3XFwuXSspL2ksIC9cXGIobGluZSlcXC8oW1xcd1xcLl0rKVxcL2lhYi9pLCAvKGNocm9taXVtfGluc3RhZ3JhbSlbXFwvXFxzXShbXFx3XFwuLV0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL1xcYmdzYVxcLyhbXFx3XFwuXSspXFxzLipzYWZhcmlcXC8vaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJHU0FcIl1dLCBbL2hlYWRsZXNzY2hyb21lKD86XFwvKFtcXHdcXC5dKyl8XFxzKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkNocm9tZSBIZWFkbGVzc1wiXV0sIFsvXFxzd3ZcXCkuKyhjaHJvbWUpXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgXCJDaHJvbWUgV2ViVmlld1wiXSwgVkVSU0lPTl0sIFsvZHJvaWQuK1xcc3ZlcnNpb25cXC8oW1xcd1xcLl0rKVxcYi4rKD86bW9iaWxlXFxzc2FmYXJpfHNhZmFyaSkvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJBbmRyb2lkIEJyb3dzZXJcIl1dLCBbLyhjaHJvbWV8b21uaXdlYnxhcm9yYXxbdGl6ZW5va2FdezV9XFxzP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL3ZlcnNpb25cXC8oW1xcd1xcLl0rKVxccy4qbW9iaWxlXFwvXFx3K1xccyhzYWZhcmkpL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiTW9iaWxlIFNhZmFyaVwiXV0sIFsvdmVyc2lvblxcLyhbXFx3XFwuXSspXFxzLioobW9iaWxlXFxzP3NhZmFyaXxzYWZhcmkpL2ldLCBbVkVSU0lPTiwgTkFNRV0sIFsvd2Via2l0Lis/KG1vYmlsZVxccz9zYWZhcml8c2FmYXJpKShcXC9bXFx3XFwuXSspL2ldLCBbTkFNRSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMuYnJvd3Nlci5vbGRTYWZhcmkudmVyc2lvbl1dLCBbLyh3ZWJraXR8a2h0bWwpXFwvKFtcXHdcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8obmF2aWdhdG9yfG5ldHNjYXBlKVxcLyhbXFx3XFwuLV0rKS9pXSwgW1tOQU1FLCBcIk5ldHNjYXBlXCJdLCBWRVJTSU9OXSwgWy9pbGVcXHN2cjtcXHNydjooW1xcd1xcLl0rKVxcKS4rZmlyZWZveC9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkZpcmVmb3ggUmVhbGl0eVwiXV0sIFsvZWtpb2hmLisoZmxvdylcXC8oW1xcd1xcLl0rKS9pLCAvKHN3aWZ0Zm94KS9pLCAvKGljZWRyYWdvbnxpY2V3ZWFzZWx8Y2FtaW5vfGNoaW1lcmF8ZmVubmVjfG1hZW1vXFxzYnJvd3NlcnxtaW5pbW98Y29ua2Vyb3IpW1xcL1xcc10/KFtcXHdcXC5cXCtdKykvaSwgLyhmaXJlZm94fHNlYW1vbmtleXxrLW1lbGVvbnxpY2VjYXR8aWNlYXBlfGZpcmViaXJkfHBob2VuaXh8cGFsZW1vb258YmFzaWxpc2t8d2F0ZXJmb3gpXFwvKFtcXHdcXC4tXSspJC9pLCAvKGZpcmVmb3gpXFwvKFtcXHdcXC5dKylcXHNbXFx3XFxzXFwtXStcXC9bXFx3XFwuXSskL2ksIC8obW96aWxsYSlcXC8oW1xcd1xcLl0rKVxccy4rcnZcXDouK2dlY2tvXFwvXFxkKy9pLCAvKHBvbGFyaXN8bHlueHxkaWxsb3xpY2FifGRvcmlzfGFtYXlhfHczbXxuZXRzdXJmfHNsZWlwbmlyKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ksIC8obGlua3MpXFxzXFwoKFtcXHdcXC5dKykvaSwgLyhnb2Jyb3dzZXIpXFwvPyhbXFx3XFwuXSopL2ksIC8oaWNlXFxzP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl9dKykvaSwgLyhtb3NhaWMpW1xcL1xcc10oW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dXSxcbiAgICBjcHU6IFtbLyg/OihhbWR8eCg/Oig/Ojg2fDY0KVtfLV0pP3x3b3d8d2luKTY0KVs7XFwpXS9pXSwgW1tBUkNISVRFQ1RVUkUsIFwiYW1kNjRcIl1dLCBbLyhpYTMyKD89OykpL2ldLCBbW0FSQ0hJVEVDVFVSRSwgdXRpbC5sb3dlcml6ZV1dLCBbLygoPzppWzM0Nl18eCk4NilbO1xcKV0vaV0sIFtbQVJDSElURUNUVVJFLCBcImlhMzJcIl1dLCBbL1xcYihhYXJjaDY0fGFybXY/OGU/bD8pXFxiL2ldLCBbW0FSQ0hJVEVDVFVSRSwgXCJhcm02NFwiXV0sIFsvXFxiKGFybSg/OnZbNjddKT9odD9uP1tmbF1wPylcXGIvaV0sIFtbQVJDSElURUNUVVJFLCBcImFybWhmXCJdXSwgWy93aW5kb3dzXFxzKGNlfG1vYmlsZSk7XFxzcHBjOy9pXSwgW1tBUkNISVRFQ1RVUkUsIFwiYXJtXCJdXSwgWy8oKD86cHBjfHBvd2VycGMpKD86NjQpPykoPzpcXHNtYWN8O3xcXCkpL2ldLCBbW0FSQ0hJVEVDVFVSRSwgL293ZXIvLCBcIlwiLCB1dGlsLmxvd2VyaXplXV0sIFsvKHN1bjRcXHcpWztcXCldL2ldLCBbW0FSQ0hJVEVDVFVSRSwgXCJzcGFyY1wiXV0sIFsvKCg/OmF2cjMyfGlhNjQoPz07KSl8NjhrKD89XFwpKXxcXGJhcm0oPzo2NHwoPz12KD86WzEtN118WzUtN10xKWw/fDt8ZWFiaSkpfCg/PWF0bWVsXFxzKWF2cnwoPzppcml4fG1pcHN8c3BhcmMpKD86NjQpP1xcYnxwYS1yaXNjKS9pXSwgW1tBUkNISVRFQ1RVUkUsIHV0aWwubG93ZXJpemVdXV0sXG4gICAgZGV2aWNlOiBbWy9cXGIoc2NoLWlbODldMFxcZHxzaHctbTM4MHN8c20tW3B0XVxcd3syLDR9fGd0LVtwbl1cXGR7Miw0fXxzZ2gtdDhbNTZdOXxuZXh1c1xcczEwKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNhbXN1bmdcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9cXGIoKD86c1tjZ3BdaHxndHxzbSktXFx3K3xnYWxheHlcXHNuZXh1cykvaSwgL1xcc3NhbXN1bmdbXFxzLV0oW1xcdy1dKykvaSwgL3NlYy0oc2doXFx3KykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTYW1zdW5nXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKGlwKD86aG9uZXxvZClbXFxzXFx3XSopOy9pXSwgW01PREVMLCBbVkVORE9SLCBcIkFwcGxlXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKGlwYWQpO1tcXHdcXHNcXCksOy1dK2FwcGxlL2ksIC9hcHBsZWNvcmVtZWRpYVxcL1tcXHdcXC5dK1xcc1xcKChpcGFkKS9pLCAvXFxiKGlwYWQpXFxkXFxkPyxcXGRcXGQ/WztcXF1dLitpb3MvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBcHBsZVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1xcYigoPzphZ3J8YWdzWzIzXXxiYWgyP3xzaHQ/KS1hP1tsd11cXGR7Mn0pL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiSHVhd2VpXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvZFxcL2h1YXdlaShbXFx3XFxzLV0rKVs7XFwpXS9pLCAvXFxiKG5leHVzXFxzNnB8dm9nLVthdF0/bFxcZFxcZHxhbmUtW2F0XT9sW3hcXGRdXFxkfGVtbC1hP2xcXGRcXGRhP3xseWEtW2F0XT9sXFxkW1xcZGNdfGNsdC1hP2xcXGRcXGRpP3xlbGUtbFxcZFxcZCkvaSwgL1xcYihcXHd7Miw0fS1bYXR1XVtsbl1bMDEyNTldWzAxOV0pWztcXClcXHNdL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiSHVhd2VpXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxiKHBvY29bXFxzXFx3XSspKD86XFxzYnVpbGR8XFwpKS9pLCAvXFxiO1xccyhcXHcrKVxcc2J1aWxkXFwvaG1cXDEvaSwgL1xcYihobVtcXHNcXC1fXT9ub3RlP1tcXHNfXT8oPzpcXGRcXHcpPylcXHNidWlsZC9pLCAvXFxiKHJlZG1pW1xcc1xcLV9dPyg/Om5vdGV8ayk/W1xcd1xcc19dKykoPzpcXHNidWlsZHxcXCkpL2ksIC9cXGIobWlbXFxzXFwtX10/KD86YVxcZHxvbmV8b25lW1xcc19dcGx1c3xub3RlIGx0ZSk/W1xcc19dPyg/OlxcZD9cXHc/KVtcXHNfXT8oPzpwbHVzKT8pXFxzYnVpbGQvaV0sIFtbTU9ERUwsIC9fL2csIFwiIFwiXSwgW1ZFTkRPUiwgXCJYaWFvbWlcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXGIobWlbXFxzXFwtX10/KD86cGFkKSg/OltcXHdcXHNfXSspKSg/Olxcc2J1aWxkfFxcKSkvaV0sIFtbTU9ERUwsIC9fL2csIFwiIFwiXSwgW1ZFTkRPUiwgXCJYaWFvbWlcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy87XFxzKFxcdyspXFxzYnVpbGQuK1xcc29wcG8vaSwgL1xccyhjcGhbMTJdXFxkezN9fHAoPzphZnxjW2FsXXxkXFx3fGVbYXJdKVttdF1cXGQwfHg5MDA3KVxcYi9pXSwgW01PREVMLCBbVkVORE9SLCBcIk9QUE9cIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHN2aXZvXFxzKFxcdyspKD86XFxzYnVpbGR8XFwpKS9pLCAvXFxzKHZbMTJdXFxkezN9XFx3P1thdF0pKD86XFxzYnVpbGR8OykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJWaXZvXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxzKHJteFsxMl1cXGR7M30pKD86XFxzYnVpbGR8OykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSZWFsbWVcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHMobWlsZXN0b25lfGRyb2lkKD86WzItNHhdfFxccyg/OmJpb25pY3x4Mnxwcm98cmF6cikpPzo/KFxcczRnKT8pXFxiW1xcd1xcc10rYnVpbGRcXC8vaSwgL1xcc21vdCg/Om9yb2xhKT9bXFxzLV0oXFx3KikvaSwgLygoPzptb3RvW1xcc1xcd1xcKFxcKV0rfHh0XFxkezMsNH18bmV4dXNcXHM2KSg/PVxcc2J1aWxkfFxcKSkpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTW90b3JvbGFcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHMobXo2MFxcZHx4b29tW1xcczJdezAsMn0pXFxzYnVpbGRcXC8vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNb3Rvcm9sYVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLygoPz1sZyk/W3ZsXWtcXC0/XFxkezN9KVxcc2J1aWxkfFxcczNcXC5bXFxzXFx3Oy1dezEwfWxnPy0oWzA2Y3Y5XXszLDR9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkxHXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvKGxtLT9mMTAwW252XT98bmV4dXNcXHNbNDVdKS9pLCAvbGdbZTtcXHNcXC8tXSsoKD8hYnJvd3NlcnxuZXRjYXN0KVxcdyspL2ksIC9cXGJsZyhcXC0/W1xcZFxcd10rKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTEdcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy8oaWRlYXRhYltcXHdcXC1cXHNdKykvaSwgL2xlbm92b1xccz8ocyg/OjUwMDB8NjAwMCkoPzpbXFx3LV0rKXx0YWIoPzpbXFxzXFx3XSspfHl0W1xcZFxcdy1dezZ9fHRiW1xcZFxcdy1dezZ9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkxlbm92b1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyg/Om1hZW1vfG5va2lhKS4qKG45MDB8bHVtaWFcXHNcXGQrKS9pLCAvbm9raWFbXFxzXy1dPyhbXFx3XFwuLV0qKS9pXSwgW1tNT0RFTCwgL18vZywgXCIgXCJdLCBbVkVORE9SLCBcIk5va2lhXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWQuKztcXHMocGl4ZWxcXHNjKVtcXHMpXS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkdvb2dsZVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL2Ryb2lkLis7XFxzKHBpeGVsW1xcc1xcZGF4bF17MCw2fSkoPzpcXHNidWlsZHxcXCkpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiR29vZ2xlXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWQuK1xccyhbYy1nXVxcZHs0fXxzb1stbF1cXHcrfHhxLWFcXHdbNC03XVsxMl0pKD89XFxzYnVpbGRcXC98XFwpLitjaHJvbWVcXC8oPyFbMS02XXswLDF9XFxkXFwuKSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTb255XCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvc29ueVxcc3RhYmxldFxcc1twc11cXHNidWlsZFxcLy9pLCAvKD86c29ueSk/c2dwXFx3Kyg/Olxcc2J1aWxkXFwvfFxcKSkvaV0sIFtbTU9ERUwsIFwiWHBlcmlhIFRhYmxldFwiXSwgW1ZFTkRPUiwgXCJTb255XCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvXFxzKGtiMjAwNXxpbjIwWzEyXTV8YmUyMFsxMl1bNTldKVxcYi9pLCAvXFxiYTAwMCgxKVxcc2J1aWxkL2ksIC9cXGJvbmVwbHVzXFxzKGFcXGR7NH0pW1xccyldL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiT25lUGx1c1wiXSwgW1RZUEUsIE1PQklMRV1dLCBbLyhhbGV4YSl3ZWJtL2ksIC8oa2ZbYS16XXsyfXdpKShcXHNidWlsZFxcL3xcXCkpL2ksIC8oa2ZbYS16XSspKFxcc2J1aWxkXFwvfFxcKSkuK3NpbGtcXC8vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBbWF6b25cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy8oc2R8a2YpWzAzNDloaWpvcnN0dXddKyhcXHNidWlsZFxcL3xcXCkpLitzaWxrXFwvL2ldLCBbW01PREVMLCBcIkZpcmUgUGhvbmVcIl0sIFtWRU5ET1IsIFwiQW1hem9uXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKHBsYXlib29rKTtbXFx3XFxzXFwpLDstXSsocmltKS9pXSwgW01PREVMLCBWRU5ET1IsIFtUWVBFLCBUQUJMRVRdXSwgWy8oKD86YmJbYS1mXXxzdFtodl0pMTAwLVxcZCkvaSwgL1xcKGJiMTA7XFxzKFxcdyspL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQmxhY2tCZXJyeVwiXSwgW1RZUEUsIE1PQklMRV1dLCBbLyg/OlxcYnxhc3VzXykodHJhbnNmb1twcmltZVxcc117NCwxMH1cXHNcXHcrfGVlZXBjfHNsaWRlclxcc1xcdyt8bmV4dXNcXHM3fHBhZGZvbmV8cDAwW2NqXSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBU1VTXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvXFxzKHpbZXNdNlswMjddWzAxXVtrbV1bbHNdfHplbmZvbmVcXHNcXGRcXHc/KVxcYi9pXSwgW01PREVMLCBbVkVORE9SLCBcIkFTVVNcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy8obmV4dXNcXHM5KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkhUQ1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyhodGMpWztfXFxzLV17MSwyfShbXFx3XFxzXSsoPz1cXCl8XFxzYnVpbGQpfFxcdyspL2ksIC8oenRlKS0oXFx3KikvaSwgLyhhbGNhdGVsfGdlZWtzcGhvbmV8bmV4aWFufHBhbmFzb25pY3woPz07XFxzKXNvbnkpW19cXHMtXT8oW1xcdy1dKikvaV0sIFtWRU5ET1IsIFtNT0RFTCwgL18vZywgXCIgXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWRbeFxcZFxcLlxccztdK1xccyhbYWJdWzEtN11cXC0/WzAxNzhhXVxcZFxcZD8pL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQWNlclwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL2Ryb2lkLis7XFxzKG1bMS01XVxcc25vdGUpXFxzYnVpbGQvaSwgL1xcYm16LShbXFx3LV17Mix9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIk1laXp1XCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvKGJsYWNrYmVycnl8YmVucXxwYWxtKD89XFwtKXxzb255ZXJpY3Nzb258YWNlcnxhc3VzfGRlbGx8bWVpenV8bW90b3JvbGF8cG9seXRyb24pW1xcc18tXT8oW1xcdy1dKikvaSwgLyhocClcXHMoW1xcd1xcc10rXFx3KS9pLCAvKGFzdXMpLT8oXFx3KykvaSwgLyhtaWNyb3NvZnQpO1xccyhsdW1pYVtcXHNcXHddKykvaSwgLyhsZW5vdm8pW19cXHMtXT8oW1xcdy1dKykvaSwgL2xpbnV4Oy4rKGpvbGxhKTsvaSwgL2Ryb2lkLis7XFxzKG9wcG8pXFxzPyhbXFx3XFxzXSspXFxzYnVpbGQvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFsvKGFyY2hvcylcXHMoZ2FtZXBhZDI/KS9pLCAvKGhwKS4rKHRvdWNocGFkKD8hLit0YWJsZXQpfHRhYmxldCkvaSwgLyhraW5kbGUpXFwvKFtcXHdcXC5dKykvaSwgL1xccyhub29rKVtcXHdcXHNdK2J1aWxkXFwvKFxcdyspL2ksIC8oZGVsbClcXHMoc3RyZWFba3ByXFxzXFxkXSpbXFxka29dKS9pLCAvWztcXC9dXFxzPyhsZVtcXHNcXC1dK3BhbilbXFxzXFwtXSsoXFx3ezEsOX0pXFxzYnVpbGQvaSwgL1s7XFwvXVxccz8odHJpbml0eSlbXFwtXFxzXSoodFxcZHszfSlcXHNidWlsZC9pLCAvXFxiKGdpZ2FzZXQpW1xcc1xcLV0rKHFcXHd7MSw5fSlcXHNidWlsZC9pLCAvXFxiKHZvZGFmb25lKVxccyhbXFx3XFxzXSspKD86XFwpfFxcc2J1aWxkKS9pXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgWy9cXHMoc3VyZmFjZVxcc2R1bylcXHMvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNaWNyb3NvZnRcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9kcm9pZFxcc1tcXGRcXC5dKztcXHMoZnBcXGR1PylcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkZhaXJwaG9uZVwiXSwgW1RZUEUsIE1PQklMRV1dLCBbL1xccyh1MzA0YWEpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBVCZUXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvc2llLShcXHcqKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNpZW1lbnNcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9bO1xcL11cXHM/KHJjdFxcdyspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSQ0FcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL1xcc10odmVudWVbXFxkXFxzXXsyLDd9KVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiRGVsbFwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8ocSg/Om12fHRhKVxcdyspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJWZXJpem9uXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzKD86YmFybmVzWyZcXHNdK25vYmxlXFxzfGJuW3J0XSkoW1xcd1xcc1xcK10qKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQmFybmVzICYgTm9ibGVcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHModG1cXGR7M31cXHcrKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTnVWaXNpb25cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy87XFxzKGs4OClcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIlpURVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLztcXHMobnhcXGR7M31qKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiWlRFXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyhnZW5cXGR7M30pXFxzYnVpbGQuKjQ5aC9pXSwgW01PREVMLCBbVkVORE9SLCBcIlN3aXNzXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyh6dXJcXGR7M30pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTd2lzc1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oKHpla2kpP3RiLipcXGIpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJaZWtpXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzKFt5cl1cXGR7Mn0pXFxzYnVpbGQvaSwgL1s7XFwvXVxccyhkcmFnb25bXFwtXFxzXSt0b3VjaFxcc3xkdCkoXFx3ezV9KVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJEcmFnb24gVG91Y2hcIl0sIE1PREVMLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzPyhucy0/XFx3ezAsOX0pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJJbnNpZ25pYVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oKG54YXxOZXh0KS0/XFx3ezAsOX0pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJOZXh0Qm9va1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oeHRyZW1lXFxfKT8odigxWzA0NV18MlswMTVdfFszNDY5XTB8N1swNV0pKVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJWb2ljZVwiXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy9bO1xcL11cXHM/KGx2dGVsXFwtKT8odjFbMTJdKVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJMdlRlbFwiXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy87XFxzKHBoLTEpXFxzL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiRXNzZW50aWFsXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyh2KDEwMG1kfDcwMG5hfDcwMTF8OTE3ZykuKlxcYilcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkVudml6ZW5cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHM/KHRyaW9bXFxzXFx3XFwtXFwuXSspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNYWNoU3BlZWRcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHM/dHVfKDE0OTEpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSb3RvclwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyhzaGllbGRbXFx3XFxzXSspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJOdmlkaWFcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy8oc3ByaW50KVxccyhcXHcrKS9pXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy8oa2luXFwuW29uZXR3XXszfSkvaV0sIFtbTU9ERUwsIC9cXC4vZywgXCIgXCJdLCBbVkVORE9SLCBcIk1pY3Jvc29mdFwiXSwgW1RZUEUsIE1PQklMRV1dLCBbL2Ryb2lkXFxzW1xcZFxcLl0rO1xccyhjYzY2NjY/fGV0NVsxNl18bWNbMjM5XVsyM114P3x2YzhbMDNdeD8pXFwpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiWmVicmFcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9kcm9pZFxcc1tcXGRcXC5dKztcXHMoZWMzMHxwczIwfHRjWzItOF1cXGRba3hdKVxcKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlplYnJhXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxzKG91eWEpXFxzL2ksIC8obmludGVuZG8pXFxzKFt3aWRzM3V0Y2hdKykvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgQ09OU09MRV1dLCBbL2Ryb2lkLis7XFxzKHNoaWVsZClcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIk52aWRpYVwiXSwgW1RZUEUsIENPTlNPTEVdXSwgWy8ocGxheXN0YXRpb25cXHNbMzQ1cG9ydGFibGV2aV0rKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNvbnlcIl0sIFtUWVBFLCBDT05TT0xFXV0sIFsvW1xcc1xcKDtdKHhib3goPzpcXHNvbmUpPyg/ITtcXHN4Ym94KSlbXFxzXFwpO10vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNaWNyb3NvZnRcIl0sIFtUWVBFLCBDT05TT0xFXV0sIFsvc21hcnQtdHYuKyhzYW1zdW5nKS9pXSwgW1ZFTkRPUiwgW1RZUEUsIFNNQVJUVFZdXSwgWy9oYmJ0di4rbWFwbGU7KFxcZCspL2ldLCBbW01PREVMLCAvXi8sIFwiU21hcnRUVlwiXSwgW1ZFTkRPUiwgXCJTYW1zdW5nXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbLyg/OmxpbnV4O1xcc25ldGNhc3QuK3NtYXJ0dHZ8bGdcXHNuZXRjYXN0XFwudHYtMjAxXFxkKS9pXSwgW1tWRU5ET1IsIFwiTEdcIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvKGFwcGxlKVxccz90di9pXSwgW1ZFTkRPUiwgW01PREVMLCBcIkFwcGxlIFRWXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbL2Nya2V5L2ldLCBbW01PREVMLCBcIkNocm9tZWNhc3RcIl0sIFtWRU5ET1IsIFwiR29vZ2xlXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbL2Ryb2lkLithZnQoW1xcd10pKFxcc2J1aWxkXFwvfFxcKSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBbWF6b25cIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvXFwoZHR2W1xcKTtdLisoYXF1b3MpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiU2hhcnBcIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvaGJidHZcXC9cXGQrXFwuXFxkK1xcLlxcZCtcXHMrXFwoW1xcd1xcc10qO1xccyooXFx3W147XSopOyhbXjtdKikvaV0sIFtbVkVORE9SLCB1dGlsLnRyaW1dLCBbTU9ERUwsIHV0aWwudHJpbV0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvW1xcc1xcL1xcKF0oYW5kcm9pZFxcc3xzbWFydFstXFxzXT98b3BlcmFcXHMpdHZbO1xcKVxcc10vaV0sIFtbVFlQRSwgU01BUlRUVl1dLCBbLygocGViYmxlKSlhcHBcXC9bXFxkXFwuXStcXHMvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgV0VBUkFCTEVdXSwgWy9kcm9pZC4rO1xccyhnbGFzcylcXHNcXGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJHb29nbGVcIl0sIFtUWVBFLCBXRUFSQUJMRV1dLCBbL2Ryb2lkXFxzW1xcZFxcLl0rO1xccyh3dDYzPzB7MiwzfSlcXCkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJaZWJyYVwiXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFsvKHRlc2xhKSg/Olxcc3F0Y2FyYnJvd3NlcnxcXC8yMFsxMl1cXGRcXC5bXFx3XFwuLV0rKS9pXSwgW1ZFTkRPUiwgW1RZUEUsIEVNQkVEREVEXV0sIFsvZHJvaWQgLis/OyAoW147XSs/KSg/OiBidWlsZHxcXCkgYXBwbGV3ZWJraXQpLis/IG1vYmlsZSBzYWZhcmkvaV0sIFtNT0RFTCwgW1RZUEUsIE1PQklMRV1dLCBbL2Ryb2lkIC4rPztcXHMoW147XSs/KSg/OiBidWlsZHxcXCkgYXBwbGV3ZWJraXQpLis/KD8hIG1vYmlsZSkgc2FmYXJpL2ldLCBbTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgWy9cXHModGFibGV0fHRhYilbO1xcL10vaSwgL1xccyhtb2JpbGUpKD86WztcXC9dfFxcc3NhZmFyaSkvaV0sIFtbVFlQRSwgdXRpbC5sb3dlcml6ZV1dLCBbLyhhbmRyb2lkW1xcd1xcLlxcc1xcLV17MCw5fSk7LitidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkdlbmVyaWNcIl1dLCBbLyhwaG9uZSkvaV0sIFtbVFlQRSwgTU9CSUxFXV1dLFxuICAgIGVuZ2luZTogW1svd2luZG93cy4rXFxzZWRnZVxcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRWRnZUhUTUxcIl1dLCBbL3dlYmtpdFxcLzUzN1xcLjM2LitjaHJvbWVcXC8oPyEyNykoW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkJsaW5rXCJdXSwgWy8ocHJlc3RvKVxcLyhbXFx3XFwuXSspL2ksIC8od2Via2l0fHRyaWRlbnR8bmV0ZnJvbnR8bmV0c3VyZnxhbWF5YXxseW54fHczbXxnb2FubmEpXFwvKFtcXHdcXC5dKykvaSwgL2VraW9oKGZsb3cpXFwvKFtcXHdcXC5dKykvaSwgLyhraHRtbHx0YXNtYW58bGlua3MpW1xcL1xcc11cXCg/KFtcXHdcXC5dKykvaSwgLyhpY2FiKVtcXC9cXHNdKFsyM11cXC5bXFxkXFwuXSspL2ldLCBbTkFNRSwgVkVSU0lPTl0sIFsvcnZcXDooW1xcd1xcLl17MSw5fSlcXGIuKyhnZWNrbykvaV0sIFtWRVJTSU9OLCBOQU1FXV0sXG4gICAgb3M6IFtbL21pY3Jvc29mdFxccyh3aW5kb3dzKVxccyh2aXN0YXx4cCkvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8od2luZG93cylcXHNudFxcczZcXC4yO1xccyhhcm0pL2ksIC8od2luZG93c1xcc3Bob25lKD86XFxzb3MpKilbXFxzXFwvXT8oW1xcZFxcLlxcc1xcd10qKS9pLCAvKHdpbmRvd3NcXHNtb2JpbGV8d2luZG93cylbXFxzXFwvXT8oW250Y2VcXGRcXC5cXHNdK1xcdykoPyEuK3hib3gpL2ldLCBbTkFNRSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMub3Mud2luZG93cy52ZXJzaW9uXV0sIFsvKHdpbig/PTN8OXxuKXx3aW5cXHM5eFxccykoW250XFxkXFwuXSspL2ldLCBbW05BTUUsIFwiV2luZG93c1wiXSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMub3Mud2luZG93cy52ZXJzaW9uXV0sIFsvaXBbaG9uZWFkXXsyLDR9XFxiKD86Lipvc1xccyhbXFx3XSspXFxzbGlrZVxcc21hY3w7XFxzb3BlcmEpL2ksIC9jZm5ldHdvcmtcXC8uK2Rhcndpbi9pXSwgW1tWRVJTSU9OLCAvXy9nLCBcIi5cIl0sIFtOQU1FLCBcImlPU1wiXV0sIFsvKG1hY1xcc29zXFxzeClcXHM/KFtcXHdcXHNcXC5dKikvaSwgLyhtYWNpbnRvc2h8bWFjKD89X3Bvd2VycGMpXFxzKSg/IS4raGFpa3UpL2ldLCBbW05BTUUsIFwiTWFjIE9TXCJdLCBbVkVSU0lPTiwgL18vZywgXCIuXCJdXSwgWy8oYW5kcm9pZHx3ZWJvc3xwYWxtXFxzb3N8cW54fGJhZGF8cmltXFxzdGFibGV0XFxzb3N8bWVlZ298c2FpbGZpc2h8Y29udGlraSlbXFwvXFxzLV0/KFtcXHdcXC5dKikvaSwgLyhibGFja2JlcnJ5KVxcdypcXC8oW1xcd1xcLl0qKS9pLCAvKHRpemVufGthaW9zKVtcXC9cXHNdKFtcXHdcXC5dKykvaSwgL1xcKChzZXJpZXM0MCk7L2ldLCBbTkFNRSwgVkVSU0lPTl0sIFsvXFwoYmIoMTApOy9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkJsYWNrQmVycnlcIl1dLCBbLyg/OnN5bWJpYW5cXHM/b3N8c3ltYm9zfHM2MCg/PTspfHNlcmllczYwKVtcXC9cXHMtXT8oW1xcd1xcLl0qKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIlN5bWJpYW5cIl1dLCBbL21vemlsbGEuK1xcKG1vYmlsZTsuK2dlY2tvLitmaXJlZm94L2ldLCBbW05BTUUsIFwiRmlyZWZveCBPU1wiXV0sIFsvd2ViMHM7LitydCh0dikvaSwgL1xcYig/OmhwKT93b3MoPzpicm93c2VyKT9cXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIndlYk9TXCJdXSwgWy9jcmtleVxcLyhbXFxkXFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiQ2hyb21lY2FzdFwiXV0sIFsvKGNyb3MpXFxzW1xcd10rXFxzKFtcXHdcXC5dK1xcdykvaV0sIFtbTkFNRSwgXCJDaHJvbWl1bSBPU1wiXSwgVkVSU0lPTl0sIFsvKG5pbnRlbmRvfHBsYXlzdGF0aW9uKVxccyhbd2lkczM0NXBvcnRhYmxldnVjaF0rKS9pLCAvKHhib3gpO1xccyt4Ym94XFxzKFteXFwpO10rKS9pLCAvKG1pbnQpW1xcL1xcc1xcKFxcKV0/KFxcdyopL2ksIC8obWFnZWlhfHZlY3RvcmxpbnV4KVs7XFxzXS9pLCAvKGpvbGl8W2t4bG5dP3VidW50dXxkZWJpYW58c3VzZXxvcGVuc3VzZXxnZW50b298YXJjaCg/PVxcc2xpbnV4KXxzbGFja3dhcmV8ZmVkb3JhfG1hbmRyaXZhfGNlbnRvc3xwY2xpbnV4b3N8cmVkaGF0fHplbndhbGt8bGlucHVzfHJhc3BiaWFuKSg/Olxcc2dudVxcL2xpbnV4KT8oPzpcXHNsaW51eCk/W1xcL1xccy1dPyg/IWNocm9tfHBhY2thZ2UpKFtcXHdcXC4tXSopL2ksIC8oaHVyZHxsaW51eClcXHM/KFtcXHdcXC5dKikvaSwgLyhnbnUpXFxzPyhbXFx3XFwuXSopL2ksIC9cXHMoW2ZyZW50b3BjLV17MCw0fWJzZHxkcmFnb25mbHkpXFxzPyg/IWFtZHxbaXgzNDZdezEsMn04NikoW1xcd1xcLl0qKS9pLCAvKGhhaWt1KVxccyhcXHcrKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbLyhzdW5vcylcXHM/KFtcXHdcXC5cXGRdKikvaV0sIFtbTkFNRSwgXCJTb2xhcmlzXCJdLCBWRVJTSU9OXSwgWy8oKD86b3Blbik/c29sYXJpcylbXFwvXFxzLV0/KFtcXHdcXC5dKikvaSwgLyhhaXgpXFxzKChcXGQpKD89XFwufFxcKXxcXHMpW1xcd1xcLl0pKi9pLCAvKHBsYW5cXHM5fG1pbml4fGJlb3N8b3NcXC8yfGFtaWdhb3N8bW9ycGhvc3xyaXNjXFxzb3N8b3BlbnZtc3xmdWNoc2lhKS9pLCAvKHVuaXgpXFxzPyhbXFx3XFwuXSopL2ldLCBbTkFNRSwgVkVSU0lPTl1dXG4gIH07XG5cbiAgdmFyIFVBUGFyc2VyID0gZnVuY3Rpb24gVUFQYXJzZXIodWEsIGV4dGVuc2lvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBleHRlbnNpb25zID0gdWE7XG4gICAgICB1YSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVUFQYXJzZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFVBUGFyc2VyKHVhLCBleHRlbnNpb25zKS5nZXRSZXN1bHQoKTtcbiAgICB9XG5cbiAgICB2YXIgX3VhID0gdWEgfHwgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCA/IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50IDogRU1QVFkpO1xuXG4gICAgdmFyIF9yZ3htYXAgPSBleHRlbnNpb25zID8gdXRpbC5leHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykgOiByZWdleGVzO1xuXG4gICAgdGhpcy5nZXRCcm93c2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9icm93c2VyID0ge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcnNpb246IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfYnJvd3NlciwgX3VhLCBfcmd4bWFwLmJyb3dzZXIpO1xuICAgICAgX2Jyb3dzZXIubWFqb3IgPSB1dGlsLm1ham9yKF9icm93c2VyLnZlcnNpb24pO1xuICAgICAgcmV0dXJuIF9icm93c2VyO1xuICAgIH07XG5cbiAgICB0aGlzLmdldENQVSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfY3B1ID0ge1xuICAgICAgICBhcmNoaXRlY3R1cmU6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfY3B1LCBfdWEsIF9yZ3htYXAuY3B1KTtcbiAgICAgIHJldHVybiBfY3B1O1xuICAgIH07XG5cbiAgICB0aGlzLmdldERldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZGV2aWNlID0ge1xuICAgICAgICB2ZW5kb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbW9kZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgbWFwcGVyLnJneC5jYWxsKF9kZXZpY2UsIF91YSwgX3JneG1hcC5kZXZpY2UpO1xuICAgICAgcmV0dXJuIF9kZXZpY2U7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RW5naW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9lbmdpbmUgPSB7XG4gICAgICAgIG5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgbWFwcGVyLnJneC5jYWxsKF9lbmdpbmUsIF91YSwgX3JneG1hcC5lbmdpbmUpO1xuICAgICAgcmV0dXJuIF9lbmdpbmU7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0T1MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX29zID0ge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcnNpb246IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfb3MsIF91YSwgX3JneG1hcC5vcyk7XG4gICAgICByZXR1cm4gX29zO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFJlc3VsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVhOiB0aGlzLmdldFVBKCksXG4gICAgICAgIGJyb3dzZXI6IHRoaXMuZ2V0QnJvd3NlcigpLFxuICAgICAgICBlbmdpbmU6IHRoaXMuZ2V0RW5naW5lKCksXG4gICAgICAgIG9zOiB0aGlzLmdldE9TKCksXG4gICAgICAgIGRldmljZTogdGhpcy5nZXREZXZpY2UoKSxcbiAgICAgICAgY3B1OiB0aGlzLmdldENQVSgpXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0aGlzLmdldFVBID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF91YTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRVQSA9IGZ1bmN0aW9uICh1YSkge1xuICAgICAgX3VhID0gdHlwZW9mIHVhID09PSBTVFJfVFlQRSAmJiB1YS5sZW5ndGggPiBVQV9NQVhfTEVOR1RIID8gdXRpbC50cmltKHVhLCBVQV9NQVhfTEVOR1RIKSA6IHVhO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0VUEoX3VhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBVQVBhcnNlci5WRVJTSU9OID0gTElCVkVSU0lPTjtcbiAgVUFQYXJzZXIuQlJPV1NFUiA9IHtcbiAgICBOQU1FOiBOQU1FLFxuICAgIE1BSk9SOiBNQUpPUixcbiAgICBWRVJTSU9OOiBWRVJTSU9OXG4gIH07XG4gIFVBUGFyc2VyLkNQVSA9IHtcbiAgICBBUkNISVRFQ1RVUkU6IEFSQ0hJVEVDVFVSRVxuICB9O1xuICBVQVBhcnNlci5ERVZJQ0UgPSB7XG4gICAgTU9ERUw6IE1PREVMLFxuICAgIFZFTkRPUjogVkVORE9SLFxuICAgIFRZUEU6IFRZUEUsXG4gICAgQ09OU09MRTogQ09OU09MRSxcbiAgICBNT0JJTEU6IE1PQklMRSxcbiAgICBTTUFSVFRWOiBTTUFSVFRWLFxuICAgIFRBQkxFVDogVEFCTEVULFxuICAgIFdFQVJBQkxFOiBXRUFSQUJMRSxcbiAgICBFTUJFRERFRDogRU1CRURERURcbiAgfTtcbiAgVUFQYXJzZXIuRU5HSU5FID0ge1xuICAgIE5BTUU6IE5BTUUsXG4gICAgVkVSU0lPTjogVkVSU0lPTlxuICB9O1xuICBVQVBhcnNlci5PUyA9IHtcbiAgICBOQU1FOiBOQU1FLFxuICAgIFZFUlNJT046IFZFUlNJT05cbiAgfTtcblxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFVOREVGX1RZUEUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gVU5ERUZfVFlQRSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gVUFQYXJzZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5VQVBhcnNlciA9IFVBUGFyc2VyO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFVBUGFyc2VyO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuVUFQYXJzZXIgPSBVQVBhcnNlcjtcbiAgICB9XG4gIH1cblxuICB2YXIgJCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvKTtcblxuICBpZiAoJCAmJiAhJC51YSkge1xuICAgIHZhciBwYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgICAkLnVhID0gcGFyc2VyLmdldFJlc3VsdCgpO1xuXG4gICAgJC51YS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLmdldFVBKCk7XG4gICAgfTtcblxuICAgICQudWEuc2V0ID0gZnVuY3Rpb24gKHVhc3RyaW5nKSB7XG4gICAgICBwYXJzZXIuc2V0VUEodWFzdHJpbmcpO1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5nZXRSZXN1bHQoKTtcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiByZXN1bHQpIHtcbiAgICAgICAgJC51YVtwcm9wXSA9IHJlc3VsdFtwcm9wXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDogdGhpcyk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4889\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")},6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},6445:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n// Trussworks GridContainer won't allow it to span 100% of the page, so\n// this works around it and tries to hide the complexity in component\nvar J40MainGridContainer=function J40MainGridContainer(_ref){var children=_ref.children,_ref$fullWidth=_ref.fullWidth,fullWidth=_ref$fullWidth===void 0?false:_ref$fullWidth,_ref$blueBackground=_ref.blueBackground,blueBackground=_ref$blueBackground===void 0?false:_ref$blueBackground,_ref$className=_ref.className,className=_ref$className===void 0?'j40-grid-container ':_ref$className;// is it a blue background strip?\nclassName+=blueBackground?'j40-main-grid-blue-bk ':'';return fullWidth?/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\",{className:'j40-grid-container '+className},children):/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.GridContainer,{containerSize:'desktop-lg',className:'j40-grid-container '+className},children);};/* harmony default export */ __webpack_exports__[\"Z\"] = (J40MainGridContainer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyLnRzeD84ODk4Il0sIm5hbWVzIjpbIko0ME1haW5HcmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJmdWxsV2lkdGgiLCJibHVlQmFja2dyb3VuZCIsImNsYXNzTmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQVdBLEdBQU1BLHFCQUFvQixDQUFHLFFBQXZCQSxxQkFBdUIsTUFJMEIsSUFIckRDLFNBR3FELE1BSHJEQSxRQUdxRCxxQkFGckRDLFNBRXFELENBRnJEQSxTQUVxRCx5QkFGekMsS0FFeUMseUNBRHJEQyxjQUNxRCxDQURyREEsY0FDcUQsOEJBRHBDLEtBQ29DLHlDQUFyREMsU0FBcUQsQ0FBckRBLFNBQXFELHlCQUF6QyxxQkFBeUMsZ0JBQ3JEO0FBQ0FBLFNBQVMsRUFBS0QsY0FBYyxDQUFHLHdCQUFILENBQThCLEVBQTFELENBRUEsTUFBT0QsVUFBUyxjQUNkLHdEQUNFLFNBQVMsQ0FBRSxzQkFBd0JFLFNBRHJDLEVBRUdILFFBRkgsQ0FEYyxjQU1kLGlEQUFDLGtFQUFELEVBQ0UsYUFBYSxDQUFFLFlBRGpCLENBRUUsU0FBUyxDQUFFLHNCQUF3QkcsU0FGckMsRUFHR0gsUUFISCxDQU5GLENBWUQsQ0FwQkQsQ0FzQkEseURBQWVELG9CQUFmIiwiZmlsZSI6IjY0NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUcnVzc3dvcmtzIEdyaWRDb250YWluZXIgd29uJ3QgYWxsb3cgaXQgdG8gc3BhbiAxMDAlIG9mIHRoZSBwYWdlLCBzb1xuLy8gdGhpcyB3b3JrcyBhcm91bmQgaXQgYW5kIHRyaWVzIHRvIGhpZGUgdGhlIGNvbXBsZXhpdHkgaW4gY29tcG9uZW50XG5pbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lcn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbnRlcmZhY2UgSUxheW91dFByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgZnVsbFdpZHRoPzogYm9vbGVhbixcbiAgIGJsdWVCYWNrZ3JvdW5kPzogYm9vbGVhbixcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IEo0ME1haW5HcmlkQ29udGFpbmVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGZ1bGxXaWR0aCA9IGZhbHNlLFxuICBibHVlQmFja2dyb3VuZCA9IGZhbHNlLFxuICBjbGFzc05hbWUgPSAnajQwLWdyaWQtY29udGFpbmVyICd9OiBJTGF5b3V0UHJvcHMpID0+IHtcbiAgLy8gaXMgaXQgYSBibHVlIGJhY2tncm91bmQgc3RyaXA/XG4gIGNsYXNzTmFtZSArPSAoYmx1ZUJhY2tncm91bmQgPyAnajQwLW1haW4tZ3JpZC1ibHVlLWJrICcgOiAnJyk7XG5cbiAgcmV0dXJuIGZ1bGxXaWR0aCA/IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9eydqNDAtZ3JpZC1jb250YWluZXIgJyArIGNsYXNzTmFtZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICkgOiAoXG4gICAgPEdyaWRDb250YWluZXJcbiAgICAgIGNvbnRhaW5lclNpemU9eydkZXNrdG9wLWxnJ31cbiAgICAgIGNsYXNzTmFtZT17J2o0MC1ncmlkLWNvbnRhaW5lciAnICsgY2xhc3NOYW1lfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0dyaWRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYWluR3JpZENvbnRhaW5lcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6445\n")},6666: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: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/HowYouCanHelp/howYouCanHelp.module.scss\n// extracted by mini-css-extract-plugin\nvar howYouCanHelpContainer = \"howYouCanHelp-module--howYouCanHelpContainer--3wcow\";\nvar howYouCanHelpText = \"howYouCanHelp-module--howYouCanHelpText--38HSA\";\nvar howYouCanHelpHeader = \"howYouCanHelp-module--howYouCanHelpHeader--16A1k\";\nvar howYouCanHelpList = \"howYouCanHelp-module--howYouCanHelpList--3wyFv\";\nvar howYouCanHelpListWrapper = \"howYouCanHelp-module--howYouCanHelpListWrapper--BL7AD\";\n;// CONCATENATED MODULE: ./src/components/HowYouCanHelp/index.tsx\nvar HowYouCanHelp=function HowYouCanHelp(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({youCanHelpHeader:{id:'howYouCanHelp.header.text',defaultMessage:'How You Can Help Improve the Tool',description:'the header of the how you can help section'},youCanHelpInfoText:{id:'youCanHelpInfoText.list.element.prefix',defaultMessage:'If you have helpful information, we’d love to',description:'you can help info text '},youCanHelpInfoLinkText:{id:'youCanHelpInfoLink.link.text',defaultMessage:'get an email from you',description:'you can help info text '},youCanHelpDataMethPrefixText:{id:'youCanHelpDataMethPrefixText.link.prefix.text',defaultMessage:'View our',description:'view our'},youCanHelpDataMethLinkText:{id:'youCanHelpDataMethLinkText.link.text',defaultMessage:'Data & methodology',description:'Data & methodology link'},youCanHelpDataMethSuffixText:{id:'youCanHelpDataMethSuffixText.link.suffix.text',defaultMessage:'and send us feedback',description:'send us feedbackv via email'},youCanHelpSharingPrefixText:{id:'youCanHelpSharingPrefixText.link.prefix.text',defaultMessage:'Find your community and',description:'find your community'},youCanHelpSharingLinkText:{id:'youCanHelpSharingLinkText.link.text',defaultMessage:'share your feedback',description:'sharing link to email'}});return/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpContainer},/*#__PURE__*/react.createElement(\"h2\",{className:howYouCanHelpHeader},intl.formatMessage(messages.youCanHelpHeader)),/*#__PURE__*/react.createElement(\"ul\",{className:howYouCanHelpListWrapper},/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpText},intl.formatMessage(messages.youCanHelpInfoText),\" \",/*#__PURE__*/react.createElement(\"a\",{href:'mailto:screeningtool.feedback@usds.gov'},intl.formatMessage(messages.youCanHelpInfoLinkText)),\" \",\".\")),/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpText},intl.formatMessage(messages.youCanHelpDataMethPrefixText),\" \",/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology'},intl.formatMessage(messages.youCanHelpDataMethLinkText)),\" \",intl.formatMessage(messages.youCanHelpDataMethSuffixText))),/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpText},intl.formatMessage(messages.youCanHelpSharingPrefixText),\" \",/*#__PURE__*/react.createElement(\"a\",{href:'mailto:screeningtool.feedback@usds.gov'},intl.formatMessage(messages.youCanHelpSharingLinkText)),\" \",\".\"))));};/* harmony default export */ var components_HowYouCanHelp = (HowYouCanHelp);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 4 modules\nvar layout = __webpack_require__(828);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nfunction _extends() {\n _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 return _extends.apply(this, arguments);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 3 modules\nvar toConsumableArray = __webpack_require__(7329);\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/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\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;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\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}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n\n\n\n\nfunction slicedToArray_slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || (0,unsupportedIterableToArray/* default */.Z)(arr, i) || _nonIterableRest();\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js\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}\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.math.hypot.js\nvar es_math_hypot = __webpack_require__(5438);\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/common.js\n\n\n/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nvar RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nfunction setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nfunction toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nfunction equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec4.js\n\n\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nfunction set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec4_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nfunction normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nfunction cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nfunction transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nvar sub = (/* unused pure expression or super */ null && (subtract));\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nvar mul = (/* unused pure expression or super */ null && (multiply));\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nvar div = (/* unused pure expression or super */ null && (divide));\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nvar dist = (/* unused pure expression or super */ null && (distance));\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nvar sqrDist = (/* unused pure expression or super */ null && (squaredDistance));\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nvar len = (/* unused pure expression or super */ null && (vec4_length));\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nvar sqrLen = (/* unused pure expression or super */ null && (squaredLength));\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/math-utils.js\n\nfunction createMat4() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\nfunction transformVector(matrix, vector) {\n var result = transformMat4([], vector, matrix);\n scale(result, result, 1 / result[3]);\n return result;\n}\nfunction mod(value, divisor) {\n var modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction math_utils_lerp(start, end, step) {\n return step * end + (1 - step) * start;\n}\n\nfunction ieLog2(x) {\n return Math.log(x) * Math.LOG2E;\n}\n\nvar log2 = Math.log2 || ieLog2;\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat4.js\n\n\n/**\r\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nfunction mat4_create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nfunction mat4_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nfunction mat4_fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nfunction identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nfunction translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nfunction mat4_scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nfunction rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nfunction fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nfunction getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nfunction getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nfunction getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nfunction fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nfunction perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nfunction lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nfunction targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nfunction mat4_str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nfunction frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nfunction multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nfunction mat4_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nfunction mat4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nvar mat4_mul = (/* unused pure expression or super */ null && (mat4_multiply));\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nvar mat4_sub = (/* unused pure expression or super */ null && (mat4_subtract));\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec2.js\n\n\n/**\r\n * 2 Dimensional Vector\r\n * @module vec2\r\n */\n\n/**\r\n * Creates a new, empty vec2\r\n *\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_create() {\n var out = new ARRAY_TYPE(2);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec2} a vector to clone\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Copy the values from one vec2 to another\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the source vector\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Set the components of a vec2 to the given values\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Adds two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\r\n * Multiplies two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\r\n * Divides two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to ceil\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to floor\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\r\n * Math.round the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to round\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\r\n * Scales a vec2 by a scalar number\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\r\n * Adds two vec2's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction vec2_distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction vec2_squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\r\n * Calculates the length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec2_length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction vec2_squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\r\n * Negates the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to negate\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to invert\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\r\n * Normalize a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to normalize\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction vec2_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\r\n * Computes the cross product of two vec2's\r\n * Note that the cross product must by definition produce a 3D vector\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec2_cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2d\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2d} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat3\r\n * 3rd vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat3} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat4\r\n * 3rd vector component is implicitly '0'\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\r\n * Rotate a 2D vector\r\n * @param {vec2} out The receiving vec2\r\n * @param {ReadonlyVec2} a The vec2 point to rotate\r\n * @param {ReadonlyVec2} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\r\n * Get the angle between two 2D vectors\r\n * @param {ReadonlyVec2} a The first operand\r\n * @param {ReadonlyVec2} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nfunction angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec2 to zero\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec2} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction vec2_str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\r\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec2_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec2_equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\r\n * Alias for {@link vec2.length}\r\n * @function\r\n */\n\nvar vec2_len = (/* unused pure expression or super */ null && (vec2_length));\n/**\r\n * Alias for {@link vec2.subtract}\r\n * @function\r\n */\n\nvar vec2_sub = vec2_subtract;\n/**\r\n * Alias for {@link vec2.multiply}\r\n * @function\r\n */\n\nvar vec2_mul = (/* unused pure expression or super */ null && (vec2_multiply));\n/**\r\n * Alias for {@link vec2.divide}\r\n * @function\r\n */\n\nvar vec2_div = (/* unused pure expression or super */ null && (vec2_divide));\n/**\r\n * Alias for {@link vec2.distance}\r\n * @function\r\n */\n\nvar vec2_dist = (/* unused pure expression or super */ null && (vec2_distance));\n/**\r\n * Alias for {@link vec2.squaredDistance}\r\n * @function\r\n */\n\nvar vec2_sqrDist = (/* unused pure expression or super */ null && (vec2_squaredDistance));\n/**\r\n * Alias for {@link vec2.squaredLength}\r\n * @function\r\n */\n\nvar vec2_sqrLen = (/* unused pure expression or super */ null && (vec2_squaredLength));\n/**\r\n * Perform some operation over an array of vec2s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar vec2_forEach = function () {\n var vec = vec2_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec3.js\n\n\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_create() {\n var out = new ARRAY_TYPE(3);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec3_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction vec3_distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction vec3_squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction vec3_squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction vec3_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nfunction vec3_angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && vec3_dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction vec3_str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec3_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec3_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nvar vec3_sub = (/* unused pure expression or super */ null && (vec3_subtract));\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nvar vec3_mul = vec3_multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nvar vec3_div = (/* unused pure expression or super */ null && (vec3_divide));\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nvar vec3_dist = (/* unused pure expression or super */ null && (vec3_distance));\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nvar vec3_sqrDist = (/* unused pure expression or super */ null && (vec3_squaredDistance));\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nvar vec3_len = (/* unused pure expression or super */ null && (vec3_length));\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nvar vec3_sqrLen = (/* unused pure expression or super */ null && (vec3_squaredLength));\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar vec3_forEach = function () {\n var vec = vec3_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/assert.js\nfunction assert_assert(condition, message) {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/web-mercator-utils.js\n\n\n\n\n\n\nvar PI = Math.PI;\nvar PI_4 = PI / 4;\nvar DEGREES_TO_RADIANS = PI / 180;\nvar RADIANS_TO_DEGREES = 180 / PI;\nvar TILE_SIZE = 512;\nvar EARTH_CIRCUMFERENCE = 40.03e6;\nvar DEFAULT_ALTITUDE = 1.5;\nfunction zoomToScale(zoom) {\n return Math.pow(2, zoom);\n}\nfunction scaleToZoom(scale) {\n return log2(scale);\n}\nfunction lngLatToWorld(_ref) {\n var _ref2 = slicedToArray_slicedToArray(_ref, 2),\n lng = _ref2[0],\n lat = _ref2[1];\n\n assert_assert(Number.isFinite(lng));\n assert_assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n var lambda2 = lng * DEGREES_TO_RADIANS;\n var phi2 = lat * DEGREES_TO_RADIANS;\n var x = TILE_SIZE * (lambda2 + PI) / (2 * PI);\n var y = TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5))) / (2 * PI);\n return [x, y];\n}\nfunction worldToLngLat(_ref3) {\n var _ref4 = slicedToArray_slicedToArray(_ref3, 2),\n x = _ref4[0],\n y = _ref4[1];\n\n var lambda2 = x / TILE_SIZE * (2 * PI) - PI;\n var phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\nfunction getMeterZoom(_ref5) {\n var latitude = _ref5.latitude;\n assert(Number.isFinite(latitude));\n var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\nfunction getDistanceScales(_ref6) {\n var latitude = _ref6.latitude,\n longitude = _ref6.longitude,\n _ref6$highPrecision = _ref6.highPrecision,\n highPrecision = _ref6$highPrecision === void 0 ? false : _ref6$highPrecision;\n assert_assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n var result = {};\n var worldSize = TILE_SIZE;\n var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n var unitsPerDegreeX = worldSize / 360;\n var unitsPerDegreeY = unitsPerDegreeX / latCosine;\n var altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n result.unitsPerMeter = [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter];\n result.metersPerUnit = [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter];\n result.unitsPerDegree = [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter];\n result.degreesPerUnit = [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter];\n\n if (highPrecision) {\n var latCosine2 = DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS) / latCosine;\n var unitsPerDegreeY2 = unitsPerDegreeX * latCosine2 / 2;\n var altUnitsPerDegree2 = worldSize / EARTH_CIRCUMFERENCE * latCosine2;\n var altUnitsPerMeter2 = altUnitsPerDegree2 / unitsPerDegreeY * altUnitsPerMeter;\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n return result;\n}\nfunction addMetersToLngLat(lngLatZ, xyz) {\n var _lngLatZ = _slicedToArray(lngLatZ, 3),\n longitude = _lngLatZ[0],\n latitude = _lngLatZ[1],\n z0 = _lngLatZ[2];\n\n var _xyz = _slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var _getDistanceScales = getDistanceScales({\n longitude: longitude,\n latitude: latitude,\n highPrecision: true\n }),\n unitsPerMeter = _getDistanceScales.unitsPerMeter,\n unitsPerMeter2 = _getDistanceScales.unitsPerMeter2;\n\n var worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n var newLngLat = worldToLngLat(worldspace);\n var newZ = (z0 || 0) + (z || 0);\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\nfunction getViewMatrix(_ref7) {\n var height = _ref7.height,\n pitch = _ref7.pitch,\n bearing = _ref7.bearing,\n altitude = _ref7.altitude,\n scale = _ref7.scale,\n _ref7$center = _ref7.center,\n center = _ref7$center === void 0 ? null : _ref7$center;\n var vm = createMat4();\n translate(vm, vm, [0, 0, -altitude]);\n rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n scale /= height;\n mat4_scale(vm, vm, [scale, scale, scale]);\n\n if (center) {\n translate(vm, vm, vec3_negate([], center));\n }\n\n return vm;\n}\nfunction getProjectionParameters(_ref8) {\n var width = _ref8.width,\n height = _ref8.height,\n _ref8$fovy = _ref8.fovy,\n fovy = _ref8$fovy === void 0 ? altitudeToFovy(DEFAULT_ALTITUDE) : _ref8$fovy,\n altitude = _ref8.altitude,\n _ref8$pitch = _ref8.pitch,\n pitch = _ref8$pitch === void 0 ? 0 : _ref8$pitch,\n _ref8$nearZMultiplier = _ref8.nearZMultiplier,\n nearZMultiplier = _ref8$nearZMultiplier === void 0 ? 1 : _ref8$nearZMultiplier,\n _ref8$farZMultiplier = _ref8.farZMultiplier,\n farZMultiplier = _ref8$farZMultiplier === void 0 ? 1 : _ref8$farZMultiplier;\n\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n var halfFov = 0.5 * fovy * DEGREES_TO_RADIANS;\n var focalDistance = fovyToAltitude(fovy);\n var pitchRadians = pitch * DEGREES_TO_RADIANS;\n var topHalfSurfaceDistance = Math.sin(halfFov) * focalDistance / Math.sin(Math.min(Math.max(Math.PI / 2 - pitchRadians - halfFov, 0.01), Math.PI - 0.01));\n var farZ = Math.sin(pitchRadians) * topHalfSurfaceDistance + focalDistance;\n return {\n fov: 2 * halfFov,\n aspect: width / height,\n focalDistance: focalDistance,\n near: nearZMultiplier,\n far: farZ * farZMultiplier\n };\n}\nfunction getProjectionMatrix(_ref9) {\n var width = _ref9.width,\n height = _ref9.height,\n pitch = _ref9.pitch,\n altitude = _ref9.altitude,\n fovy = _ref9.fovy,\n nearZMultiplier = _ref9.nearZMultiplier,\n farZMultiplier = _ref9.farZMultiplier;\n\n var _getProjectionParamet = getProjectionParameters({\n width: width,\n height: height,\n altitude: altitude,\n fovy: fovy,\n pitch: pitch,\n nearZMultiplier: nearZMultiplier,\n farZMultiplier: farZMultiplier\n }),\n fov = _getProjectionParamet.fov,\n aspect = _getProjectionParamet.aspect,\n near = _getProjectionParamet.near,\n far = _getProjectionParamet.far;\n\n var projectionMatrix = perspective([], fov, aspect, near, far);\n return projectionMatrix;\n}\nfunction altitudeToFovy(altitude) {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\nfunction fovyToAltitude(fovy) {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\nfunction worldToPixels(xyz, pixelProjectionMatrix) {\n var _xyz2 = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz2[0],\n y = _xyz2[1],\n _xyz2$ = _xyz2[2],\n z = _xyz2$ === void 0 ? 0 : _xyz2$;\n\n assert_assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\nfunction pixelsToWorld(xyz, pixelUnprojectionMatrix) {\n var targetZ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n var _xyz3 = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz3[0],\n y = _xyz3[1],\n z = _xyz3[2];\n\n assert_assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n var coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n var coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n var coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n var z0 = coord0[2];\n var z1 = coord1[2];\n var t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2_lerp([], coord0, coord1, t);\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/fit-bounds.js\n\n\n\n\nfunction fit_bounds_fitBounds(_ref) {\n var width = _ref.width,\n height = _ref.height,\n bounds = _ref.bounds,\n _ref$minExtent = _ref.minExtent,\n minExtent = _ref$minExtent === void 0 ? 0 : _ref$minExtent,\n _ref$maxZoom = _ref.maxZoom,\n maxZoom = _ref$maxZoom === void 0 ? 24 : _ref$maxZoom,\n _ref$padding = _ref.padding,\n padding = _ref$padding === void 0 ? 0 : _ref$padding,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? [0, 0] : _ref$offset;\n\n var _bounds = slicedToArray_slicedToArray(bounds, 2),\n _bounds$ = slicedToArray_slicedToArray(_bounds[0], 2),\n west = _bounds$[0],\n south = _bounds$[1],\n _bounds$2 = slicedToArray_slicedToArray(_bounds[1], 2),\n east = _bounds$2[0],\n north = _bounds$2[1];\n\n if (Number.isFinite(padding)) {\n var p = padding;\n padding = {\n top: p,\n bottom: p,\n left: p,\n right: p\n };\n } else {\n assert_assert(Number.isFinite(padding.top) && Number.isFinite(padding.bottom) && Number.isFinite(padding.left) && Number.isFinite(padding.right));\n }\n\n var viewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: 0,\n latitude: 0,\n zoom: 0\n });\n var nw = viewport.project([west, north]);\n var se = viewport.project([east, south]);\n var size = [Math.max(Math.abs(se[0] - nw[0]), minExtent), Math.max(Math.abs(se[1] - nw[1]), minExtent)];\n var targetSize = [width - padding.left - padding.right - Math.abs(offset[0]) * 2, height - padding.top - padding.bottom - Math.abs(offset[1]) * 2];\n assert_assert(targetSize[0] > 0 && targetSize[1] > 0);\n var scaleX = targetSize[0] / size[0];\n var scaleY = targetSize[1] / size[1];\n var offsetX = (padding.right - padding.left) / 2 / scaleX;\n var offsetY = (padding.bottom - padding.top) / 2 / scaleY;\n var center = [(se[0] + nw[0]) / 2 + offsetX, (se[1] + nw[1]) / 2 + offsetY];\n var centerLngLat = viewport.unproject(center);\n var zoom = Math.min(maxZoom, viewport.zoom + log2(Math.abs(Math.min(scaleX, scaleY))));\n assert_assert(Number.isFinite(zoom));\n return {\n longitude: centerLngLat[0],\n latitude: centerLngLat[1],\n zoom: zoom\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/get-bounds.js\n\n\n\nvar get_bounds_DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getBounds(viewport) {\n var z = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var width = viewport.width,\n height = viewport.height,\n unproject = viewport.unproject;\n var unprojectOps = {\n targetZ: z\n };\n var bottomLeft = unproject([0, height], unprojectOps);\n var bottomRight = unproject([width, height], unprojectOps);\n var topLeft;\n var topRight;\n var halfFov = viewport.fovy ? 0.5 * viewport.fovy * get_bounds_DEGREES_TO_RADIANS : Math.atan(0.5 / viewport.altitude);\n var angleToGround = (90 - viewport.pitch) * get_bounds_DEGREES_TO_RADIANS;\n\n if (halfFov > angleToGround - 0.01) {\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\nfunction unprojectOnFarPlane(viewport, x, targetZ) {\n var pixelUnprojectionMatrix = viewport.pixelUnprojectionMatrix;\n var coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n var coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n var z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n var t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n var coord = vec2_lerp([], coord0, coord1, t);\n var result = worldToLngLat(coord);\n result[2] = targetZ;\n return result;\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/web-mercator-viewport.js\n\n\n\n\n\n\n\n\n\n\n\n\nvar WebMercatorViewport = /*#__PURE__*/function () {\n function WebMercatorViewport() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n width: 1,\n height: 1\n },\n width = _ref.width,\n height = _ref.height,\n _ref$latitude = _ref.latitude,\n latitude = _ref$latitude === void 0 ? 0 : _ref$latitude,\n _ref$longitude = _ref.longitude,\n longitude = _ref$longitude === void 0 ? 0 : _ref$longitude,\n _ref$zoom = _ref.zoom,\n zoom = _ref$zoom === void 0 ? 0 : _ref$zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? null : _ref$altitude,\n _ref$fovy = _ref.fovy,\n fovy = _ref$fovy === void 0 ? null : _ref$fovy,\n _ref$position = _ref.position,\n position = _ref$position === void 0 ? null : _ref$position,\n _ref$nearZMultiplier = _ref.nearZMultiplier,\n nearZMultiplier = _ref$nearZMultiplier === void 0 ? 0.02 : _ref$nearZMultiplier,\n _ref$farZMultiplier = _ref.farZMultiplier,\n farZMultiplier = _ref$farZMultiplier === void 0 ? 1.01 : _ref$farZMultiplier;\n\n _classCallCheck(this, WebMercatorViewport);\n\n width = width || 1;\n height = height || 1;\n\n if (fovy === null && altitude === null) {\n altitude = DEFAULT_ALTITUDE;\n fovy = altitudeToFovy(altitude);\n } else if (fovy === null) {\n fovy = altitudeToFovy(altitude);\n } else if (altitude === null) {\n altitude = fovyToAltitude(fovy);\n }\n\n var scale = zoomToScale(zoom);\n altitude = Math.max(0.75, altitude);\n var distanceScales = getDistanceScales({\n longitude: longitude,\n latitude: latitude\n });\n var center = lngLatToWorld([longitude, latitude]);\n center[2] = 0;\n\n if (position) {\n vec3_add(center, center, vec3_mul([], position, distanceScales.unitsPerMeter));\n }\n\n this.projectionMatrix = getProjectionMatrix({\n width: width,\n height: height,\n pitch: pitch,\n fovy: fovy,\n nearZMultiplier: nearZMultiplier,\n farZMultiplier: farZMultiplier\n });\n this.viewMatrix = getViewMatrix({\n height: height,\n scale: scale,\n center: center,\n pitch: pitch,\n bearing: bearing,\n altitude: altitude\n });\n this.width = width;\n this.height = height;\n this.scale = scale;\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n this.center = center;\n this.meterOffset = position || [0, 0, 0];\n this.distanceScales = distanceScales;\n\n this._initMatrices();\n\n this.equals = this.equals.bind(this);\n this.project = this.project.bind(this);\n this.unproject = this.unproject.bind(this);\n this.projectPosition = this.projectPosition.bind(this);\n this.unprojectPosition = this.unprojectPosition.bind(this);\n Object.freeze(this);\n }\n\n _createClass(WebMercatorViewport, [{\n key: \"_initMatrices\",\n value: function _initMatrices() {\n var width = this.width,\n height = this.height,\n projectionMatrix = this.projectionMatrix,\n viewMatrix = this.viewMatrix;\n var vpm = createMat4();\n mat4_multiply(vpm, vpm, projectionMatrix);\n mat4_multiply(vpm, vpm, viewMatrix);\n this.viewProjectionMatrix = vpm;\n var m = createMat4();\n mat4_scale(m, m, [width / 2, -height / 2, 1]);\n translate(m, m, [1, -1, 0]);\n mat4_multiply(m, m, vpm);\n var mInverse = invert(createMat4(), m);\n\n if (!mInverse) {\n throw new Error('Pixel project matrix not invertible');\n }\n\n this.pixelProjectionMatrix = m;\n this.pixelUnprojectionMatrix = mInverse;\n }\n }, {\n key: \"equals\",\n value: function equals(viewport) {\n if (!(viewport instanceof WebMercatorViewport)) {\n return false;\n }\n\n return viewport.width === this.width && viewport.height === this.height && mat4_equals(viewport.projectionMatrix, this.projectionMatrix) && mat4_equals(viewport.viewMatrix, this.viewMatrix);\n }\n }, {\n key: \"project\",\n value: function project(xyz) {\n var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref2$topLeft = _ref2.topLeft,\n topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft;\n\n var worldPosition = this.projectPosition(xyz);\n var coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n var _coord = slicedToArray_slicedToArray(coord, 2),\n x = _coord[0],\n y = _coord[1];\n\n var y2 = topLeft ? y : this.height - y;\n return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n }\n }, {\n key: \"unproject\",\n value: function unproject(xyz) {\n var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref3$topLeft = _ref3.topLeft,\n topLeft = _ref3$topLeft === void 0 ? true : _ref3$topLeft,\n _ref3$targetZ = _ref3.targetZ,\n targetZ = _ref3$targetZ === void 0 ? undefined : _ref3$targetZ;\n\n var _xyz = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var y2 = topLeft ? y : this.height - y;\n var targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n var coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n\n var _this$unprojectPositi = this.unprojectPosition(coord),\n _this$unprojectPositi2 = slicedToArray_slicedToArray(_this$unprojectPositi, 3),\n X = _this$unprojectPositi2[0],\n Y = _this$unprojectPositi2[1],\n Z = _this$unprojectPositi2[2];\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n\n return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n }\n }, {\n key: \"projectPosition\",\n value: function projectPosition(xyz) {\n var _lngLatToWorld = lngLatToWorld(xyz),\n _lngLatToWorld2 = slicedToArray_slicedToArray(_lngLatToWorld, 2),\n X = _lngLatToWorld2[0],\n Y = _lngLatToWorld2[1];\n\n var Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n }\n }, {\n key: \"unprojectPosition\",\n value: function unprojectPosition(xyz) {\n var _worldToLngLat = worldToLngLat(xyz),\n _worldToLngLat2 = slicedToArray_slicedToArray(_worldToLngLat, 2),\n X = _worldToLngLat2[0],\n Y = _worldToLngLat2[1];\n\n var Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n }\n }, {\n key: \"projectFlat\",\n value: function projectFlat(lngLat) {\n return lngLatToWorld(lngLat);\n }\n }, {\n key: \"unprojectFlat\",\n value: function unprojectFlat(xy) {\n return worldToLngLat(xy);\n }\n }, {\n key: \"getMapCenterByLngLatPosition\",\n value: function getMapCenterByLngLatPosition(_ref4) {\n var lngLat = _ref4.lngLat,\n pos = _ref4.pos;\n var fromLocation = pixelsToWorld(pos, this.pixelUnprojectionMatrix);\n var toLocation = lngLatToWorld(lngLat);\n var translate = vec2_add([], toLocation, vec2_negate([], fromLocation));\n var newCenter = vec2_add([], this.center, translate);\n return worldToLngLat(newCenter);\n }\n }, {\n key: \"getLocationAtPoint\",\n value: function getLocationAtPoint(_ref5) {\n var lngLat = _ref5.lngLat,\n pos = _ref5.pos;\n return this.getMapCenterByLngLatPosition({\n lngLat: lngLat,\n pos: pos\n });\n }\n }, {\n key: \"fitBounds\",\n value: function fitBounds(bounds) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var width = this.width,\n height = this.height;\n\n var _fitBounds2 = fit_bounds_fitBounds(Object.assign({\n width: width,\n height: height,\n bounds: bounds\n }, options)),\n longitude = _fitBounds2.longitude,\n latitude = _fitBounds2.latitude,\n zoom = _fitBounds2.zoom;\n\n return new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n }\n }, {\n key: \"getBounds\",\n value: function getBounds(options) {\n var corners = this.getBoundingRegion(options);\n var west = Math.min.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[0];\n })));\n var east = Math.max.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[0];\n })));\n var south = Math.min.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[1];\n })));\n var north = Math.max.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[1];\n })));\n return [[west, south], [east, north]];\n }\n }, {\n key: \"getBoundingRegion\",\n value: function getBoundingRegion() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return getBounds(this, options.z || 0);\n }\n }]);\n\n return WebMercatorViewport;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/normalize-viewport-props.js\n\n\nvar MAX_LATITUDE = 85.05113;\nvar MIN_LATITUDE = -85.05113;\nfunction normalizeViewportProps(_ref) {\n var width = _ref.width,\n height = _ref.height,\n longitude = _ref.longitude,\n latitude = _ref.latitude,\n zoom = _ref.zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing;\n\n if (longitude < -180 || longitude > 180) {\n longitude = mod(longitude + 180, 360) - 180;\n }\n\n if (bearing < -180 || bearing > 180) {\n bearing = mod(bearing + 180, 360) - 180;\n }\n\n var flatViewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n var topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n var bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n var shiftY = 0;\n\n if (bottomY - topY < height) {\n zoom += log2(height / (bottomY - topY));\n flatViewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n }\n\n if (topY > 0) {\n shiftY = topY;\n } else if (bottomY < height) {\n shiftY = bottomY - height;\n }\n\n if (shiftY) {\n latitude = flatViewport.unproject([width / 2, height / 2 + shiftY])[1];\n }\n\n return {\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom,\n pitch: pitch,\n bearing: bearing\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/fly-to-viewport.js\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\n\n\n\nvar fly_to_viewport_EPSILON = 0.01;\nvar VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom'];\nvar DEFAULT_OPTS = {\n curve: 1.414,\n speed: 1.2\n};\nfunction flyToViewport(startProps, endProps, t) {\n var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var viewport = {};\n\n var _getFlyToTransitionPa = getFlyToTransitionParams(startProps, endProps, opts),\n startZoom = _getFlyToTransitionPa.startZoom,\n startCenterXY = _getFlyToTransitionPa.startCenterXY,\n uDelta = _getFlyToTransitionPa.uDelta,\n w0 = _getFlyToTransitionPa.w0,\n u1 = _getFlyToTransitionPa.u1,\n S = _getFlyToTransitionPa.S,\n rho = _getFlyToTransitionPa.rho,\n rho2 = _getFlyToTransitionPa.rho2,\n r0 = _getFlyToTransitionPa.r0;\n\n if (u1 < fly_to_viewport_EPSILON) {\n var _iterator = _createForOfIteratorHelper(VIEWPORT_TRANSITION_PROPS),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n viewport[key] = math_utils_lerp(startValue, endValue, t);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return viewport;\n }\n\n var s = t * S;\n var w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n var u = w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2) / u1;\n var scaleIncrement = 1 / w;\n var newZoom = startZoom + scaleToZoom(scaleIncrement);\n var newCenterWorld = vec2_scale([], uDelta, u);\n vec2_add(newCenterWorld, newCenterWorld, startCenterXY);\n var newCenter = worldToLngLat(newCenterWorld);\n viewport.longitude = newCenter[0];\n viewport.latitude = newCenter[1];\n viewport.zoom = newZoom;\n return viewport;\n}\nfunction getFlyToDuration(startProps, endProps) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n var _opts = opts,\n screenSpeed = _opts.screenSpeed,\n speed = _opts.speed,\n maxDuration = _opts.maxDuration;\n\n var _getFlyToTransitionPa2 = getFlyToTransitionParams(startProps, endProps, opts),\n S = _getFlyToTransitionPa2.S,\n rho = _getFlyToTransitionPa2.rho;\n\n var length = 1000 * S;\n var duration;\n\n if (Number.isFinite(screenSpeed)) {\n duration = length / (screenSpeed / rho);\n } else {\n duration = length / speed;\n }\n\n return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\n\nfunction getFlyToTransitionParams(startProps, endProps, opts) {\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n var rho = opts.curve;\n var startZoom = startProps.zoom;\n var startCenter = [startProps.longitude, startProps.latitude];\n var startScale = zoomToScale(startZoom);\n var endZoom = endProps.zoom;\n var endCenter = [endProps.longitude, endProps.latitude];\n var scale = zoomToScale(endZoom - startZoom);\n var startCenterXY = lngLatToWorld(startCenter);\n var endCenterXY = lngLatToWorld(endCenter);\n var uDelta = vec2_sub([], endCenterXY, startCenterXY);\n var w0 = Math.max(startProps.width, startProps.height);\n var w1 = w0 / scale;\n var u1 = vec2_length(uDelta) * startScale;\n\n var _u1 = Math.max(u1, fly_to_viewport_EPSILON);\n\n var rho2 = rho * rho;\n var b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n var b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n var r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n var r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n var S = (r1 - r0) / rho;\n return {\n startZoom: startZoom,\n startCenterXY: startCenterXY,\n uDelta: uDelta,\n w0: w0,\n u1: u1,\n S: S,\n rho: rho,\n rho2: rho2,\n r0: r0,\n r1: r1\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/index.js\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/viewport-mercator-project/module.js\n\n\n;// CONCATENATED MODULE: ./node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js\n/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\n\n/* eslint-disable require-jsdoc, valid-jsdoc */\nvar MapShim = function () {\n if (typeof Map !== 'undefined') {\n return Map;\n }\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\n\n\n function getIndex(arr, key) {\n var result = -1;\n arr.some(function (entry, index) {\n if (entry[0] === key) {\n result = index;\n return true;\n }\n\n return false;\n });\n return result;\n }\n\n return (\n /** @class */\n function () {\n function class_1() {\n this.__entries__ = [];\n }\n\n Object.defineProperty(class_1.prototype, \"size\", {\n /**\r\n * @returns {boolean}\r\n */\n get: function get() {\n return this.__entries__.length;\n },\n enumerable: true,\n configurable: true\n });\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\n\n class_1.prototype.get = function (key) {\n var index = getIndex(this.__entries__, key);\n var entry = this.__entries__[index];\n return entry && entry[1];\n };\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.set = function (key, value) {\n var index = getIndex(this.__entries__, key);\n\n if (~index) {\n this.__entries__[index][1] = value;\n } else {\n this.__entries__.push([key, value]);\n }\n };\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.delete = function (key) {\n var entries = this.__entries__;\n var index = getIndex(entries, key);\n\n if (~index) {\n entries.splice(index, 1);\n }\n };\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.has = function (key) {\n return !!~getIndex(this.__entries__, key);\n };\n /**\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.clear = function () {\n this.__entries__.splice(0);\n };\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.forEach = function (callback, ctx) {\n if (ctx === void 0) {\n ctx = null;\n }\n\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\n var entry = _a[_i];\n callback.call(ctx, entry[1], entry[0]);\n }\n };\n\n return class_1;\n }()\n );\n}();\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\n\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document; // Returns global object of a current environment.\n\nvar global$1 = function () {\n if (typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.Math === Math) {\n return __webpack_require__.g;\n }\n\n if (typeof self !== 'undefined' && self.Math === Math) {\n return self;\n }\n\n if (typeof window !== 'undefined' && window.Math === Math) {\n return window;\n } // eslint-disable-next-line no-new-func\n\n\n return Function('return this')();\n}();\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\n\n\nvar requestAnimationFrame$1 = function () {\n if (typeof requestAnimationFrame === 'function') {\n // It's required to use a bounded function because IE sometimes throws\n // an \"Invalid calling object\" error if rAF is invoked without the global\n // object on the left hand side.\n return requestAnimationFrame.bind(global$1);\n }\n\n return function (callback) {\n return setTimeout(function () {\n return callback(Date.now());\n }, 1000 / 60);\n };\n}(); // Defines minimum timeout before adding a trailing call.\n\n\nvar trailingTimeout = 2;\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\n\nfunction throttle(callback, delay) {\n var leadingCall = false,\n trailingCall = false,\n lastCallTime = 0;\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\n\n function resolvePending() {\n if (leadingCall) {\n leadingCall = false;\n callback();\n }\n\n if (trailingCall) {\n proxy();\n }\n }\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\n\n\n function timeoutCallback() {\n requestAnimationFrame$1(resolvePending);\n }\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\n\n\n function proxy() {\n var timeStamp = Date.now();\n\n if (leadingCall) {\n // Reject immediately following calls.\n if (timeStamp - lastCallTime < trailingTimeout) {\n return;\n } // Schedule new call to be in invoked when the pending one is resolved.\n // This is important for \"transitions\" which never actually start\n // immediately so there is a chance that we might miss one if change\n // happens amids the pending invocation.\n\n\n trailingCall = true;\n } else {\n leadingCall = true;\n trailingCall = false;\n setTimeout(timeoutCallback, delay);\n }\n\n lastCallTime = timeStamp;\n }\n\n return proxy;\n} // Minimum delay before invoking the update of observers.\n\n\nvar REFRESH_DELAY = 20; // A list of substrings of CSS properties used to find transition events that\n// might affect dimensions of observed elements.\n\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight']; // Check if MutationObserver is available.\n\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\n\nvar ResizeObserverController =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\n function ResizeObserverController() {\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\n this.connected_ = false;\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\n\n this.mutationEventsAdded_ = false;\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\n\n this.mutationsObserver_ = null;\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\n\n this.observers_ = [];\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\n }\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.addObserver = function (observer) {\n if (!~this.observers_.indexOf(observer)) {\n this.observers_.push(observer);\n } // Add listeners if they haven't been added yet.\n\n\n if (!this.connected_) {\n this.connect_();\n }\n };\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.removeObserver = function (observer) {\n var observers = this.observers_;\n var index = observers.indexOf(observer); // Remove observer if it's present in registry.\n\n if (~index) {\n observers.splice(index, 1);\n } // Remove listeners if controller has no connected observers.\n\n\n if (!observers.length && this.connected_) {\n this.disconnect_();\n }\n };\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.refresh = function () {\n var changesDetected = this.updateObservers_(); // Continue running updates if changes have been detected as there might\n // be future ones caused by CSS transitions.\n\n if (changesDetected) {\n this.refresh();\n }\n };\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\n\n\n ResizeObserverController.prototype.updateObservers_ = function () {\n // Collect observers that have active observations.\n var activeObservers = this.observers_.filter(function (observer) {\n return observer.gatherActive(), observer.hasActive();\n }); // Deliver notifications in a separate cycle in order to avoid any\n // collisions between observers, e.g. when multiple instances of\n // ResizeObserver are tracking the same element and the callback of one\n // of them changes content dimensions of the observed target. Sometimes\n // this may result in notifications being blocked for the rest of observers.\n\n activeObservers.forEach(function (observer) {\n return observer.broadcastActive();\n });\n return activeObservers.length > 0;\n };\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.connect_ = function () {\n // Do nothing if running in a non-browser environment or if listeners\n // have been already added.\n if (!isBrowser || this.connected_) {\n return;\n } // Subscription to the \"Transitionend\" event is used as a workaround for\n // delayed transitions. This way it's possible to capture at least the\n // final state of an element.\n\n\n document.addEventListener('transitionend', this.onTransitionEnd_);\n window.addEventListener('resize', this.refresh);\n\n if (mutationObserverSupported) {\n this.mutationsObserver_ = new MutationObserver(this.refresh);\n this.mutationsObserver_.observe(document, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n } else {\n document.addEventListener('DOMSubtreeModified', this.refresh);\n this.mutationEventsAdded_ = true;\n }\n\n this.connected_ = true;\n };\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.disconnect_ = function () {\n // Do nothing if running in a non-browser environment or if listeners\n // have been already removed.\n if (!isBrowser || !this.connected_) {\n return;\n }\n\n document.removeEventListener('transitionend', this.onTransitionEnd_);\n window.removeEventListener('resize', this.refresh);\n\n if (this.mutationsObserver_) {\n this.mutationsObserver_.disconnect();\n }\n\n if (this.mutationEventsAdded_) {\n document.removeEventListener('DOMSubtreeModified', this.refresh);\n }\n\n this.mutationsObserver_ = null;\n this.mutationEventsAdded_ = false;\n this.connected_ = false;\n };\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\n var _b = _a.propertyName,\n propertyName = _b === void 0 ? '' : _b; // Detect whether transition may affect dimensions of an element.\n\n var isReflowProperty = transitionKeys.some(function (key) {\n return !!~propertyName.indexOf(key);\n });\n\n if (isReflowProperty) {\n this.refresh();\n }\n };\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\n\n\n ResizeObserverController.getInstance = function () {\n if (!this.instance_) {\n this.instance_ = new ResizeObserverController();\n }\n\n return this.instance_;\n };\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\n\n\n ResizeObserverController.instance_ = null;\n return ResizeObserverController;\n}();\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\n\n\nvar defineConfigurable = function defineConfigurable(target, props) {\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n var key = _a[_i];\n Object.defineProperty(target, key, {\n value: props[key],\n enumerable: false,\n writable: false,\n configurable: true\n });\n }\n\n return target;\n};\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\n\n\nvar getWindowOf = function getWindowOf(target) {\n // Assume that the element is an instance of Node, which means that it\n // has the \"ownerDocument\" property from which we can retrieve a\n // corresponding global object.\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView; // Return the local global object if it's not possible extract one from\n // provided element.\n\n return ownerGlobal || global$1;\n}; // Placeholder of an empty content rectangle.\n\n\nvar emptyRect = createRectInit(0, 0, 0, 0);\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\n\nfunction toFloat(value) {\n return parseFloat(value) || 0;\n}\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\n\n\nfunction getBordersSize(styles) {\n var positions = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n positions[_i - 1] = arguments[_i];\n }\n\n return positions.reduce(function (size, position) {\n var value = styles['border-' + position + '-width'];\n return size + toFloat(value);\n }, 0);\n}\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\n\n\nfunction getPaddings(styles) {\n var positions = ['top', 'right', 'bottom', 'left'];\n var paddings = {};\n\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\n var position = positions_1[_i];\n var value = styles['padding-' + position];\n paddings[position] = toFloat(value);\n }\n\n return paddings;\n}\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getSVGContentRect(target) {\n var bbox = target.getBBox();\n return createRectInit(0, 0, bbox.width, bbox.height);\n}\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getHTMLElementContentRect(target) {\n // Client width & height properties can't be\n // used exclusively as they provide rounded values.\n var clientWidth = target.clientWidth,\n clientHeight = target.clientHeight; // By this condition we can catch all non-replaced inline, hidden and\n // detached elements. Though elements with width & height properties less\n // than 0.5 will be discarded as well.\n //\n // Without it we would need to implement separate methods for each of\n // those cases and it's not possible to perform a precise and performance\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\n // gives wrong results for elements with width & height less than 0.5.\n\n if (!clientWidth && !clientHeight) {\n return emptyRect;\n }\n\n var styles = getWindowOf(target).getComputedStyle(target);\n var paddings = getPaddings(styles);\n var horizPad = paddings.left + paddings.right;\n var vertPad = paddings.top + paddings.bottom; // Computed styles of width & height are being used because they are the\n // only dimensions available to JS that contain non-rounded values. It could\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\n // affected by CSS transformations let alone paddings, borders and scroll bars.\n\n var width = toFloat(styles.width),\n height = toFloat(styles.height); // Width & height include paddings and borders when the 'border-box' box\n // model is applied (except for IE).\n\n if (styles.boxSizing === 'border-box') {\n // Following conditions are required to handle Internet Explorer which\n // doesn't include paddings and borders to computed CSS dimensions.\n //\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\n // properties then it's either IE, and thus we don't need to subtract\n // anything, or an element merely doesn't have paddings/borders styles.\n if (Math.round(width + horizPad) !== clientWidth) {\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\n }\n\n if (Math.round(height + vertPad) !== clientHeight) {\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\n }\n } // Following steps can't be applied to the document's root element as its\n // client[Width/Height] properties represent viewport area of the window.\n // Besides, it's as well not necessary as the itself neither has\n // rendered scroll bars nor it can be clipped.\n\n\n if (!isDocumentElement(target)) {\n // In some browsers (only in Firefox, actually) CSS width & height\n // include scroll bars size which can be removed at this step as scroll\n // bars are the only difference between rounded dimensions + paddings\n // and \"client\" properties, though that is not always true in Chrome.\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\n var horizScrollbar = Math.round(height + vertPad) - clientHeight; // Chrome has a rather weird rounding of \"client\" properties.\n // E.g. for an element with content width of 314.2px it sometimes gives\n // the client width of 315px and for the width of 314.7px it may give\n // 314px. And it doesn't happen all the time. So just ignore this delta\n // as a non-relevant.\n\n if (Math.abs(vertScrollbar) !== 1) {\n width -= vertScrollbar;\n }\n\n if (Math.abs(horizScrollbar) !== 1) {\n height -= horizScrollbar;\n }\n }\n\n return createRectInit(paddings.left, paddings.top, width, height);\n}\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\n\n\nvar isSVGGraphicsElement = function () {\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\n // interface.\n if (typeof SVGGraphicsElement !== 'undefined') {\n return function (target) {\n return target instanceof getWindowOf(target).SVGGraphicsElement;\n };\n } // If it's so, then check that element is at least an instance of the\n // SVGElement and that it has the \"getBBox\" method.\n // eslint-disable-next-line no-extra-parens\n\n\n return function (target) {\n return target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === 'function';\n };\n}();\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\n\n\nfunction isDocumentElement(target) {\n return target === getWindowOf(target).document.documentElement;\n}\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getContentRect(target) {\n if (!isBrowser) {\n return emptyRect;\n }\n\n if (isSVGGraphicsElement(target)) {\n return getSVGContentRect(target);\n }\n\n return getHTMLElementContentRect(target);\n}\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\n\n\nfunction createReadOnlyRect(_a) {\n var x = _a.x,\n y = _a.y,\n width = _a.width,\n height = _a.height; // If DOMRectReadOnly is available use it as a prototype for the rectangle.\n\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\n var rect = Object.create(Constr.prototype); // Rectangle's properties are not writable and non-enumerable.\n\n defineConfigurable(rect, {\n x: x,\n y: y,\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: height + y,\n left: x\n });\n return rect;\n}\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction createRectInit(x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height\n };\n}\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\n\n\nvar ResizeObservation =\n/** @class */\nfunction () {\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\n function ResizeObservation(target) {\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\n this.broadcastWidth = 0;\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\n\n this.broadcastHeight = 0;\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\n\n this.contentRect_ = createRectInit(0, 0, 0, 0);\n this.target = target;\n }\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\n\n\n ResizeObservation.prototype.isActive = function () {\n var rect = getContentRect(this.target);\n this.contentRect_ = rect;\n return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;\n };\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\n\n\n ResizeObservation.prototype.broadcastRect = function () {\n var rect = this.contentRect_;\n this.broadcastWidth = rect.width;\n this.broadcastHeight = rect.height;\n return rect;\n };\n\n return ResizeObservation;\n}();\n\nvar ResizeObserverEntry =\n/** @class */\nfunction () {\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\n function ResizeObserverEntry(target, rectInit) {\n var contentRect = createReadOnlyRect(rectInit); // According to the specification following properties are not writable\n // and are also not enumerable in the native implementation.\n //\n // Property accessors are not being used as they'd require to define a\n // private WeakMap storage which may cause memory leaks in browsers that\n // don't support this type of collections.\n\n defineConfigurable(this, {\n target: target,\n contentRect: contentRect\n });\n }\n\n return ResizeObserverEntry;\n}();\n\nvar ResizeObserverSPI =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\n function ResizeObserverSPI(callback, controller, callbackCtx) {\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\n this.activeObservations_ = [];\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\n\n this.observations_ = new MapShim();\n\n if (typeof callback !== 'function') {\n throw new TypeError('The callback provided as parameter 1 is not a function.');\n }\n\n this.callback_ = callback;\n this.controller_ = controller;\n this.callbackCtx_ = callbackCtx;\n }\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.observe = function (target) {\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n } // Do nothing if current environment doesn't have the Element interface.\n\n\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\n return;\n }\n\n if (!(target instanceof getWindowOf(target).Element)) {\n throw new TypeError('parameter 1 is not of type \"Element\".');\n }\n\n var observations = this.observations_; // Do nothing if element is already being observed.\n\n if (observations.has(target)) {\n return;\n }\n\n observations.set(target, new ResizeObservation(target));\n this.controller_.addObserver(this); // Force the update of observations.\n\n this.controller_.refresh();\n };\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.unobserve = function (target) {\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n } // Do nothing if current environment doesn't have the Element interface.\n\n\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\n return;\n }\n\n if (!(target instanceof getWindowOf(target).Element)) {\n throw new TypeError('parameter 1 is not of type \"Element\".');\n }\n\n var observations = this.observations_; // Do nothing if element is not being observed.\n\n if (!observations.has(target)) {\n return;\n }\n\n observations.delete(target);\n\n if (!observations.size) {\n this.controller_.removeObserver(this);\n }\n };\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.disconnect = function () {\n this.clearActive();\n this.observations_.clear();\n this.controller_.removeObserver(this);\n };\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.gatherActive = function () {\n var _this = this;\n\n this.clearActive();\n this.observations_.forEach(function (observation) {\n if (observation.isActive()) {\n _this.activeObservations_.push(observation);\n }\n });\n };\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.broadcastActive = function () {\n // Do nothing if observer doesn't have active observations.\n if (!this.hasActive()) {\n return;\n }\n\n var ctx = this.callbackCtx_; // Create ResizeObserverEntry instance for every active observation.\n\n var entries = this.activeObservations_.map(function (observation) {\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\n });\n this.callback_.call(ctx, entries, ctx);\n this.clearActive();\n };\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.clearActive = function () {\n this.activeObservations_.splice(0);\n };\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\n\n\n ResizeObserverSPI.prototype.hasActive = function () {\n return this.activeObservations_.length > 0;\n };\n\n return ResizeObserverSPI;\n}(); // Registry of internal observers. If WeakMap is not available use current shim\n// for the Map collection as it has all required methods and because WeakMap\n// can't be fully polyfilled anyway.\n\n\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\n\nvar ResizeObserver =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\n function ResizeObserver(callback) {\n if (!(this instanceof ResizeObserver)) {\n throw new TypeError('Cannot call a class as a function.');\n }\n\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n\n var controller = ResizeObserverController.getInstance();\n var observer = new ResizeObserverSPI(callback, controller, this);\n observers.set(this, observer);\n }\n\n return ResizeObserver;\n}(); // Expose public methods of ResizeObserver.\n\n\n['observe', 'unobserve', 'disconnect'].forEach(function (method) {\n ResizeObserver.prototype[method] = function () {\n var _a;\n\n return (_a = observers.get(this))[method].apply(_a, arguments);\n };\n});\n\nvar index = function () {\n // Export existing implementation if available.\n if (typeof global$1.ResizeObserver !== 'undefined') {\n return global$1.ResizeObserver;\n }\n\n return ResizeObserver;\n}();\n\n/* harmony default export */ var ResizeObserver_es = (index);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/globals.js\nvar window_ = typeof window !== 'undefined' ? window : __webpack_require__.g;\nvar global_ = typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : window;\nvar document_ = typeof document !== 'undefined' ? document : {};\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/style-utils.js\n\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction style_utils_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = style_utils_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction style_utils_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return style_utils_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 style_utils_arrayLikeToArray(o, minLen);\n}\n\nfunction style_utils_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\nvar refProps = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\nfunction normalizeStyle(style) {\n if (!style) {\n return null;\n }\n\n if (typeof style === 'string') {\n return style;\n }\n\n if (style.toJS) {\n style = style.toJS();\n }\n\n var layerIndex = {};\n\n var _iterator = style_utils_createForOfIteratorHelper(style.layers),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var layer = _step.value;\n layerIndex[layer.id] = layer;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var layers = style.layers.map(function (layer) {\n var layerRef = layerIndex[layer.ref];\n var normalizedLayer = null;\n\n if ('interactive' in layer) {\n normalizedLayer = _objectSpread({}, layer);\n delete normalizedLayer.interactive;\n }\n\n if (layerRef) {\n normalizedLayer = normalizedLayer || _objectSpread({}, layer);\n delete normalizedLayer.ref;\n\n var _iterator2 = style_utils_createForOfIteratorHelper(refProps),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var propName = _step2.value;\n\n if (propName in layerRef) {\n normalizedLayer[propName] = layerRef[propName];\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n\n return normalizedLayer || layer;\n });\n return _objectSpread(_objectSpread({}, style), {}, {\n layers: layers\n });\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/mapbox/mapbox.js\n\n\n\n\n\n\n\nfunction noop() {}\n\nfunction defaultOnError(event) {\n if (event) {\n console.error(event.error);\n }\n}\n\nvar propTypes = {\n container: prop_types.object,\n gl: prop_types.object,\n mapboxApiAccessToken: prop_types.string,\n mapboxApiUrl: prop_types.string,\n attributionControl: prop_types.bool,\n preserveDrawingBuffer: prop_types.bool,\n reuseMaps: prop_types.bool,\n transformRequest: prop_types.func,\n mapOptions: prop_types.object,\n mapStyle: prop_types.oneOfType([prop_types.string, prop_types.object]),\n preventStyleDiffing: prop_types.bool,\n visible: prop_types.bool,\n asyncRender: prop_types.bool,\n onLoad: prop_types.func,\n onError: prop_types.func,\n width: prop_types.number,\n height: prop_types.number,\n viewState: prop_types.object,\n longitude: prop_types.number,\n latitude: prop_types.number,\n zoom: prop_types.number,\n bearing: prop_types.number,\n pitch: prop_types.number,\n altitude: prop_types.number\n};\nvar defaultProps = {\n container: document_.body,\n mapboxApiAccessToken: getAccessToken(),\n mapboxApiUrl: 'https://api.mapbox.com',\n preserveDrawingBuffer: false,\n attributionControl: true,\n reuseMaps: false,\n mapOptions: {},\n mapStyle: 'mapbox://styles/mapbox/light-v8',\n preventStyleDiffing: false,\n visible: true,\n asyncRender: false,\n onLoad: noop,\n onError: defaultOnError,\n width: 0,\n height: 0,\n longitude: 0,\n latitude: 0,\n zoom: 0,\n bearing: 0,\n pitch: 0,\n altitude: 1.5\n};\nfunction getAccessToken() {\n var accessToken = null;\n\n if (typeof window !== 'undefined' && window.location) {\n var match = window.location.search.match(/access_token=([^&\\/]*)/);\n accessToken = match && match[1];\n }\n\n if (!accessToken && typeof process !== 'undefined') {\n accessToken = accessToken || ({}).MapboxAccessToken || ({}).REACT_APP_MAPBOX_ACCESS_TOKEN;\n }\n\n return accessToken || 'no-token';\n}\n\nfunction checkPropTypes(props) {\n var component = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'component';\n\n if (props.debug) {\n prop_types.checkPropTypes(propTypes, props, 'prop', component);\n }\n}\n\nvar Mapbox = function () {\n function Mapbox(props) {\n var _this = this;\n\n _classCallCheck(this, Mapbox);\n\n _defineProperty(this, \"props\", defaultProps);\n\n _defineProperty(this, \"width\", 0);\n\n _defineProperty(this, \"height\", 0);\n\n _defineProperty(this, \"_fireLoadEvent\", function () {\n _this.props.onLoad({\n type: 'load',\n target: _this._map\n });\n });\n\n if (!props.mapboxgl) {\n throw new Error('Mapbox not available');\n }\n\n this.mapboxgl = props.mapboxgl;\n\n if (!Mapbox.initialized) {\n Mapbox.initialized = true;\n\n this._checkStyleSheet(this.mapboxgl.version);\n }\n\n this._initialize(props);\n }\n\n _createClass(Mapbox, [{\n key: \"finalize\",\n value: function finalize() {\n this._destroy();\n\n return this;\n }\n }, {\n key: \"setProps\",\n value: function setProps(props) {\n this._update(this.props, props);\n\n return this;\n }\n }, {\n key: \"redraw\",\n value: function redraw() {\n var map = this._map;\n\n if (map.style) {\n if (map._frame) {\n map._frame.cancel();\n\n map._frame = null;\n }\n\n map._render();\n }\n }\n }, {\n key: \"getMap\",\n value: function getMap() {\n return this._map;\n }\n }, {\n key: \"_reuse\",\n value: function _reuse(props) {\n this._map = Mapbox.savedMap;\n\n var oldContainer = this._map.getContainer();\n\n var newContainer = props.container;\n newContainer.classList.add('mapboxgl-map');\n\n while (oldContainer.childNodes.length > 0) {\n newContainer.appendChild(oldContainer.childNodes[0]);\n }\n\n this._map._container = newContainer;\n Mapbox.savedMap = null;\n\n if (props.mapStyle) {\n this._map.setStyle(normalizeStyle(props.mapStyle), {\n diff: false\n });\n }\n\n if (this._map.isStyleLoaded()) {\n this._fireLoadEvent();\n } else {\n this._map.once('styledata', this._fireLoadEvent);\n }\n }\n }, {\n key: \"_create\",\n value: function _create(props) {\n if (props.reuseMaps && Mapbox.savedMap) {\n this._reuse(props);\n } else {\n if (props.gl) {\n var getContext = HTMLCanvasElement.prototype.getContext;\n\n HTMLCanvasElement.prototype.getContext = function () {\n HTMLCanvasElement.prototype.getContext = getContext;\n return props.gl;\n };\n }\n\n var mapOptions = {\n container: props.container,\n center: [0, 0],\n zoom: 8,\n pitch: 0,\n bearing: 0,\n maxZoom: 24,\n style: normalizeStyle(props.mapStyle),\n interactive: false,\n trackResize: false,\n attributionControl: props.attributionControl,\n preserveDrawingBuffer: props.preserveDrawingBuffer\n };\n\n if (props.transformRequest) {\n mapOptions.transformRequest = props.transformRequest;\n }\n\n this._map = new this.mapboxgl.Map(Object.assign({}, mapOptions, props.mapOptions));\n\n this._map.once('load', props.onLoad);\n\n this._map.on('error', props.onError);\n }\n\n return this;\n }\n }, {\n key: \"_destroy\",\n value: function _destroy() {\n if (!this._map) {\n return;\n }\n\n if (!Mapbox.savedMap) {\n Mapbox.savedMap = this._map;\n\n this._map.off('load', this.props.onLoad);\n\n this._map.off('error', this.props.onError);\n\n this._map.off('styledata', this._fireLoadEvent);\n } else {\n this._map.remove();\n }\n\n this._map = null;\n }\n }, {\n key: \"_initialize\",\n value: function _initialize(props) {\n var _this2 = this;\n\n props = Object.assign({}, defaultProps, props);\n checkPropTypes(props, 'Mapbox');\n this.mapboxgl.accessToken = props.mapboxApiAccessToken || defaultProps.mapboxApiAccessToken;\n this.mapboxgl.baseApiUrl = props.mapboxApiUrl;\n\n this._create(props);\n\n var _props = props,\n container = _props.container;\n Object.defineProperty(container, 'offsetWidth', {\n get: function get() {\n return _this2.width;\n }\n });\n Object.defineProperty(container, 'clientWidth', {\n get: function get() {\n return _this2.width;\n }\n });\n Object.defineProperty(container, 'offsetHeight', {\n get: function get() {\n return _this2.height;\n }\n });\n Object.defineProperty(container, 'clientHeight', {\n get: function get() {\n return _this2.height;\n }\n });\n\n var canvas = this._map.getCanvas();\n\n if (canvas) {\n canvas.style.outline = 'none';\n }\n\n this._updateMapViewport({}, props);\n\n this._updateMapSize({}, props);\n\n this.props = props;\n }\n }, {\n key: \"_update\",\n value: function _update(oldProps, newProps) {\n if (!this._map) {\n return;\n }\n\n newProps = Object.assign({}, this.props, newProps);\n checkPropTypes(newProps, 'Mapbox');\n\n var viewportChanged = this._updateMapViewport(oldProps, newProps);\n\n var sizeChanged = this._updateMapSize(oldProps, newProps);\n\n this._updateMapStyle(oldProps, newProps);\n\n if (!newProps.asyncRender && (viewportChanged || sizeChanged)) {\n this.redraw();\n }\n\n this.props = newProps;\n }\n }, {\n key: \"_updateMapStyle\",\n value: function _updateMapStyle(oldProps, newProps) {\n var styleChanged = oldProps.mapStyle !== newProps.mapStyle;\n\n if (styleChanged) {\n this._map.setStyle(normalizeStyle(newProps.mapStyle), {\n diff: !newProps.preventStyleDiffing\n });\n }\n }\n }, {\n key: \"_updateMapSize\",\n value: function _updateMapSize(oldProps, newProps) {\n var sizeChanged = oldProps.width !== newProps.width || oldProps.height !== newProps.height;\n\n if (sizeChanged) {\n this.width = newProps.width;\n this.height = newProps.height;\n\n this._map.resize();\n }\n\n return sizeChanged;\n }\n }, {\n key: \"_updateMapViewport\",\n value: function _updateMapViewport(oldProps, newProps) {\n var oldViewState = this._getViewState(oldProps);\n\n var newViewState = this._getViewState(newProps);\n\n var viewportChanged = newViewState.latitude !== oldViewState.latitude || newViewState.longitude !== oldViewState.longitude || newViewState.zoom !== oldViewState.zoom || newViewState.pitch !== oldViewState.pitch || newViewState.bearing !== oldViewState.bearing || newViewState.altitude !== oldViewState.altitude;\n\n if (viewportChanged) {\n this._map.jumpTo(this._viewStateToMapboxProps(newViewState));\n\n if (newViewState.altitude !== oldViewState.altitude) {\n this._map.transform.altitude = newViewState.altitude;\n }\n }\n\n return viewportChanged;\n }\n }, {\n key: \"_getViewState\",\n value: function _getViewState(props) {\n var _ref = props.viewState || props,\n longitude = _ref.longitude,\n latitude = _ref.latitude,\n zoom = _ref.zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? 1.5 : _ref$altitude;\n\n return {\n longitude: longitude,\n latitude: latitude,\n zoom: zoom,\n pitch: pitch,\n bearing: bearing,\n altitude: altitude\n };\n }\n }, {\n key: \"_checkStyleSheet\",\n value: function _checkStyleSheet() {\n var mapboxVersion = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '0.47.0';\n\n if (typeof document_ === 'undefined') {\n return;\n }\n\n try {\n var testElement = document_.createElement('div');\n testElement.className = 'mapboxgl-map';\n testElement.style.display = 'none';\n document_.body.appendChild(testElement);\n var isCssLoaded = window.getComputedStyle(testElement).position !== 'static';\n\n if (!isCssLoaded) {\n var link = document_.createElement('link');\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('type', 'text/css');\n link.setAttribute('href', \"https://api.tiles.mapbox.com/mapbox-gl-js/v\".concat(mapboxVersion, \"/mapbox-gl.css\"));\n document_.head.appendChild(link);\n }\n } catch (error) {}\n }\n }, {\n key: \"_viewStateToMapboxProps\",\n value: function _viewStateToMapboxProps(viewState) {\n return {\n center: [viewState.longitude, viewState.latitude],\n zoom: viewState.zoom,\n bearing: viewState.bearing,\n pitch: viewState.pitch\n };\n }\n }]);\n\n return Mapbox;\n}();\n\n_defineProperty(Mapbox, \"initialized\", false);\n\n_defineProperty(Mapbox, \"propTypes\", propTypes);\n\n_defineProperty(Mapbox, \"defaultProps\", defaultProps);\n\n_defineProperty(Mapbox, \"savedMap\", null);\n\n\n// EXTERNAL MODULE: ./node_modules/maplibre-gl/dist/maplibre-gl.js\nvar maplibre_gl = __webpack_require__(9910);\nvar maplibre_gl_default = /*#__PURE__*/__webpack_require__.n(maplibre_gl);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/mapboxgl.browser.js\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/math-utils.js\nvar math_utils_EPSILON = 1e-7;\n\nfunction isArray(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\n\nfunction math_utils_equals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; ++i) {\n if (!math_utils_equals(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n return Math.abs(a - b) <= math_utils_EPSILON;\n}\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction utils_math_utils_lerp(a, b, t) {\n if (isArray(a)) {\n return a.map(function (ai, i) {\n return utils_math_utils_lerp(ai, b[i], t);\n });\n }\n\n return t * b + (1 - t) * a;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/assert.js\nfunction utils_assert_assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'react-map-gl: assertion failed.');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-state.js\n\n\n\n\n\nfunction map_state_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_state_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_state_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_state_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar MAPBOX_LIMITS = {\n minZoom: 0,\n maxZoom: 24,\n minPitch: 0,\n maxPitch: 85\n};\nvar DEFAULT_STATE = {\n pitch: 0,\n bearing: 0,\n altitude: 1.5\n};\nvar PITCH_MOUSE_THRESHOLD = 5;\nvar PITCH_ACCEL = 1.2;\n\nvar MapState = function () {\n function MapState(_ref) {\n var width = _ref.width,\n height = _ref.height,\n latitude = _ref.latitude,\n longitude = _ref.longitude,\n zoom = _ref.zoom,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? DEFAULT_STATE.altitude : _ref$altitude,\n _ref$maxZoom = _ref.maxZoom,\n maxZoom = _ref$maxZoom === void 0 ? MAPBOX_LIMITS.maxZoom : _ref$maxZoom,\n _ref$minZoom = _ref.minZoom,\n minZoom = _ref$minZoom === void 0 ? MAPBOX_LIMITS.minZoom : _ref$minZoom,\n _ref$maxPitch = _ref.maxPitch,\n maxPitch = _ref$maxPitch === void 0 ? MAPBOX_LIMITS.maxPitch : _ref$maxPitch,\n _ref$minPitch = _ref.minPitch,\n minPitch = _ref$minPitch === void 0 ? MAPBOX_LIMITS.minPitch : _ref$minPitch,\n transitionDuration = _ref.transitionDuration,\n transitionEasing = _ref.transitionEasing,\n transitionInterpolator = _ref.transitionInterpolator,\n transitionInterruption = _ref.transitionInterruption,\n startPanLngLat = _ref.startPanLngLat,\n startZoomLngLat = _ref.startZoomLngLat,\n startRotatePos = _ref.startRotatePos,\n startBearing = _ref.startBearing,\n startPitch = _ref.startPitch,\n startZoom = _ref.startZoom;\n\n _classCallCheck(this, MapState);\n\n utils_assert_assert(Number.isFinite(width), '`width` must be supplied');\n utils_assert_assert(Number.isFinite(height), '`height` must be supplied');\n utils_assert_assert(Number.isFinite(longitude), '`longitude` must be supplied');\n utils_assert_assert(Number.isFinite(latitude), '`latitude` must be supplied');\n utils_assert_assert(Number.isFinite(zoom), '`zoom` must be supplied');\n this._viewportProps = this._applyConstraints({\n width: width,\n height: height,\n latitude: latitude,\n longitude: longitude,\n zoom: zoom,\n bearing: bearing,\n pitch: pitch,\n altitude: altitude,\n maxZoom: maxZoom,\n minZoom: minZoom,\n maxPitch: maxPitch,\n minPitch: minPitch,\n transitionDuration: transitionDuration,\n transitionEasing: transitionEasing,\n transitionInterpolator: transitionInterpolator,\n transitionInterruption: transitionInterruption\n });\n this._state = {\n startPanLngLat: startPanLngLat,\n startZoomLngLat: startZoomLngLat,\n startRotatePos: startRotatePos,\n startBearing: startBearing,\n startPitch: startPitch,\n startZoom: startZoom\n };\n }\n\n _createClass(MapState, [{\n key: \"getViewportProps\",\n value: function getViewportProps() {\n return this._viewportProps;\n }\n }, {\n key: \"getState\",\n value: function getState() {\n return this._state;\n }\n }, {\n key: \"panStart\",\n value: function panStart(_ref2) {\n var pos = _ref2.pos;\n return this._getUpdatedMapState({\n startPanLngLat: this._unproject(pos)\n });\n }\n }, {\n key: \"pan\",\n value: function pan(_ref3) {\n var pos = _ref3.pos,\n startPos = _ref3.startPos;\n\n var startPanLngLat = this._state.startPanLngLat || this._unproject(startPos);\n\n if (!startPanLngLat) {\n return this;\n }\n\n var _this$_calculateNewLn = this._calculateNewLngLat({\n startPanLngLat: startPanLngLat,\n pos: pos\n }),\n _this$_calculateNewLn2 = slicedToArray_slicedToArray(_this$_calculateNewLn, 2),\n longitude = _this$_calculateNewLn2[0],\n latitude = _this$_calculateNewLn2[1];\n\n return this._getUpdatedMapState({\n longitude: longitude,\n latitude: latitude\n });\n }\n }, {\n key: \"panEnd\",\n value: function panEnd() {\n return this._getUpdatedMapState({\n startPanLngLat: null\n });\n }\n }, {\n key: \"rotateStart\",\n value: function rotateStart(_ref4) {\n var pos = _ref4.pos;\n return this._getUpdatedMapState({\n startRotatePos: pos,\n startBearing: this._viewportProps.bearing,\n startPitch: this._viewportProps.pitch\n });\n }\n }, {\n key: \"rotate\",\n value: function rotate(_ref5) {\n var pos = _ref5.pos,\n _ref5$deltaAngleX = _ref5.deltaAngleX,\n deltaAngleX = _ref5$deltaAngleX === void 0 ? 0 : _ref5$deltaAngleX,\n _ref5$deltaAngleY = _ref5.deltaAngleY,\n deltaAngleY = _ref5$deltaAngleY === void 0 ? 0 : _ref5$deltaAngleY;\n var _this$_state = this._state,\n startRotatePos = _this$_state.startRotatePos,\n startBearing = _this$_state.startBearing,\n startPitch = _this$_state.startPitch;\n\n if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) {\n return this;\n }\n\n var newRotation;\n\n if (pos) {\n newRotation = this._calculateNewPitchAndBearing(map_state_objectSpread(map_state_objectSpread({}, this._getRotationParams(pos, startRotatePos)), {}, {\n startBearing: startBearing,\n startPitch: startPitch\n }));\n } else {\n newRotation = {\n bearing: startBearing + deltaAngleX,\n pitch: startPitch + deltaAngleY\n };\n }\n\n return this._getUpdatedMapState(newRotation);\n }\n }, {\n key: \"rotateEnd\",\n value: function rotateEnd() {\n return this._getUpdatedMapState({\n startBearing: null,\n startPitch: null\n });\n }\n }, {\n key: \"zoomStart\",\n value: function zoomStart(_ref6) {\n var pos = _ref6.pos;\n return this._getUpdatedMapState({\n startZoomLngLat: this._unproject(pos),\n startZoom: this._viewportProps.zoom\n });\n }\n }, {\n key: \"zoom\",\n value: function zoom(_ref7) {\n var pos = _ref7.pos,\n startPos = _ref7.startPos,\n scale = _ref7.scale;\n utils_assert_assert(scale > 0, '`scale` must be a positive number');\n var _this$_state2 = this._state,\n startZoom = _this$_state2.startZoom,\n startZoomLngLat = _this$_state2.startZoomLngLat;\n\n if (!Number.isFinite(startZoom)) {\n startZoom = this._viewportProps.zoom;\n startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n }\n\n utils_assert_assert(startZoomLngLat, '`startZoomLngLat` prop is required ' + 'for zoom behavior to calculate where to position the map.');\n\n var zoom = this._calculateNewZoom({\n scale: scale,\n startZoom: startZoom || 0\n });\n\n var zoomedViewport = new WebMercatorViewport(Object.assign({}, this._viewportProps, {\n zoom: zoom\n }));\n\n var _zoomedViewport$getMa = zoomedViewport.getMapCenterByLngLatPosition({\n lngLat: startZoomLngLat,\n pos: pos\n }),\n _zoomedViewport$getMa2 = slicedToArray_slicedToArray(_zoomedViewport$getMa, 2),\n longitude = _zoomedViewport$getMa2[0],\n latitude = _zoomedViewport$getMa2[1];\n\n return this._getUpdatedMapState({\n zoom: zoom,\n longitude: longitude,\n latitude: latitude\n });\n }\n }, {\n key: \"zoomEnd\",\n value: function zoomEnd() {\n return this._getUpdatedMapState({\n startZoomLngLat: null,\n startZoom: null\n });\n }\n }, {\n key: \"_getUpdatedMapState\",\n value: function _getUpdatedMapState(newProps) {\n return new MapState(Object.assign({}, this._viewportProps, this._state, newProps));\n }\n }, {\n key: \"_applyConstraints\",\n value: function _applyConstraints(props) {\n var maxZoom = props.maxZoom,\n minZoom = props.minZoom,\n zoom = props.zoom;\n props.zoom = clamp(zoom, minZoom, maxZoom);\n var maxPitch = props.maxPitch,\n minPitch = props.minPitch,\n pitch = props.pitch;\n props.pitch = clamp(pitch, minPitch, maxPitch);\n Object.assign(props, normalizeViewportProps(props));\n return props;\n }\n }, {\n key: \"_unproject\",\n value: function _unproject(pos) {\n var viewport = new WebMercatorViewport(this._viewportProps);\n return pos && viewport.unproject(pos);\n }\n }, {\n key: \"_calculateNewLngLat\",\n value: function _calculateNewLngLat(_ref8) {\n var startPanLngLat = _ref8.startPanLngLat,\n pos = _ref8.pos;\n var viewport = new WebMercatorViewport(this._viewportProps);\n return viewport.getMapCenterByLngLatPosition({\n lngLat: startPanLngLat,\n pos: pos\n });\n }\n }, {\n key: \"_calculateNewZoom\",\n value: function _calculateNewZoom(_ref9) {\n var scale = _ref9.scale,\n startZoom = _ref9.startZoom;\n var _this$_viewportProps = this._viewportProps,\n maxZoom = _this$_viewportProps.maxZoom,\n minZoom = _this$_viewportProps.minZoom;\n var zoom = startZoom + Math.log2(scale);\n return clamp(zoom, minZoom, maxZoom);\n }\n }, {\n key: \"_calculateNewPitchAndBearing\",\n value: function _calculateNewPitchAndBearing(_ref10) {\n var deltaScaleX = _ref10.deltaScaleX,\n deltaScaleY = _ref10.deltaScaleY,\n startBearing = _ref10.startBearing,\n startPitch = _ref10.startPitch;\n deltaScaleY = clamp(deltaScaleY, -1, 1);\n var _this$_viewportProps2 = this._viewportProps,\n minPitch = _this$_viewportProps2.minPitch,\n maxPitch = _this$_viewportProps2.maxPitch;\n var bearing = startBearing + 180 * deltaScaleX;\n var pitch = startPitch;\n\n if (deltaScaleY > 0) {\n pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n } else if (deltaScaleY < 0) {\n pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n }\n\n return {\n pitch: pitch,\n bearing: bearing\n };\n }\n }, {\n key: \"_getRotationParams\",\n value: function _getRotationParams(pos, startPos) {\n var deltaX = pos[0] - startPos[0];\n var deltaY = pos[1] - startPos[1];\n var centerY = pos[1];\n var startY = startPos[1];\n var _this$_viewportProps3 = this._viewportProps,\n width = _this$_viewportProps3.width,\n height = _this$_viewportProps3.height;\n var deltaScaleX = deltaX / width;\n var deltaScaleY = 0;\n\n if (deltaY > 0) {\n if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) {\n deltaScaleY = deltaY / (startY - height) * PITCH_ACCEL;\n }\n } else if (deltaY < 0) {\n if (startY > PITCH_MOUSE_THRESHOLD) {\n deltaScaleY = 1 - centerY / startY;\n }\n }\n\n deltaScaleY = Math.min(1, Math.max(-1, deltaScaleY));\n return {\n deltaScaleX: deltaScaleX,\n deltaScaleY: deltaScaleY\n };\n }\n }]);\n\n return MapState;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-constraints.js\n\n\nfunction decapitalize(s) {\n return s[0].toLowerCase() + s.slice(1);\n}\n\nfunction checkVisibilityConstraints(props) {\n var constraints = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : MAPBOX_LIMITS;\n\n for (var constraintName in constraints) {\n var type = constraintName.slice(0, 3);\n var propName = decapitalize(constraintName.slice(3));\n\n if (type === 'min' && props[propName] < constraints[constraintName]) {\n return false;\n }\n\n if (type === 'max' && props[propName] > constraints[constraintName]) {\n return false;\n }\n }\n\n return true;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/map-context.js\n\n\n\nfunction map_context_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_context_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_context_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_context_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar MapContext = (0,react.createContext)({\n viewport: null,\n map: null,\n container: null,\n onViewportChange: null,\n onViewStateChange: null,\n eventManager: null\n});\nvar MapContextProvider = MapContext.Provider;\n\nfunction WrappedProvider(_ref) {\n var value = _ref.value,\n children = _ref.children;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n map = _useState2[0],\n setMap = _useState2[1];\n\n var context = (0,react.useContext)(MapContext);\n value = map_context_objectSpread(map_context_objectSpread({\n setMap: setMap\n }, context), {}, {\n map: context && context.map || map\n }, value);\n return react.createElement(MapContextProvider, {\n value: value\n }, children);\n}\n\nMapContext.Provider = WrappedProvider;\n/* harmony default export */ var map_context = (MapContext);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/use-isomorphic-layout-effect.js\n\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? react.useLayoutEffect : react.useEffect;\n/* harmony default export */ var use_isomorphic_layout_effect = (useIsomorphicLayoutEffect);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/terrain.js\nfunction getTerrainElevation(map, _ref) {\n var longitude = _ref.longitude,\n latitude = _ref.latitude;\n\n if (map && map.queryTerrainElevation) {\n return map.queryTerrainElevation([longitude, latitude]) || 0;\n }\n\n return 0;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/static-map.js\n\n\n\nfunction static_map_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction static_map_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n static_map_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n static_map_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\n\n\nvar TOKEN_DOC_URL = 'https://visgl.github.io/react-map-gl/docs/get-started/mapbox-tokens';\nvar NO_TOKEN_WARNING = 'A valid API access token is required to use Mapbox data';\n\nfunction static_map_noop() {}\n\nfunction getViewport(_ref) {\n var map = _ref.map,\n props = _ref.props,\n width = _ref.width,\n height = _ref.height;\n\n var viewportProps = static_map_objectSpread(static_map_objectSpread(static_map_objectSpread({}, props), props.viewState), {}, {\n width: width,\n height: height\n });\n\n viewportProps.position = [0, 0, getTerrainElevation(map, viewportProps)];\n return new WebMercatorViewport(viewportProps);\n}\nvar UNAUTHORIZED_ERROR_CODE = 401;\nvar CONTAINER_STYLE = {\n position: 'absolute',\n width: '100%',\n height: '100%',\n overflow: 'hidden'\n};\nvar static_map_defaultProps = Object.assign({}, Mapbox.defaultProps, {\n disableTokenWarning: false,\n visible: true,\n onResize: static_map_noop,\n className: '',\n style: null,\n visibilityConstraints: MAPBOX_LIMITS\n});\n\nfunction NoTokenWarning() {\n var style = {\n position: 'absolute',\n left: 0,\n top: 0\n };\n return react.createElement(\"div\", {\n key: \"warning\",\n id: \"no-token-warning\",\n style: style\n }, react.createElement(\"h3\", {\n key: \"header\"\n }, NO_TOKEN_WARNING), react.createElement(\"div\", {\n key: \"text\"\n }, \"For information on setting up your basemap, read\"), react.createElement(\"a\", {\n key: \"link\",\n href: TOKEN_DOC_URL\n }, \"Note on Map Tokens\"));\n}\n\nfunction getRefHandles(mapboxRef) {\n return {\n getMap: function getMap() {\n return mapboxRef.current && mapboxRef.current.getMap();\n },\n queryRenderedFeatures: function queryRenderedFeatures(geometry) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var map = mapboxRef.current && mapboxRef.current.getMap();\n return map && map.queryRenderedFeatures(geometry, options);\n }\n };\n}\n\nvar StaticMap = (0,react.forwardRef)(function (props, ref) {\n var _useState = (0,react.useState)(true),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n accessTokenValid = _useState2[0],\n setTokenState = _useState2[1];\n\n var _useState3 = (0,react.useState)({\n width: 0,\n height: 0\n }),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n size = _useState4[0],\n setSize = _useState4[1];\n\n var mapboxRef = (0,react.useRef)(null);\n var mapDivRef = (0,react.useRef)(null);\n var containerRef = (0,react.useRef)(null);\n var overlayRef = (0,react.useRef)(null);\n var context = (0,react.useContext)(map_context);\n use_isomorphic_layout_effect(function () {\n if (!StaticMap.supported()) {\n return undefined;\n }\n\n var mapbox = new Mapbox(static_map_objectSpread(static_map_objectSpread(static_map_objectSpread({}, props), size), {}, {\n mapboxgl: (maplibre_gl_default()),\n container: mapDivRef.current,\n onError: function onError(evt) {\n var statusCode = evt.error && evt.error.status || evt.status;\n\n if (statusCode === UNAUTHORIZED_ERROR_CODE && accessTokenValid) {\n console.error(NO_TOKEN_WARNING);\n setTokenState(false);\n }\n\n props.onError(evt);\n }\n }));\n mapboxRef.current = mapbox;\n\n if (context && context.setMap) {\n context.setMap(mapbox.getMap());\n }\n\n var resizeObserver = new ResizeObserver_es(function (entries) {\n if (entries[0].contentRect) {\n var _entries$0$contentRec = entries[0].contentRect,\n _width = _entries$0$contentRec.width,\n _height = _entries$0$contentRec.height;\n setSize({\n width: _width,\n height: _height\n });\n props.onResize({\n width: _width,\n height: _height\n });\n }\n });\n resizeObserver.observe(containerRef.current);\n return function () {\n mapbox.finalize();\n mapboxRef.current = null;\n resizeObserver.disconnect();\n };\n }, []);\n use_isomorphic_layout_effect(function () {\n if (mapboxRef.current) {\n mapboxRef.current.setProps(static_map_objectSpread(static_map_objectSpread({}, props), size));\n }\n });\n var map = mapboxRef.current && mapboxRef.current.getMap();\n (0,react.useImperativeHandle)(ref, function () {\n return getRefHandles(mapboxRef);\n }, []);\n var preventScroll = (0,react.useCallback)(function (_ref2) {\n var target = _ref2.target;\n\n if (target === overlayRef.current) {\n target.scrollTo(0, 0);\n }\n }, []);\n var overlays = map && react.createElement(MapContextProvider, {\n value: static_map_objectSpread(static_map_objectSpread({}, context), {}, {\n viewport: context.viewport || getViewport(static_map_objectSpread({\n map: map,\n props: props\n }, size)),\n map: map,\n container: context.container || containerRef.current\n })\n }, react.createElement(\"div\", {\n key: \"map-overlays\",\n className: \"overlays\",\n ref: overlayRef,\n style: CONTAINER_STYLE,\n onScroll: preventScroll\n }, props.children));\n var className = props.className,\n width = props.width,\n height = props.height,\n style = props.style,\n visibilityConstraints = props.visibilityConstraints;\n var mapContainerStyle = Object.assign({\n position: 'relative'\n }, style, {\n width: width,\n height: height\n });\n var visible = props.visible && checkVisibilityConstraints(props.viewState || props, visibilityConstraints);\n var mapStyle = Object.assign({}, CONTAINER_STYLE, {\n visibility: visible ? 'inherit' : 'hidden'\n });\n return react.createElement(\"div\", {\n key: \"map-container\",\n ref: containerRef,\n style: mapContainerStyle\n }, react.createElement(\"div\", {\n key: \"map-mapbox\",\n ref: mapDivRef,\n style: mapStyle,\n className: className\n }), overlays, !accessTokenValid && !props.disableTokenWarning && react.createElement(NoTokenWarning, null));\n});\n\nStaticMap.supported = function () {\n return (maplibre_gl_default()) && maplibre_gl_default().supported();\n};\n\nStaticMap.defaultProps = static_map_defaultProps;\n/* harmony default export */ var static_map = (StaticMap);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/transition-interpolator.js\n\n\n\n\nfunction transition_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = transition_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction transition_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return transition_interpolator_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 transition_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction transition_interpolator_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\n\n\n\nvar TransitionInterpolator = function () {\n function TransitionInterpolator() {\n _classCallCheck(this, TransitionInterpolator);\n\n _defineProperty(this, \"propNames\", []);\n }\n\n _createClass(TransitionInterpolator, [{\n key: \"arePropsEqual\",\n value: function arePropsEqual(currentProps, nextProps) {\n var _iterator = transition_interpolator_createForOfIteratorHelper(this.propNames || []),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n\n if (!math_utils_equals(currentProps[key], nextProps[key])) {\n return false;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return true;\n }\n }, {\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n return {\n start: startProps,\n end: endProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n utils_assert_assert(false, 'interpolateProps is not implemented');\n }\n }, {\n key: \"getDuration\",\n value: function getDuration(startProps, endProps) {\n return endProps.transitionDuration;\n }\n }]);\n\n return TransitionInterpolator;\n}();\n\n\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// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nvar setPrototypeOf = __webpack_require__(4665);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js\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/* default */.Z)(subClass, superClass);\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/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}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js\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}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/transition-utils.js\nvar WRAPPED_ANGULAR_PROPS = {\n longitude: 1,\n bearing: 1\n};\nfunction transition_utils_mod(value, divisor) {\n var modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction isValid(prop) {\n return Number.isFinite(prop) || Array.isArray(prop);\n}\n\nfunction isWrappedAngularProp(propName) {\n return propName in WRAPPED_ANGULAR_PROPS;\n}\n\nfunction getEndValueByShortestPath(propName, startValue, endValue) {\n if (isWrappedAngularProp(propName) && Math.abs(endValue - startValue) > 180) {\n endValue = endValue < 0 ? endValue + 360 : endValue - 360;\n }\n\n return endValue;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/viewport-fly-to-interpolator.js\n\n\n\n\n\n\n\n\nfunction viewport_fly_to_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = viewport_fly_to_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction viewport_fly_to_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return viewport_fly_to_interpolator_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 viewport_fly_to_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction viewport_fly_to_interpolator_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\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\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 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\n\nvar viewport_fly_to_interpolator_VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\nvar REQUIRED_PROPS = ['latitude', 'longitude', 'zoom', 'width', 'height'];\nvar LINEARLY_INTERPOLATED_PROPS = ['bearing', 'pitch'];\nvar viewport_fly_to_interpolator_DEFAULT_OPTS = {\n speed: 1.2,\n curve: 1.414\n};\n\nvar ViewportFlyToInterpolator = function (_TransitionInterpolat) {\n _inherits(ViewportFlyToInterpolator, _TransitionInterpolat);\n\n var _super = _createSuper(ViewportFlyToInterpolator);\n\n function ViewportFlyToInterpolator() {\n var _this;\n\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, ViewportFlyToInterpolator);\n\n _this = _super.call(this);\n\n _defineProperty(_assertThisInitialized(_this), \"propNames\", viewport_fly_to_interpolator_VIEWPORT_TRANSITION_PROPS);\n\n _this.props = Object.assign({}, viewport_fly_to_interpolator_DEFAULT_OPTS, props);\n return _this;\n }\n\n _createClass(ViewportFlyToInterpolator, [{\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n var startViewportProps = {};\n var endViewportProps = {};\n\n var _iterator = viewport_fly_to_interpolator_createForOfIteratorHelper(REQUIRED_PROPS),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n utils_assert_assert(isValid(startValue) && isValid(endValue), \"\".concat(key, \" must be supplied for transition\"));\n startViewportProps[key] = startValue;\n endViewportProps[key] = getEndValueByShortestPath(key, startValue, endValue);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var _iterator2 = viewport_fly_to_interpolator_createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _key = _step2.value;\n\n var _startValue = startProps[_key] || 0;\n\n var _endValue = endProps[_key] || 0;\n\n startViewportProps[_key] = _startValue;\n endViewportProps[_key] = getEndValueByShortestPath(_key, _startValue, _endValue);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n return {\n start: startViewportProps,\n end: endViewportProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n var viewport = flyToViewport(startProps, endProps, t, this.props);\n\n var _iterator3 = viewport_fly_to_interpolator_createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var key = _step3.value;\n viewport[key] = utils_math_utils_lerp(startProps[key], endProps[key], t);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n return viewport;\n }\n }, {\n key: \"getDuration\",\n value: function getDuration(startProps, endProps) {\n var transitionDuration = endProps.transitionDuration;\n\n if (transitionDuration === 'auto') {\n transitionDuration = getFlyToDuration(startProps, endProps, this.props);\n }\n\n return transitionDuration;\n }\n }]);\n\n return ViewportFlyToInterpolator;\n}(TransitionInterpolator);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/linear-interpolator.js\n\n\n\n\n\n\n\nfunction linear_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = linear_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction linear_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return linear_interpolator_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 linear_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction linear_interpolator_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\nfunction linear_interpolator_createSuper(Derived) {\n var hasNativeReflectConstruct = linear_interpolator_isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction linear_interpolator_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 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\n\nvar linear_interpolator_VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\n\nvar LinearInterpolator = function (_TransitionInterpolat) {\n _inherits(LinearInterpolator, _TransitionInterpolat);\n\n var _super = linear_interpolator_createSuper(LinearInterpolator);\n\n function LinearInterpolator() {\n var _this;\n\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, LinearInterpolator);\n\n _this = _super.call(this);\n\n if (Array.isArray(opts)) {\n opts = {\n transitionProps: opts\n };\n }\n\n _this.propNames = opts.transitionProps || linear_interpolator_VIEWPORT_TRANSITION_PROPS;\n\n if (opts.around) {\n _this.around = opts.around;\n }\n\n return _this;\n }\n\n _createClass(LinearInterpolator, [{\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n var startViewportProps = {};\n var endViewportProps = {};\n\n if (this.around) {\n startViewportProps.around = this.around;\n var aroundLngLat = new WebMercatorViewport(startProps).unproject(this.around);\n Object.assign(endViewportProps, endProps, {\n around: new WebMercatorViewport(endProps).project(aroundLngLat),\n aroundLngLat: aroundLngLat\n });\n }\n\n var _iterator = linear_interpolator_createForOfIteratorHelper(this.propNames),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n utils_assert_assert(isValid(startValue) && isValid(endValue), \"\".concat(key, \" must be supplied for transition\"));\n startViewportProps[key] = startValue;\n endViewportProps[key] = getEndValueByShortestPath(key, startValue, endValue);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return {\n start: startViewportProps,\n end: endViewportProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n var viewport = {};\n\n var _iterator2 = linear_interpolator_createForOfIteratorHelper(this.propNames),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var key = _step2.value;\n viewport[key] = utils_math_utils_lerp(startProps[key], endProps[key], t);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (endProps.around) {\n var _WebMercatorViewport$ = new WebMercatorViewport(Object.assign({}, endProps, viewport)).getMapCenterByLngLatPosition({\n lngLat: endProps.aroundLngLat,\n pos: utils_math_utils_lerp(startProps.around, endProps.around, t)\n }),\n _WebMercatorViewport$2 = slicedToArray_slicedToArray(_WebMercatorViewport$, 2),\n longitude = _WebMercatorViewport$2[0],\n latitude = _WebMercatorViewport$2[1];\n\n viewport.longitude = longitude;\n viewport.latitude = latitude;\n }\n\n return viewport;\n }\n }]);\n\n return LinearInterpolator;\n}(TransitionInterpolator);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/index.js\n\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition-manager.js\n\n\n\n\n\n\n\nvar transition_manager_noop = function noop() {};\n\nfunction cropEasingFunction(easing, x0) {\n var y0 = easing(x0);\n return function (t) {\n return 1 / (1 - y0) * (easing(t * (1 - x0) + x0) - y0);\n };\n}\nvar TRANSITION_EVENTS = {\n BREAK: 1,\n SNAP_TO_END: 2,\n IGNORE: 3,\n UPDATE: 4\n};\nvar DEFAULT_PROPS = {\n transitionDuration: 0,\n transitionEasing: function transitionEasing(t) {\n return t;\n },\n transitionInterpolator: new LinearInterpolator(),\n transitionInterruption: TRANSITION_EVENTS.BREAK,\n onTransitionStart: transition_manager_noop,\n onTransitionInterrupt: transition_manager_noop,\n onTransitionEnd: transition_manager_noop\n};\n\nvar TransitionManager = function () {\n function TransitionManager() {\n var _this = this;\n\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, TransitionManager);\n\n _defineProperty(this, \"_animationFrame\", null);\n\n _defineProperty(this, \"_onTransitionFrame\", function () {\n _this._animationFrame = requestAnimationFrame(_this._onTransitionFrame);\n\n _this._updateViewport();\n });\n\n this.props = null;\n this.onViewportChange = opts.onViewportChange || transition_manager_noop;\n this.onStateChange = opts.onStateChange || transition_manager_noop;\n this.time = opts.getTime || Date.now;\n }\n\n _createClass(TransitionManager, [{\n key: \"getViewportInTransition\",\n value: function getViewportInTransition() {\n return this._animationFrame ? this.state.propsInTransition : null;\n }\n }, {\n key: \"processViewportChange\",\n value: function processViewportChange(nextProps) {\n var currentProps = this.props;\n this.props = nextProps;\n\n if (!currentProps || this._shouldIgnoreViewportChange(currentProps, nextProps)) {\n return false;\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n var startProps = Object.assign({}, currentProps);\n var endProps = Object.assign({}, nextProps);\n\n if (this._isTransitionInProgress()) {\n currentProps.onTransitionInterrupt();\n\n if (this.state.interruption === TRANSITION_EVENTS.SNAP_TO_END) {\n Object.assign(startProps, this.state.endProps);\n } else {\n Object.assign(startProps, this.state.propsInTransition);\n }\n\n if (this.state.interruption === TRANSITION_EVENTS.UPDATE) {\n var currentTime = this.time();\n var x0 = (currentTime - this.state.startTime) / this.state.duration;\n endProps.transitionDuration = this.state.duration - (currentTime - this.state.startTime);\n endProps.transitionEasing = cropEasingFunction(this.state.easing, x0);\n endProps.transitionInterpolator = startProps.transitionInterpolator;\n }\n }\n\n endProps.onTransitionStart();\n\n this._triggerTransition(startProps, endProps);\n\n return true;\n }\n\n if (this._isTransitionInProgress()) {\n currentProps.onTransitionInterrupt();\n\n this._endTransition();\n }\n\n return false;\n }\n }, {\n key: \"_isTransitionInProgress\",\n value: function _isTransitionInProgress() {\n return Boolean(this._animationFrame);\n }\n }, {\n key: \"_isTransitionEnabled\",\n value: function _isTransitionEnabled(props) {\n var transitionDuration = props.transitionDuration,\n transitionInterpolator = props.transitionInterpolator;\n return (transitionDuration > 0 || transitionDuration === 'auto') && Boolean(transitionInterpolator);\n }\n }, {\n key: \"_isUpdateDueToCurrentTransition\",\n value: function _isUpdateDueToCurrentTransition(props) {\n if (this.state.propsInTransition) {\n return this.state.interpolator.arePropsEqual(props, this.state.propsInTransition);\n }\n\n return false;\n }\n }, {\n key: \"_shouldIgnoreViewportChange\",\n value: function _shouldIgnoreViewportChange(currentProps, nextProps) {\n if (!currentProps) {\n return true;\n }\n\n if (this._isTransitionInProgress()) {\n return this.state.interruption === TRANSITION_EVENTS.IGNORE || this._isUpdateDueToCurrentTransition(nextProps);\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n return nextProps.transitionInterpolator.arePropsEqual(currentProps, nextProps);\n }\n\n return true;\n }\n }, {\n key: \"_triggerTransition\",\n value: function _triggerTransition(startProps, endProps) {\n utils_assert_assert(this._isTransitionEnabled(endProps));\n\n if (this._animationFrame) {\n cancelAnimationFrame(this._animationFrame);\n }\n\n var transitionInterpolator = endProps.transitionInterpolator;\n var duration = transitionInterpolator.getDuration ? transitionInterpolator.getDuration(startProps, endProps) : endProps.transitionDuration;\n\n if (duration === 0) {\n return;\n }\n\n var initialProps = endProps.transitionInterpolator.initializeProps(startProps, endProps);\n var interactionState = {\n inTransition: true,\n isZooming: startProps.zoom !== endProps.zoom,\n isPanning: startProps.longitude !== endProps.longitude || startProps.latitude !== endProps.latitude,\n isRotating: startProps.bearing !== endProps.bearing || startProps.pitch !== endProps.pitch\n };\n this.state = {\n duration: duration,\n easing: endProps.transitionEasing,\n interpolator: endProps.transitionInterpolator,\n interruption: endProps.transitionInterruption,\n startTime: this.time(),\n startProps: initialProps.start,\n endProps: initialProps.end,\n animation: null,\n propsInTransition: {}\n };\n\n this._onTransitionFrame();\n\n this.onStateChange(interactionState);\n }\n }, {\n key: \"_endTransition\",\n value: function _endTransition() {\n if (this._animationFrame) {\n cancelAnimationFrame(this._animationFrame);\n this._animationFrame = null;\n }\n\n this.onStateChange({\n inTransition: false,\n isZooming: false,\n isPanning: false,\n isRotating: false\n });\n }\n }, {\n key: \"_updateViewport\",\n value: function _updateViewport() {\n var currentTime = this.time();\n var _this$state = this.state,\n startTime = _this$state.startTime,\n duration = _this$state.duration,\n easing = _this$state.easing,\n interpolator = _this$state.interpolator,\n startProps = _this$state.startProps,\n endProps = _this$state.endProps;\n var shouldEnd = false;\n var t = (currentTime - startTime) / duration;\n\n if (t >= 1) {\n t = 1;\n shouldEnd = true;\n }\n\n t = easing(t);\n var viewport = interpolator.interpolateProps(startProps, endProps, t);\n var mapState = new MapState(Object.assign({}, this.props, viewport));\n this.state.propsInTransition = mapState.getViewportProps();\n this.onViewportChange(this.state.propsInTransition, this.props);\n\n if (shouldEnd) {\n this._endTransition();\n\n this.props.onTransitionEnd();\n }\n }\n }]);\n\n return TransitionManager;\n}();\n\n_defineProperty(TransitionManager, \"defaultProps\", DEFAULT_PROPS);\n\n\n// EXTERNAL MODULE: ./node_modules/hammerjs/hammer.js\nvar hammer = __webpack_require__(5087);\nvar hammer_default = /*#__PURE__*/__webpack_require__.n(hammer);\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/hammer-overrides.js\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nfunction some(array, predict) {\n for (var i = 0; i < array.length; i++) {\n if (predict(array[i])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction enhancePointerEventInput(PointerEventInput) {\n var oldHandler = PointerEventInput.prototype.handler;\n\n PointerEventInput.prototype.handler = function handler(ev) {\n var store = this.store;\n\n if (ev.button > 0 && ev.type === 'pointerdown') {\n if (!some(store, function (e) {\n return e.pointerId === ev.pointerId;\n })) {\n store.push(ev);\n }\n }\n\n oldHandler.call(this, ev);\n };\n}\nfunction enhanceMouseInput(MouseInput) {\n MouseInput.prototype.handler = function handler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n if (eventType & INPUT_START && ev.button >= 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which === 0) {\n eventType = INPUT_END;\n }\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: 'mouse',\n srcEvent: ev\n });\n };\n}\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/hammer.browser.js\n\n\nenhancePointerEventInput((hammer_default()).PointerEventInput);\nenhanceMouseInput((hammer_default()).MouseInput);\nvar Manager = (hammer_default()).Manager;\n/* harmony default export */ var hammer_browser = ((hammer_default()));\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/constants.js\n\nvar RECOGNIZERS = hammer_browser ? [[hammer_browser.Pan, {\n event: 'tripan',\n pointers: 3,\n threshold: 0,\n enable: false\n}], [hammer_browser.Rotate, {\n enable: false\n}], [hammer_browser.Pinch, {\n enable: false\n}], [hammer_browser.Swipe, {\n enable: false\n}], [hammer_browser.Pan, {\n threshold: 0,\n enable: false\n}], [hammer_browser.Press, {\n enable: false\n}], [hammer_browser.Tap, {\n event: 'doubletap',\n taps: 2,\n enable: false\n}], [hammer_browser.Tap, {\n event: 'anytap',\n enable: false\n}], [hammer_browser.Tap, {\n enable: false\n}]] : null;\nvar RECOGNIZER_COMPATIBLE_MAP = {\n tripan: ['rotate', 'pinch', 'pan'],\n rotate: ['pinch'],\n pinch: ['pan'],\n pan: ['press', 'doubletap', 'anytap', 'tap'],\n doubletap: ['anytap'],\n anytap: ['tap']\n};\nvar RECOGNIZER_FALLBACK_MAP = {\n doubletap: ['tap']\n};\nvar BASIC_EVENT_ALIASES = {\n pointerdown: 'pointerdown',\n pointermove: 'pointermove',\n pointerup: 'pointerup',\n touchstart: 'pointerdown',\n touchmove: 'pointermove',\n touchend: 'pointerup',\n mousedown: 'pointerdown',\n mousemove: 'pointermove',\n mouseup: 'pointerup'\n};\nvar INPUT_EVENT_TYPES = {\n KEY_EVENTS: ['keydown', 'keyup'],\n MOUSE_EVENTS: ['mousedown', 'mousemove', 'mouseup', 'mouseover', 'mouseout', 'mouseleave'],\n WHEEL_EVENTS: ['wheel', 'mousewheel']\n};\nvar EVENT_RECOGNIZER_MAP = {\n tap: 'tap',\n anytap: 'anytap',\n doubletap: 'doubletap',\n press: 'press',\n pinch: 'pinch',\n pinchin: 'pinch',\n pinchout: 'pinch',\n pinchstart: 'pinch',\n pinchmove: 'pinch',\n pinchend: 'pinch',\n pinchcancel: 'pinch',\n rotate: 'rotate',\n rotatestart: 'rotate',\n rotatemove: 'rotate',\n rotateend: 'rotate',\n rotatecancel: 'rotate',\n tripan: 'tripan',\n tripanstart: 'tripan',\n tripanmove: 'tripan',\n tripanup: 'tripan',\n tripandown: 'tripan',\n tripanleft: 'tripan',\n tripanright: 'tripan',\n tripanend: 'tripan',\n tripancancel: 'tripan',\n pan: 'pan',\n panstart: 'pan',\n panmove: 'pan',\n panup: 'pan',\n pandown: 'pan',\n panleft: 'pan',\n panright: 'pan',\n panend: 'pan',\n pancancel: 'pan',\n swipe: 'swipe',\n swipeleft: 'swipe',\n swiperight: 'swipe',\n swipeup: 'swipe',\n swipedown: 'swipe'\n};\nvar GESTURE_EVENT_ALIASES = {\n click: 'tap',\n anyclick: 'anytap',\n dblclick: 'doubletap',\n mousedown: 'pointerdown',\n mousemove: 'pointermove',\n mouseup: 'pointerup',\n mouseover: 'pointerover',\n mouseout: 'pointerout',\n mouseleave: 'pointerleave'\n};\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/globals.js\nvar userAgent = typeof navigator !== 'undefined' && navigator.userAgent ? navigator.userAgent.toLowerCase() : '';\nvar globals_window_ = typeof window !== 'undefined' ? window : __webpack_require__.g;\nvar globals_global_ = typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : window;\nvar globals_document_ = typeof document !== 'undefined' ? document : {};\n\nvar passiveSupported = false;\n\ntry {\n var options = {\n get passive() {\n passiveSupported = true;\n return true;\n }\n\n };\n globals_window_.addEventListener('test', options, options);\n globals_window_.removeEventListener('test', options, options);\n} catch (err) {}\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/wheel-input.js\n\n\n\n\nvar firefox = userAgent.indexOf('firefox') !== -1;\nvar WHEEL_EVENTS = INPUT_EVENT_TYPES.WHEEL_EVENTS;\nvar EVENT_TYPE = 'wheel';\nvar WHEEL_DELTA_MAGIC_SCALER = 4.000244140625;\nvar WHEEL_DELTA_PER_LINE = 40;\nvar SHIFT_MULTIPLIER = 0.25;\n\nvar WheelInput = /*#__PURE__*/function () {\n function WheelInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, WheelInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.events = WHEEL_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent, passiveSupported ? {\n passive: false\n } : false);\n });\n }\n\n _createClass(WheelInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === EVENT_TYPE) {\n this.options.enable = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (!this.options.enable) {\n return;\n }\n\n var value = event.deltaY;\n\n if (globals_window_.WheelEvent) {\n if (firefox && event.deltaMode === globals_window_.WheelEvent.DOM_DELTA_PIXEL) {\n value /= globals_window_.devicePixelRatio;\n }\n\n if (event.deltaMode === globals_window_.WheelEvent.DOM_DELTA_LINE) {\n value *= WHEEL_DELTA_PER_LINE;\n }\n }\n\n var wheelPosition = {\n x: event.clientX,\n y: event.clientY\n };\n\n if (value !== 0 && value % WHEEL_DELTA_MAGIC_SCALER === 0) {\n value = Math.floor(value / WHEEL_DELTA_MAGIC_SCALER);\n }\n\n if (event.shiftKey && value) {\n value = value * SHIFT_MULTIPLIER;\n }\n\n this._onWheel(event, -value, wheelPosition);\n }\n }, {\n key: \"_onWheel\",\n value: function _onWheel(srcEvent, delta, position) {\n this.callback({\n type: EVENT_TYPE,\n center: position,\n delta: delta,\n srcEvent: srcEvent,\n pointerType: 'mouse',\n target: srcEvent.target\n });\n }\n }]);\n\n return WheelInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/move-input.js\n\n\n\nvar MOUSE_EVENTS = INPUT_EVENT_TYPES.MOUSE_EVENTS;\nvar MOVE_EVENT_TYPE = 'pointermove';\nvar OVER_EVENT_TYPE = 'pointerover';\nvar OUT_EVENT_TYPE = 'pointerout';\nvar LEAVE_EVENT_TYPE = 'pointerleave';\n\nvar MoveInput = /*#__PURE__*/function () {\n function MoveInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, MoveInput);\n\n this.element = element;\n this.callback = callback;\n this.pressed = false;\n this.options = Object.assign({\n enable: true\n }, options);\n this.enableMoveEvent = this.options.enable;\n this.enableLeaveEvent = this.options.enable;\n this.enableOutEvent = this.options.enable;\n this.enableOverEvent = this.options.enable;\n this.events = MOUSE_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent);\n });\n }\n\n _createClass(MoveInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === MOVE_EVENT_TYPE) {\n this.enableMoveEvent = enabled;\n }\n\n if (eventType === OVER_EVENT_TYPE) {\n this.enableOverEvent = enabled;\n }\n\n if (eventType === OUT_EVENT_TYPE) {\n this.enableOutEvent = enabled;\n }\n\n if (eventType === LEAVE_EVENT_TYPE) {\n this.enableLeaveEvent = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n this.handleOverEvent(event);\n this.handleOutEvent(event);\n this.handleLeaveEvent(event);\n this.handleMoveEvent(event);\n }\n }, {\n key: \"handleOverEvent\",\n value: function handleOverEvent(event) {\n if (this.enableOverEvent) {\n if (event.type === 'mouseover') {\n this.callback({\n type: OVER_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleOutEvent\",\n value: function handleOutEvent(event) {\n if (this.enableOutEvent) {\n if (event.type === 'mouseout') {\n this.callback({\n type: OUT_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleLeaveEvent\",\n value: function handleLeaveEvent(event) {\n if (this.enableLeaveEvent) {\n if (event.type === 'mouseleave') {\n this.callback({\n type: LEAVE_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleMoveEvent\",\n value: function handleMoveEvent(event) {\n if (this.enableMoveEvent) {\n switch (event.type) {\n case 'mousedown':\n if (event.button >= 0) {\n this.pressed = true;\n }\n\n break;\n\n case 'mousemove':\n if (event.which === 0) {\n this.pressed = false;\n }\n\n if (!this.pressed) {\n this.callback({\n type: MOVE_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n\n break;\n\n case 'mouseup':\n this.pressed = false;\n break;\n\n default:\n }\n }\n }\n }]);\n\n return MoveInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/key-input.js\n\n\n\nvar KEY_EVENTS = INPUT_EVENT_TYPES.KEY_EVENTS;\nvar DOWN_EVENT_TYPE = 'keydown';\nvar UP_EVENT_TYPE = 'keyup';\n\nvar KeyInput = /*#__PURE__*/function () {\n function KeyInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, KeyInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.enableDownEvent = this.options.enable;\n this.enableUpEvent = this.options.enable;\n this.events = KEY_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n element.tabIndex = options.tabIndex || 0;\n element.style.outline = 'none';\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent);\n });\n }\n\n _createClass(KeyInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === DOWN_EVENT_TYPE) {\n this.enableDownEvent = enabled;\n }\n\n if (eventType === UP_EVENT_TYPE) {\n this.enableUpEvent = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n var targetElement = event.target || event.srcElement;\n\n if (targetElement.tagName === 'INPUT' && targetElement.type === 'text' || targetElement.tagName === 'TEXTAREA') {\n return;\n }\n\n if (this.enableDownEvent && event.type === 'keydown') {\n this.callback({\n type: DOWN_EVENT_TYPE,\n srcEvent: event,\n key: event.key,\n target: event.target\n });\n }\n\n if (this.enableUpEvent && event.type === 'keyup') {\n this.callback({\n type: UP_EVENT_TYPE,\n srcEvent: event,\n key: event.key,\n target: event.target\n });\n }\n }\n }]);\n\n return KeyInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/contextmenu-input.js\n\n\nvar contextmenu_input_EVENT_TYPE = 'contextmenu';\n\nvar ContextmenuInput = /*#__PURE__*/function () {\n function ContextmenuInput(element, callback) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, ContextmenuInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.handleEvent = this.handleEvent.bind(this);\n element.addEventListener('contextmenu', this.handleEvent);\n }\n\n _createClass(ContextmenuInput, [{\n key: \"destroy\",\n value: function destroy() {\n this.element.removeEventListener('contextmenu', this.handleEvent);\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === contextmenu_input_EVENT_TYPE) {\n this.options.enable = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (!this.options.enable) {\n return;\n }\n\n this.callback({\n type: contextmenu_input_EVENT_TYPE,\n center: {\n x: event.clientX,\n y: event.clientY\n },\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }]);\n\n return ContextmenuInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/event-utils.js\nvar DOWN_EVENT = 1;\nvar MOVE_EVENT = 2;\nvar UP_EVENT = 4;\nvar event_utils_MOUSE_EVENTS = {\n pointerdown: DOWN_EVENT,\n pointermove: MOVE_EVENT,\n pointerup: UP_EVENT,\n mousedown: DOWN_EVENT,\n mousemove: MOVE_EVENT,\n mouseup: UP_EVENT\n};\nvar MOUSE_EVENT_WHICH_LEFT = 1;\nvar MOUSE_EVENT_WHICH_MIDDLE = 2;\nvar MOUSE_EVENT_WHICH_RIGHT = 3;\nvar MOUSE_EVENT_BUTTON_LEFT = 0;\nvar MOUSE_EVENT_BUTTON_MIDDLE = 1;\nvar MOUSE_EVENT_BUTTON_RIGHT = 2;\nvar MOUSE_EVENT_BUTTONS_LEFT_MASK = 1;\nvar MOUSE_EVENT_BUTTONS_RIGHT_MASK = 2;\nvar MOUSE_EVENT_BUTTONS_MIDDLE_MASK = 4;\nfunction whichButtons(event) {\n var eventType = event_utils_MOUSE_EVENTS[event.srcEvent.type];\n\n if (!eventType) {\n return null;\n }\n\n var _event$srcEvent = event.srcEvent,\n buttons = _event$srcEvent.buttons,\n button = _event$srcEvent.button,\n which = _event$srcEvent.which;\n var leftButton = false;\n var middleButton = false;\n var rightButton = false;\n\n if (eventType === UP_EVENT || eventType === MOVE_EVENT && !Number.isFinite(buttons)) {\n leftButton = which === MOUSE_EVENT_WHICH_LEFT;\n middleButton = which === MOUSE_EVENT_WHICH_MIDDLE;\n rightButton = which === MOUSE_EVENT_WHICH_RIGHT;\n } else if (eventType === MOVE_EVENT) {\n leftButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_LEFT_MASK);\n middleButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_MIDDLE_MASK);\n rightButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_RIGHT_MASK);\n } else if (eventType === DOWN_EVENT) {\n leftButton = button === MOUSE_EVENT_BUTTON_LEFT;\n middleButton = button === MOUSE_EVENT_BUTTON_MIDDLE;\n rightButton = button === MOUSE_EVENT_BUTTON_RIGHT;\n }\n\n return {\n leftButton: leftButton,\n middleButton: middleButton,\n rightButton: rightButton\n };\n}\nfunction getOffsetPosition(event, rootElement) {\n var srcEvent = event.srcEvent;\n\n if (!event.center && !Number.isFinite(srcEvent.clientX)) {\n return null;\n }\n\n var center = event.center || {\n x: srcEvent.clientX,\n y: srcEvent.clientY\n };\n var rect = rootElement.getBoundingClientRect();\n var scaleX = rect.width / rootElement.offsetWidth || 1;\n var scaleY = rect.height / rootElement.offsetHeight || 1;\n var offsetCenter = {\n x: (center.x - rect.left - rootElement.clientLeft) / scaleX,\n y: (center.y - rect.top - rootElement.clientTop) / scaleY\n };\n return {\n center: center,\n offsetCenter: offsetCenter\n };\n}\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/event-registrar.js\n\n\n\nvar DEFAULT_OPTIONS = {\n srcElement: 'root',\n priority: 0\n};\n\nvar EventRegistrar = /*#__PURE__*/function () {\n function EventRegistrar(eventManager) {\n _classCallCheck(this, EventRegistrar);\n\n this.eventManager = eventManager;\n this.handlers = [];\n this.handlersByElement = new Map();\n this.handleEvent = this.handleEvent.bind(this);\n this._active = false;\n }\n\n _createClass(EventRegistrar, [{\n key: \"isEmpty\",\n value: function isEmpty() {\n return !this._active;\n }\n }, {\n key: \"add\",\n value: function add(type, handler, opts) {\n var once = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var handlers = this.handlers,\n handlersByElement = this.handlersByElement;\n\n if (opts && (typeof opts !== 'object' || opts.addEventListener)) {\n opts = {\n srcElement: opts\n };\n }\n\n opts = opts ? Object.assign({}, DEFAULT_OPTIONS, opts) : DEFAULT_OPTIONS;\n var entries = handlersByElement.get(opts.srcElement);\n\n if (!entries) {\n entries = [];\n handlersByElement.set(opts.srcElement, entries);\n }\n\n var entry = {\n type: type,\n handler: handler,\n srcElement: opts.srcElement,\n priority: opts.priority\n };\n\n if (once) {\n entry.once = true;\n }\n\n if (passive) {\n entry.passive = true;\n }\n\n handlers.push(entry);\n this._active = this._active || !entry.passive;\n var insertPosition = entries.length - 1;\n\n while (insertPosition >= 0) {\n if (entries[insertPosition].priority >= entry.priority) {\n break;\n }\n\n insertPosition--;\n }\n\n entries.splice(insertPosition + 1, 0, entry);\n }\n }, {\n key: \"remove\",\n value: function remove(type, handler) {\n var handlers = this.handlers,\n handlersByElement = this.handlersByElement;\n\n for (var i = handlers.length - 1; i >= 0; i--) {\n var entry = handlers[i];\n\n if (entry.type === type && entry.handler === handler) {\n handlers.splice(i, 1);\n var entries = handlersByElement.get(entry.srcElement);\n entries.splice(entries.indexOf(entry), 1);\n\n if (entries.length === 0) {\n handlersByElement.delete(entry.srcElement);\n }\n }\n }\n\n this._active = handlers.some(function (entry) {\n return !entry.passive;\n });\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (this.isEmpty()) {\n return;\n }\n\n var mjolnirEvent = this._normalizeEvent(event);\n\n var target = event.srcEvent.target;\n\n while (target && target !== mjolnirEvent.rootElement) {\n this._emit(mjolnirEvent, target);\n\n if (mjolnirEvent.handled) {\n return;\n }\n\n target = target.parentNode;\n }\n\n this._emit(mjolnirEvent, 'root');\n }\n }, {\n key: \"_emit\",\n value: function _emit(event, srcElement) {\n var entries = this.handlersByElement.get(srcElement);\n\n if (entries) {\n var immediatePropagationStopped = false;\n\n var stopPropagation = function stopPropagation() {\n event.handled = true;\n };\n\n var stopImmediatePropagation = function stopImmediatePropagation() {\n event.handled = true;\n immediatePropagationStopped = true;\n };\n\n var entriesToRemove = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i = entries[i],\n type = _entries$i.type,\n handler = _entries$i.handler,\n once = _entries$i.once;\n handler(Object.assign({}, event, {\n type: type,\n stopPropagation: stopPropagation,\n stopImmediatePropagation: stopImmediatePropagation\n }));\n\n if (once) {\n entriesToRemove.push(entries[i]);\n }\n\n if (immediatePropagationStopped) {\n break;\n }\n }\n\n for (var _i = 0; _i < entriesToRemove.length; _i++) {\n var _entriesToRemove$_i = entriesToRemove[_i],\n _type = _entriesToRemove$_i.type,\n _handler = _entriesToRemove$_i.handler;\n this.remove(_type, _handler);\n }\n }\n }\n }, {\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(event) {\n var rootElement = this.eventManager.element;\n return Object.assign({}, event, whichButtons(event), getOffsetPosition(event, rootElement), {\n handled: false,\n rootElement: rootElement\n });\n }\n }]);\n\n return EventRegistrar;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/event-manager.js\n\n\n\n\nfunction event_manager_createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = event_manager_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 event_manager_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return event_manager_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 event_manager_arrayLikeToArray(o, minLen); }\n\nfunction event_manager_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\n\n\n\n\n\n\n\nvar event_manager_DEFAULT_OPTIONS = {\n events: null,\n recognizers: null,\n recognizerOptions: {},\n Manager: Manager,\n touchAction: 'none',\n tabIndex: 0\n};\n\nvar EventManager = /*#__PURE__*/function () {\n function EventManager() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, EventManager);\n\n this.options = Object.assign({}, event_manager_DEFAULT_OPTIONS, options);\n this.events = new Map();\n this._onBasicInput = this._onBasicInput.bind(this);\n this._onOtherEvent = this._onOtherEvent.bind(this);\n this.setElement(element);\n var events = options.events;\n\n if (events) {\n this.on(events);\n }\n }\n\n _createClass(EventManager, [{\n key: \"setElement\",\n value: function setElement(element) {\n var _this = this;\n\n if (this.element) {\n this.destroy();\n }\n\n this.element = element;\n\n if (!element) {\n return;\n }\n\n var options = this.options;\n var ManagerClass = options.Manager;\n this.manager = new ManagerClass(element, {\n touchAction: options.touchAction,\n recognizers: options.recognizers || RECOGNIZERS\n }).on('hammer.input', this._onBasicInput);\n\n if (!options.recognizers) {\n Object.keys(RECOGNIZER_COMPATIBLE_MAP).forEach(function (name) {\n var recognizer = _this.manager.get(name);\n\n if (recognizer) {\n RECOGNIZER_COMPATIBLE_MAP[name].forEach(function (otherName) {\n recognizer.recognizeWith(otherName);\n });\n }\n });\n }\n\n for (var recognizerName in options.recognizerOptions) {\n var recognizer = this.manager.get(recognizerName);\n\n if (recognizer) {\n var recognizerOption = options.recognizerOptions[recognizerName];\n delete recognizerOption.enable;\n recognizer.set(recognizerOption);\n }\n }\n\n this.wheelInput = new WheelInput(element, this._onOtherEvent, {\n enable: false\n });\n this.moveInput = new MoveInput(element, this._onOtherEvent, {\n enable: false\n });\n this.keyInput = new KeyInput(element, this._onOtherEvent, {\n enable: false,\n tabIndex: options.tabIndex\n });\n this.contextmenuInput = new ContextmenuInput(element, this._onOtherEvent, {\n enable: false\n });\n\n var _iterator = event_manager_createForOfIteratorHelper(this.events),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = slicedToArray_slicedToArray(_step.value, 2),\n eventAlias = _step$value[0],\n eventRegistrar = _step$value[1];\n\n if (!eventRegistrar.isEmpty()) {\n this._toggleRecognizer(eventRegistrar.recognizerName, true);\n\n this.manager.on(eventAlias, eventRegistrar.handleEvent);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.element) {\n this.wheelInput.destroy();\n this.moveInput.destroy();\n this.keyInput.destroy();\n this.contextmenuInput.destroy();\n this.manager.destroy();\n this.wheelInput = null;\n this.moveInput = null;\n this.keyInput = null;\n this.contextmenuInput = null;\n this.manager = null;\n this.element = null;\n }\n }\n }, {\n key: \"on\",\n value: function on(event, handler, opts) {\n this._addEventHandler(event, handler, opts, false);\n }\n }, {\n key: \"once\",\n value: function once(event, handler, opts) {\n this._addEventHandler(event, handler, opts, true);\n }\n }, {\n key: \"watch\",\n value: function watch(event, handler, opts) {\n this._addEventHandler(event, handler, opts, false, true);\n }\n }, {\n key: \"off\",\n value: function off(event, handler) {\n this._removeEventHandler(event, handler);\n }\n }, {\n key: \"_toggleRecognizer\",\n value: function _toggleRecognizer(name, enabled) {\n var manager = this.manager;\n\n if (!manager) {\n return;\n }\n\n var recognizer = manager.get(name);\n\n if (recognizer && recognizer.options.enable !== enabled) {\n recognizer.set({\n enable: enabled\n });\n var fallbackRecognizers = RECOGNIZER_FALLBACK_MAP[name];\n\n if (fallbackRecognizers && !this.options.recognizers) {\n fallbackRecognizers.forEach(function (otherName) {\n var otherRecognizer = manager.get(otherName);\n\n if (enabled) {\n otherRecognizer.requireFailure(name);\n recognizer.dropRequireFailure(otherName);\n } else {\n otherRecognizer.dropRequireFailure(name);\n }\n });\n }\n }\n\n this.wheelInput.enableEventType(name, enabled);\n this.moveInput.enableEventType(name, enabled);\n this.keyInput.enableEventType(name, enabled);\n this.contextmenuInput.enableEventType(name, enabled);\n }\n }, {\n key: \"_addEventHandler\",\n value: function _addEventHandler(event, handler, opts, once, passive) {\n if (typeof event !== 'string') {\n opts = handler;\n\n for (var eventName in event) {\n this._addEventHandler(eventName, event[eventName], opts, once, passive);\n }\n\n return;\n }\n\n var manager = this.manager,\n events = this.events;\n var eventAlias = GESTURE_EVENT_ALIASES[event] || event;\n var eventRegistrar = events.get(eventAlias);\n\n if (!eventRegistrar) {\n eventRegistrar = new EventRegistrar(this);\n events.set(eventAlias, eventRegistrar);\n eventRegistrar.recognizerName = EVENT_RECOGNIZER_MAP[eventAlias] || eventAlias;\n\n if (manager) {\n manager.on(eventAlias, eventRegistrar.handleEvent);\n }\n }\n\n eventRegistrar.add(event, handler, opts, once, passive);\n\n if (!eventRegistrar.isEmpty()) {\n this._toggleRecognizer(eventRegistrar.recognizerName, true);\n }\n }\n }, {\n key: \"_removeEventHandler\",\n value: function _removeEventHandler(event, handler) {\n if (typeof event !== 'string') {\n for (var eventName in event) {\n this._removeEventHandler(eventName, event[eventName]);\n }\n\n return;\n }\n\n var events = this.events;\n var eventAlias = GESTURE_EVENT_ALIASES[event] || event;\n var eventRegistrar = events.get(eventAlias);\n\n if (!eventRegistrar) {\n return;\n }\n\n eventRegistrar.remove(event, handler);\n\n if (eventRegistrar.isEmpty()) {\n var recognizerName = eventRegistrar.recognizerName;\n var isRecognizerUsed = false;\n\n var _iterator2 = event_manager_createForOfIteratorHelper(events.values()),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var eh = _step2.value;\n\n if (eh.recognizerName === recognizerName && !eh.isEmpty()) {\n isRecognizerUsed = true;\n break;\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (!isRecognizerUsed) {\n this._toggleRecognizer(recognizerName, false);\n }\n }\n }\n }, {\n key: \"_onBasicInput\",\n value: function _onBasicInput(event) {\n var srcEvent = event.srcEvent;\n var alias = BASIC_EVENT_ALIASES[srcEvent.type];\n\n if (alias) {\n this.manager.emit(alias, event);\n }\n }\n }, {\n key: \"_onOtherEvent\",\n value: function _onOtherEvent(event) {\n this.manager.emit(event.type, event);\n }\n }]);\n\n return EventManager;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/index.js\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-controller.js\n\n\n\n\nfunction map_controller_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_controller_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_controller_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_controller_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar NO_TRANSITION_PROPS = {\n transitionDuration: 0\n};\nvar LINEAR_TRANSITION_PROPS = {\n transitionDuration: 300,\n transitionEasing: function transitionEasing(t) {\n return t;\n },\n transitionInterpolator: new LinearInterpolator(),\n transitionInterruption: TRANSITION_EVENTS.BREAK\n};\nvar DEFAULT_INERTIA = 300;\n\nvar INERTIA_EASING = function INERTIA_EASING(t) {\n return 1 - (1 - t) * (1 - t);\n};\n\nvar EVENT_TYPES = {\n WHEEL: ['wheel'],\n PAN: ['panstart', 'panmove', 'panend'],\n PINCH: ['pinchstart', 'pinchmove', 'pinchend'],\n TRIPLE_PAN: ['tripanstart', 'tripanmove', 'tripanend'],\n DOUBLE_TAP: ['doubletap'],\n KEYBOARD: ['keydown']\n};\n\nvar MapController = function () {\n function MapController() {\n var _this = this;\n\n _classCallCheck(this, MapController);\n\n _defineProperty(this, \"events\", []);\n\n _defineProperty(this, \"scrollZoom\", true);\n\n _defineProperty(this, \"dragPan\", true);\n\n _defineProperty(this, \"dragRotate\", true);\n\n _defineProperty(this, \"doubleClickZoom\", true);\n\n _defineProperty(this, \"touchZoom\", true);\n\n _defineProperty(this, \"touchRotate\", false);\n\n _defineProperty(this, \"keyboard\", true);\n\n _defineProperty(this, \"_interactionState\", {\n isDragging: false\n });\n\n _defineProperty(this, \"_events\", {});\n\n _defineProperty(this, \"_setInteractionState\", function (newState) {\n Object.assign(_this._interactionState, newState);\n\n if (_this.onStateChange) {\n _this.onStateChange(_this._interactionState);\n }\n });\n\n _defineProperty(this, \"_onTransition\", function (newViewport, oldViewport) {\n _this.onViewportChange(newViewport, _this._interactionState, oldViewport);\n });\n\n this.handleEvent = this.handleEvent.bind(this);\n this._transitionManager = new TransitionManager({\n onViewportChange: this._onTransition,\n onStateChange: this._setInteractionState\n });\n }\n\n _createClass(MapController, [{\n key: \"handleEvent\",\n value: function handleEvent(event) {\n this.mapState = this.getMapState();\n var eventStartBlocked = this._eventStartBlocked;\n\n switch (event.type) {\n case 'panstart':\n return eventStartBlocked ? false : this._onPanStart(event);\n\n case 'panmove':\n return this._onPan(event);\n\n case 'panend':\n return this._onPanEnd(event);\n\n case 'pinchstart':\n return eventStartBlocked ? false : this._onPinchStart(event);\n\n case 'pinchmove':\n return this._onPinch(event);\n\n case 'pinchend':\n return this._onPinchEnd(event);\n\n case 'tripanstart':\n return eventStartBlocked ? false : this._onTriplePanStart(event);\n\n case 'tripanmove':\n return this._onTriplePan(event);\n\n case 'tripanend':\n return this._onTriplePanEnd(event);\n\n case 'doubletap':\n return this._onDoubleTap(event);\n\n case 'wheel':\n return this._onWheel(event);\n\n case 'keydown':\n return this._onKeyDown(event);\n\n default:\n return false;\n }\n }\n }, {\n key: \"getCenter\",\n value: function getCenter(event) {\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n return [x, y];\n }\n }, {\n key: \"isFunctionKeyPressed\",\n value: function isFunctionKeyPressed(event) {\n var srcEvent = event.srcEvent;\n return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n }\n }, {\n key: \"blockEvents\",\n value: function blockEvents(timeout) {\n var _this2 = this;\n\n var timer = setTimeout(function () {\n if (_this2._eventStartBlocked === timer) {\n _this2._eventStartBlocked = null;\n }\n }, timeout);\n this._eventStartBlocked = timer;\n }\n }, {\n key: \"updateViewport\",\n value: function updateViewport(newMapState, extraProps, interactionState) {\n var oldViewport = this.mapState instanceof MapState ? this.mapState.getViewportProps() : this.mapState;\n\n var newViewport = map_controller_objectSpread(map_controller_objectSpread({}, newMapState.getViewportProps()), extraProps);\n\n var viewStateChanged = Object.keys(newViewport).some(function (key) {\n return oldViewport[key] !== newViewport[key];\n });\n this._state = newMapState.getState();\n\n this._setInteractionState(interactionState);\n\n if (viewStateChanged) {\n this.onViewportChange(newViewport, this._interactionState, oldViewport);\n }\n }\n }, {\n key: \"getMapState\",\n value: function getMapState(overrides) {\n return new MapState(map_controller_objectSpread(map_controller_objectSpread(map_controller_objectSpread({}, this.mapStateProps), this._state), overrides));\n }\n }, {\n key: \"isDragging\",\n value: function isDragging() {\n return this._interactionState.isDragging;\n }\n }, {\n key: \"setOptions\",\n value: function setOptions(options) {\n var onViewportChange = options.onViewportChange,\n onStateChange = options.onStateChange,\n _options$eventManager = options.eventManager,\n eventManager = _options$eventManager === void 0 ? this.eventManager : _options$eventManager,\n _options$isInteractiv = options.isInteractive,\n isInteractive = _options$isInteractiv === void 0 ? true : _options$isInteractiv,\n _options$scrollZoom = options.scrollZoom,\n scrollZoom = _options$scrollZoom === void 0 ? this.scrollZoom : _options$scrollZoom,\n _options$dragPan = options.dragPan,\n dragPan = _options$dragPan === void 0 ? this.dragPan : _options$dragPan,\n _options$dragRotate = options.dragRotate,\n dragRotate = _options$dragRotate === void 0 ? this.dragRotate : _options$dragRotate,\n _options$doubleClickZ = options.doubleClickZoom,\n doubleClickZoom = _options$doubleClickZ === void 0 ? this.doubleClickZoom : _options$doubleClickZ,\n _options$touchZoom = options.touchZoom,\n touchZoom = _options$touchZoom === void 0 ? this.touchZoom : _options$touchZoom,\n _options$touchRotate = options.touchRotate,\n touchRotate = _options$touchRotate === void 0 ? this.touchRotate : _options$touchRotate,\n _options$keyboard = options.keyboard,\n keyboard = _options$keyboard === void 0 ? this.keyboard : _options$keyboard;\n this.onViewportChange = onViewportChange;\n this.onStateChange = onStateChange;\n var prevOptions = this.mapStateProps || {};\n var dimensionChanged = prevOptions.height !== options.height || prevOptions.width !== options.width;\n this.mapStateProps = options;\n\n if (dimensionChanged) {\n this.mapState = prevOptions;\n this.updateViewport(new MapState(options));\n }\n\n this._transitionManager.processViewportChange(options);\n\n if (this.eventManager !== eventManager) {\n this.eventManager = eventManager;\n this._events = {};\n this.toggleEvents(this.events, true);\n }\n\n this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && Boolean(scrollZoom));\n this.toggleEvents(EVENT_TYPES.PAN, isInteractive && Boolean(dragPan || dragRotate));\n this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && Boolean(touchZoom || touchRotate));\n this.toggleEvents(EVENT_TYPES.TRIPLE_PAN, isInteractive && Boolean(touchRotate));\n this.toggleEvents(EVENT_TYPES.DOUBLE_TAP, isInteractive && Boolean(doubleClickZoom));\n this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && Boolean(keyboard));\n this.scrollZoom = scrollZoom;\n this.dragPan = dragPan;\n this.dragRotate = dragRotate;\n this.doubleClickZoom = doubleClickZoom;\n this.touchZoom = touchZoom;\n this.touchRotate = touchRotate;\n this.keyboard = keyboard;\n }\n }, {\n key: \"toggleEvents\",\n value: function toggleEvents(eventNames, enabled) {\n var _this3 = this;\n\n if (this.eventManager) {\n eventNames.forEach(function (eventName) {\n if (_this3._events[eventName] !== enabled) {\n _this3._events[eventName] = enabled;\n\n if (enabled) {\n _this3.eventManager.on(eventName, _this3.handleEvent);\n } else {\n _this3.eventManager.off(eventName, _this3.handleEvent);\n }\n }\n });\n }\n }\n }, {\n key: \"_onPanStart\",\n value: function _onPanStart(event) {\n var pos = this.getCenter(event);\n this._panRotate = this.isFunctionKeyPressed(event) || event.rightButton;\n var newMapState = this._panRotate ? this.mapState.rotateStart({\n pos: pos\n }) : this.mapState.panStart({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onPan\",\n value: function _onPan(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n return this._panRotate ? this._onPanRotate(event) : this._onPanMove(event);\n }\n }, {\n key: \"_onPanEnd\",\n value: function _onPanEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n return this._panRotate ? this._onPanRotateEnd(event) : this._onPanMoveEnd(event);\n }\n }, {\n key: \"_onPanMove\",\n value: function _onPanMove(event) {\n if (!this.dragPan) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var newMapState = this.mapState.pan({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isPanning: true\n });\n return true;\n }\n }, {\n key: \"_onPanMoveEnd\",\n value: function _onPanMoveEnd(event) {\n if (this.dragPan) {\n var _this$dragPan$inertia = this.dragPan.inertia,\n inertia = _this$dragPan$inertia === void 0 ? DEFAULT_INERTIA : _this$dragPan$inertia;\n\n if (inertia && event.velocity) {\n var pos = this.getCenter(event);\n var endPos = [pos[0] + event.velocityX * inertia / 2, pos[1] + event.velocityY * inertia / 2];\n var newControllerState = this.mapState.pan({\n pos: endPos\n }).panEnd();\n this.updateViewport(newControllerState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isPanning: true\n });\n return true;\n }\n }\n\n var newMapState = this.mapState.panEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isPanning: false\n });\n return true;\n }\n }, {\n key: \"_onPanRotate\",\n value: function _onPanRotate(event) {\n if (!this.dragRotate) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var newMapState = this.mapState.rotate({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isRotating: true\n });\n return true;\n }\n }, {\n key: \"_onPanRotateEnd\",\n value: function _onPanRotateEnd(event) {\n if (this.dragRotate) {\n var _this$dragRotate$iner = this.dragRotate.inertia,\n inertia = _this$dragRotate$iner === void 0 ? DEFAULT_INERTIA : _this$dragRotate$iner;\n\n if (inertia && event.velocity) {\n var pos = this.getCenter(event);\n var endPos = [pos[0] + event.velocityX * inertia / 2, pos[1] + event.velocityY * inertia / 2];\n var newControllerState = this.mapState.rotate({\n pos: endPos\n }).rotateEnd();\n this.updateViewport(newControllerState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isRotating: true\n });\n return true;\n }\n }\n\n var newMapState = this.mapState.panEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isRotating: false\n });\n return true;\n }\n }, {\n key: \"_onWheel\",\n value: function _onWheel(event) {\n if (!this.scrollZoom) {\n return false;\n }\n\n var _this$scrollZoom = this.scrollZoom,\n _this$scrollZoom$spee = _this$scrollZoom.speed,\n speed = _this$scrollZoom$spee === void 0 ? 0.01 : _this$scrollZoom$spee,\n _this$scrollZoom$smoo = _this$scrollZoom.smooth,\n smooth = _this$scrollZoom$smoo === void 0 ? false : _this$scrollZoom$smoo;\n event.preventDefault();\n var pos = this.getCenter(event);\n var delta = event.delta;\n var scale = 2 / (1 + Math.exp(-Math.abs(delta * speed)));\n\n if (delta < 0 && scale !== 0) {\n scale = 1 / scale;\n }\n\n var newMapState = this.mapState.zoom({\n pos: pos,\n scale: scale\n });\n this.updateViewport(newMapState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n }),\n transitionDuration: smooth ? 250 : 1\n }), {\n isPanning: true,\n isZooming: true\n });\n return true;\n }\n }, {\n key: \"_onPinchStart\",\n value: function _onPinchStart(event) {\n var pos = this.getCenter(event);\n var newMapState = this.mapState.zoomStart({\n pos: pos\n }).rotateStart({\n pos: pos\n });\n this._startPinchRotation = event.rotation;\n this._lastPinchEvent = event;\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onPinch\",\n value: function _onPinch(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (!this.touchZoom && !this.touchRotate) {\n return false;\n }\n\n var newMapState = this.mapState;\n\n if (this.touchZoom) {\n var scale = event.scale;\n var pos = this.getCenter(event);\n newMapState = newMapState.zoom({\n pos: pos,\n scale: scale\n });\n }\n\n if (this.touchRotate) {\n var rotation = event.rotation;\n newMapState = newMapState.rotate({\n deltaAngleX: this._startPinchRotation - rotation\n });\n }\n\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: Boolean(this.touchZoom),\n isZooming: Boolean(this.touchZoom),\n isRotating: Boolean(this.touchRotate)\n });\n this._lastPinchEvent = event;\n return true;\n }\n }, {\n key: \"_onPinchEnd\",\n value: function _onPinchEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (this.touchZoom) {\n var _this$touchZoom$inert = this.touchZoom.inertia,\n inertia = _this$touchZoom$inert === void 0 ? DEFAULT_INERTIA : _this$touchZoom$inert;\n var _lastPinchEvent = this._lastPinchEvent;\n\n if (inertia && _lastPinchEvent && event.scale !== _lastPinchEvent.scale) {\n var pos = this.getCenter(event);\n\n var _newMapState = this.mapState.rotateEnd();\n\n var z = Math.log2(event.scale);\n\n var velocityZ = (z - Math.log2(_lastPinchEvent.scale)) / (event.deltaTime - _lastPinchEvent.deltaTime);\n\n var endScale = Math.pow(2, z + velocityZ * inertia / 2);\n _newMapState = _newMapState.zoom({\n pos: pos,\n scale: endScale\n }).zoomEnd();\n this.updateViewport(_newMapState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n }),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isPanning: Boolean(this.touchZoom),\n isZooming: Boolean(this.touchZoom),\n isRotating: false\n });\n this.blockEvents(inertia);\n return true;\n }\n }\n\n var newMapState = this.mapState.zoomEnd().rotateEnd();\n this._state.startPinchRotation = 0;\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isPanning: false,\n isZooming: false,\n isRotating: false\n });\n this._startPinchRotation = null;\n this._lastPinchEvent = null;\n return true;\n }\n }, {\n key: \"_onTriplePanStart\",\n value: function _onTriplePanStart(event) {\n var pos = this.getCenter(event);\n var newMapState = this.mapState.rotateStart({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onTriplePan\",\n value: function _onTriplePan(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (!this.touchRotate) {\n return false;\n }\n\n var pos = this.getCenter(event);\n pos[0] -= event.deltaX;\n var newMapState = this.mapState.rotate({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isRotating: true\n });\n return true;\n }\n }, {\n key: \"_onTriplePanEnd\",\n value: function _onTriplePanEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (this.touchRotate) {\n var _this$touchRotate$ine = this.touchRotate.inertia,\n inertia = _this$touchRotate$ine === void 0 ? DEFAULT_INERTIA : _this$touchRotate$ine;\n\n if (inertia && event.velocityY) {\n var pos = this.getCenter(event);\n var endPos = [pos[0], pos[1] += event.velocityY * inertia / 2];\n\n var _newMapState2 = this.mapState.rotate({\n pos: endPos\n });\n\n this.updateViewport(_newMapState2, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isRotating: true\n });\n this.blockEvents(inertia);\n return false;\n }\n }\n\n var newMapState = this.mapState.rotateEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isRotating: false\n });\n return true;\n }\n }, {\n key: \"_onDoubleTap\",\n value: function _onDoubleTap(event) {\n if (!this.doubleClickZoom) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var isZoomOut = this.isFunctionKeyPressed(event);\n var newMapState = this.mapState.zoom({\n pos: pos,\n scale: isZoomOut ? 0.5 : 2\n });\n this.updateViewport(newMapState, Object.assign({}, LINEAR_TRANSITION_PROPS, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n })\n }), {\n isZooming: true\n });\n return true;\n }\n }, {\n key: \"_onKeyDown\",\n value: function _onKeyDown(event) {\n if (!this.keyboard) {\n return false;\n }\n\n var funcKey = this.isFunctionKeyPressed(event);\n var _this$keyboard = this.keyboard,\n _this$keyboard$zoomSp = _this$keyboard.zoomSpeed,\n zoomSpeed = _this$keyboard$zoomSp === void 0 ? 2 : _this$keyboard$zoomSp,\n _this$keyboard$moveSp = _this$keyboard.moveSpeed,\n moveSpeed = _this$keyboard$moveSp === void 0 ? 100 : _this$keyboard$moveSp,\n _this$keyboard$rotate = _this$keyboard.rotateSpeedX,\n rotateSpeedX = _this$keyboard$rotate === void 0 ? 15 : _this$keyboard$rotate,\n _this$keyboard$rotate2 = _this$keyboard.rotateSpeedY,\n rotateSpeedY = _this$keyboard$rotate2 === void 0 ? 10 : _this$keyboard$rotate2;\n var mapStateProps = this.mapStateProps;\n var newMapState;\n\n switch (event.srcEvent.keyCode) {\n case 189:\n if (funcKey) {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom - Math.log2(zoomSpeed) - 1\n });\n } else {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom - Math.log2(zoomSpeed)\n });\n }\n\n break;\n\n case 187:\n if (funcKey) {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom + Math.log2(zoomSpeed) + 1\n });\n } else {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom + Math.log2(zoomSpeed)\n });\n }\n\n break;\n\n case 37:\n if (funcKey) {\n newMapState = this.getMapState({\n bearing: mapStateProps.bearing - rotateSpeedX\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [moveSpeed, 0],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 39:\n if (funcKey) {\n newMapState = this.getMapState({\n bearing: mapStateProps.bearing + rotateSpeedX\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [-moveSpeed, 0],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 38:\n if (funcKey) {\n newMapState = this.getMapState({\n pitch: mapStateProps.pitch + rotateSpeedY\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [0, moveSpeed],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 40:\n if (funcKey) {\n newMapState = this.getMapState({\n pitch: mapStateProps.pitch - rotateSpeedY\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [0, -moveSpeed],\n startPos: [0, 0]\n });\n }\n\n break;\n\n default:\n return false;\n }\n\n return this.updateViewport(newMapState, LINEAR_TRANSITION_PROPS);\n }\n }]);\n\n return MapController;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/interactive-map.js\n\n\n\n\nfunction interactive_map_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction interactive_map_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n interactive_map_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n interactive_map_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\n\n\nvar interactive_map_propTypes = Object.assign({}, static_map.propTypes, {\n maxZoom: prop_types.number,\n minZoom: prop_types.number,\n maxPitch: prop_types.number,\n minPitch: prop_types.number,\n onViewStateChange: prop_types.func,\n onViewportChange: prop_types.func,\n onInteractionStateChange: prop_types.func,\n transitionDuration: prop_types.oneOfType([prop_types.number, prop_types.string]),\n transitionInterpolator: prop_types.object,\n transitionInterruption: prop_types.number,\n transitionEasing: prop_types.func,\n onTransitionStart: prop_types.func,\n onTransitionInterrupt: prop_types.func,\n onTransitionEnd: prop_types.func,\n scrollZoom: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n dragPan: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n dragRotate: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n doubleClickZoom: prop_types.bool,\n touchZoom: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n touchRotate: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n keyboard: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n onHover: prop_types.func,\n onClick: prop_types.func,\n onDblClick: prop_types.func,\n onContextMenu: prop_types.func,\n onMouseDown: prop_types.func,\n onMouseMove: prop_types.func,\n onMouseUp: prop_types.func,\n onTouchStart: prop_types.func,\n onTouchMove: prop_types.func,\n onTouchEnd: prop_types.func,\n onMouseEnter: prop_types.func,\n onMouseLeave: prop_types.func,\n onMouseOut: prop_types.func,\n onWheel: prop_types.func,\n touchAction: prop_types.string,\n eventRecognizerOptions: prop_types.object,\n clickRadius: prop_types.number,\n interactiveLayerIds: prop_types.array,\n getCursor: prop_types.func,\n controller: prop_types.instanceOf(MapController)\n});\n\nvar getDefaultCursor = function getDefaultCursor(_ref) {\n var isDragging = _ref.isDragging,\n isHovering = _ref.isHovering;\n return isDragging ? 'grabbing' : isHovering ? 'pointer' : 'grab';\n};\n\nvar interactive_map_defaultProps = Object.assign({}, static_map.defaultProps, MAPBOX_LIMITS, TransitionManager.defaultProps, {\n onViewStateChange: null,\n onViewportChange: null,\n onClick: null,\n onNativeClick: null,\n onHover: null,\n onContextMenu: function onContextMenu(event) {\n return event.preventDefault();\n },\n scrollZoom: true,\n dragPan: true,\n dragRotate: true,\n doubleClickZoom: true,\n touchZoom: true,\n touchRotate: false,\n keyboard: true,\n touchAction: 'none',\n eventRecognizerOptions: {},\n clickRadius: 0,\n getCursor: getDefaultCursor\n});\n\nfunction normalizeEvent(event) {\n if (event.lngLat || !event.offsetCenter) {\n return event;\n }\n\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n return event;\n }\n\n var pos = [x, y];\n event.point = pos;\n var viewport = this.viewport;\n var location = viewport.unproject(pos, {\n targetZ: viewport.meterOffset[2]\n });\n event.lngLat = [location[0], location[1]];\n return event;\n}\n\nfunction getFeatures(pos) {\n var map = this.map;\n\n if (!map || !pos) {\n return null;\n }\n\n var queryParams = {};\n var size = this.props.clickRadius;\n\n if (this.props.interactiveLayerIds) {\n queryParams.layers = this.props.interactiveLayerIds;\n }\n\n try {\n return map.queryRenderedFeatures(size ? [[pos[0] - size, pos[1] + size], [pos[0] + size, pos[1] - size]] : pos, queryParams);\n } catch (_unused) {\n return null;\n }\n}\n\nfunction onEvent(callbackName, event) {\n var func = this.props[callbackName];\n\n if (func) {\n func(normalizeEvent.call(this, event));\n }\n}\n\nfunction onPointerDown(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchStart' : 'onMouseDown', event);\n}\n\nfunction onPointerUp(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchEnd' : 'onMouseUp', event);\n}\n\nfunction onPointerMove(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchMove' : 'onMouseMove', event);\n\n if (!this.state.isDragging) {\n var _this$props = this.props,\n onHover = _this$props.onHover,\n interactiveLayerIds = _this$props.interactiveLayerIds;\n var features;\n event = normalizeEvent.call(this, event);\n\n if (interactiveLayerIds || onHover) {\n features = getFeatures.call(this, event.point);\n }\n\n var isHovering = Boolean(interactiveLayerIds && features && features.length > 0);\n var isEntering = isHovering && !this.state.isHovering;\n var isExiting = !isHovering && this.state.isHovering;\n\n if (onHover || isEntering) {\n event.features = features;\n\n if (onHover) {\n onHover(event);\n }\n }\n\n if (isEntering) {\n onEvent.call(this, 'onMouseEnter', event);\n }\n\n if (isExiting) {\n onEvent.call(this, 'onMouseLeave', event);\n }\n\n if (isEntering || isExiting) {\n this.setState({\n isHovering: isHovering\n });\n }\n }\n}\n\nfunction onPointerClick(event) {\n var _this$props2 = this.props,\n onClick = _this$props2.onClick,\n onNativeClick = _this$props2.onNativeClick,\n onDblClick = _this$props2.onDblClick,\n doubleClickZoom = _this$props2.doubleClickZoom;\n var callbacks = [];\n var isDoubleClickEnabled = onDblClick || doubleClickZoom;\n\n switch (event.type) {\n case 'anyclick':\n callbacks.push(onNativeClick);\n\n if (!isDoubleClickEnabled) {\n callbacks.push(onClick);\n }\n\n break;\n\n case 'click':\n if (isDoubleClickEnabled) {\n callbacks.push(onClick);\n }\n\n break;\n\n default:\n }\n\n callbacks = callbacks.filter(Boolean);\n\n if (callbacks.length) {\n event = normalizeEvent.call(this, event);\n event.features = getFeatures.call(this, event.point);\n callbacks.forEach(function (cb) {\n return cb(event);\n });\n }\n}\n\nfunction interactive_map_getRefHandles(staticMapRef) {\n return {\n getMap: staticMapRef.current && staticMapRef.current.getMap,\n queryRenderedFeatures: staticMapRef.current && staticMapRef.current.queryRenderedFeatures\n };\n}\n\nvar InteractiveMap = (0,react.forwardRef)(function (props, ref) {\n var parentContext = (0,react.useContext)(map_context);\n var controller = (0,react.useMemo)(function () {\n return props.controller || new MapController();\n }, []);\n var eventManager = (0,react.useMemo)(function () {\n return new EventManager(null, {\n touchAction: props.touchAction,\n recognizerOptions: props.eventRecognizerOptions\n });\n }, []);\n var eventCanvasRef = (0,react.useRef)(null);\n var staticMapRef = (0,react.useRef)(null);\n\n var _thisRef = (0,react.useRef)({\n width: 0,\n height: 0,\n state: {\n isHovering: false,\n isDragging: false\n }\n });\n\n var thisRef = _thisRef.current;\n thisRef.props = props;\n thisRef.map = staticMapRef.current && staticMapRef.current.getMap();\n\n thisRef.setState = function (newState) {\n thisRef.state = interactive_map_objectSpread(interactive_map_objectSpread({}, thisRef.state), newState);\n eventCanvasRef.current.style.cursor = props.getCursor(thisRef.state);\n };\n\n var inRender = true;\n var viewportUpdateRequested;\n var stateUpdateRequested;\n\n var handleViewportChange = function handleViewportChange(viewState, interactionState, oldViewState) {\n if (inRender) {\n viewportUpdateRequested = [viewState, interactionState, oldViewState];\n return;\n }\n\n var _thisRef$props = thisRef.props,\n onViewStateChange = _thisRef$props.onViewStateChange,\n onViewportChange = _thisRef$props.onViewportChange;\n Object.defineProperty(viewState, 'position', {\n get: function get() {\n return [0, 0, getTerrainElevation(thisRef.map, viewState)];\n }\n });\n\n if (onViewStateChange) {\n onViewStateChange({\n viewState: viewState,\n interactionState: interactionState,\n oldViewState: oldViewState\n });\n }\n\n if (onViewportChange) {\n onViewportChange(viewState, interactionState, oldViewState);\n }\n };\n\n (0,react.useImperativeHandle)(ref, function () {\n return interactive_map_getRefHandles(staticMapRef);\n }, []);\n var context = (0,react.useMemo)(function () {\n return interactive_map_objectSpread(interactive_map_objectSpread({}, parentContext), {}, {\n eventManager: eventManager,\n container: parentContext.container || eventCanvasRef.current\n });\n }, [parentContext, eventCanvasRef.current]);\n context.onViewportChange = handleViewportChange;\n context.viewport = parentContext.viewport || getViewport(thisRef);\n thisRef.viewport = context.viewport;\n\n var handleInteractionStateChange = function handleInteractionStateChange(interactionState) {\n var _interactionState$isD = interactionState.isDragging,\n isDragging = _interactionState$isD === void 0 ? false : _interactionState$isD;\n\n if (isDragging !== thisRef.state.isDragging) {\n thisRef.setState({\n isDragging: isDragging\n });\n }\n\n if (inRender) {\n stateUpdateRequested = interactionState;\n return;\n }\n\n var onInteractionStateChange = thisRef.props.onInteractionStateChange;\n\n if (onInteractionStateChange) {\n onInteractionStateChange(interactionState);\n }\n };\n\n var updateControllerOpts = function updateControllerOpts() {\n if (thisRef.width && thisRef.height) {\n controller.setOptions(interactive_map_objectSpread(interactive_map_objectSpread(interactive_map_objectSpread({}, thisRef.props), thisRef.props.viewState), {}, {\n isInteractive: Boolean(thisRef.props.onViewStateChange || thisRef.props.onViewportChange),\n onViewportChange: handleViewportChange,\n onStateChange: handleInteractionStateChange,\n eventManager: eventManager,\n width: thisRef.width,\n height: thisRef.height\n }));\n }\n };\n\n var onResize = function onResize(_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n thisRef.width = width;\n thisRef.height = height;\n updateControllerOpts();\n thisRef.props.onResize({\n width: width,\n height: height\n });\n };\n\n (0,react.useEffect)(function () {\n eventManager.setElement(eventCanvasRef.current);\n eventManager.on({\n pointerdown: onPointerDown.bind(thisRef),\n pointermove: onPointerMove.bind(thisRef),\n pointerup: onPointerUp.bind(thisRef),\n pointerleave: onEvent.bind(thisRef, 'onMouseOut'),\n click: onPointerClick.bind(thisRef),\n anyclick: onPointerClick.bind(thisRef),\n dblclick: onEvent.bind(thisRef, 'onDblClick'),\n wheel: onEvent.bind(thisRef, 'onWheel'),\n contextmenu: onEvent.bind(thisRef, 'onContextMenu')\n });\n return function () {\n eventManager.destroy();\n };\n }, []);\n use_isomorphic_layout_effect(function () {\n if (viewportUpdateRequested) {\n handleViewportChange.apply(void 0, (0,toConsumableArray/* default */.Z)(viewportUpdateRequested));\n }\n\n if (stateUpdateRequested) {\n handleInteractionStateChange(stateUpdateRequested);\n }\n });\n updateControllerOpts();\n var width = props.width,\n height = props.height,\n style = props.style,\n getCursor = props.getCursor;\n var eventCanvasStyle = (0,react.useMemo)(function () {\n return interactive_map_objectSpread(interactive_map_objectSpread({\n position: 'relative'\n }, style), {}, {\n width: width,\n height: height,\n cursor: getCursor(thisRef.state)\n });\n }, [style, width, height, getCursor, thisRef.state]);\n\n if (!viewportUpdateRequested || !thisRef._child) {\n thisRef._child = react.createElement(MapContextProvider, {\n value: context\n }, react.createElement(\"div\", {\n key: \"event-canvas\",\n ref: eventCanvasRef,\n style: eventCanvasStyle\n }, react.createElement(static_map, _extends({}, props, {\n width: \"100%\",\n height: \"100%\",\n style: null,\n onResize: onResize,\n ref: staticMapRef\n }))));\n }\n\n inRender = false;\n return thisRef._child;\n});\nInteractiveMap.supported = static_map.supported;\nInteractiveMap.propTypes = interactive_map_propTypes;\nInteractiveMap.defaultProps = interactive_map_defaultProps;\n/* harmony default export */ var interactive_map = (InteractiveMap);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/deep-equal.js\n\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n } else if (Array.isArray(b)) {\n return false;\n }\n\n if (_typeof(a) === 'object' && _typeof(b) === 'object') {\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (var _i = 0, _aKeys = aKeys; _i < _aKeys.length; _i++) {\n var key = _aKeys[_i];\n\n if (!b.hasOwnProperty(key)) {\n return false;\n }\n\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/source.js\n\n\n\nfunction source_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction source_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n source_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n source_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\nvar sourceCounter = 0;\n\nfunction createSource(map, id, props) {\n if (map.style && map.style._loaded) {\n var options = source_objectSpread({}, props);\n\n delete options.id;\n delete options.children;\n map.addSource(id, options);\n return map.getSource(id);\n }\n\n return null;\n}\n\nfunction updateSource(source, props, prevProps) {\n utils_assert_assert(props.id === prevProps.id, 'source id changed');\n utils_assert_assert(props.type === prevProps.type, 'source type changed');\n var changedKey = '';\n var changedKeyCount = 0;\n\n for (var key in props) {\n if (key !== 'children' && key !== 'id' && !deepEqual(prevProps[key], props[key])) {\n changedKey = key;\n changedKeyCount++;\n }\n }\n\n if (!changedKeyCount) {\n return;\n }\n\n var type = props.type;\n\n if (type === 'geojson') {\n source.setData(props.data);\n } else if (type === 'image') {\n source.updateImage({\n url: props.url,\n coordinates: props.coordinates\n });\n } else if ((type === 'canvas' || type === 'video') && changedKeyCount === 1 && changedKey === 'coordinates') {\n source.setCoordinates(props.coordinates);\n } else if (type === 'vector' && source.setUrl) {\n switch (changedKey) {\n case 'url':\n source.setUrl(props.url);\n break;\n\n case 'tiles':\n source.setTiles(props.tiles);\n break;\n\n default:\n }\n } else {\n console.warn(\"Unable to update prop: \".concat(changedKey));\n }\n}\n\nfunction Source(props) {\n var context = (0,react.useContext)(map_context);\n var propsRef = (0,react.useRef)({\n id: props.id,\n type: props.type\n });\n\n var _useState = (0,react.useState)(0),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setStyleLoaded = _useState2[1];\n\n var id = (0,react.useMemo)(function () {\n return props.id || \"jsx-source-\".concat(sourceCounter++);\n }, []);\n var map = context.map;\n (0,react.useEffect)(function () {\n if (map) {\n var forceUpdate = function forceUpdate() {\n return setStyleLoaded(function (version) {\n return version + 1;\n });\n };\n\n map.on('styledata', forceUpdate);\n return function () {\n map.off('styledata', forceUpdate);\n requestAnimationFrame(function () {\n if (map.style && map.style._loaded && map.getSource(id)) {\n map.removeSource(id);\n }\n });\n };\n }\n\n return undefined;\n }, [map, id]);\n var source = map && map.style && map.getSource(id);\n\n if (source) {\n updateSource(source, props, propsRef.current);\n } else {\n source = createSource(map, id, props);\n }\n\n propsRef.current = props;\n return source && react.Children.map(props.children, function (child) {\n return child && (0,react.cloneElement)(child, {\n source: id\n });\n }) || null;\n}\n\n/* harmony default export */ var source = (Source);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nfunction _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;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/layer.js\n\n\n\n\nfunction layer_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction layer_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n layer_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n layer_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\nvar LAYER_TYPES = ['fill', 'line', 'symbol', 'circle', 'fill-extrusion', 'raster', 'background', 'heatmap', 'hillshade', 'sky'];\nvar layer_propTypes = {\n type: prop_types.oneOf(LAYER_TYPES).isRequired,\n id: prop_types.string,\n source: prop_types.string,\n beforeId: prop_types.string\n};\n\nfunction diffLayerStyles(map, id, props, prevProps) {\n var _props$layout = props.layout,\n layout = _props$layout === void 0 ? {} : _props$layout,\n _props$paint = props.paint,\n paint = _props$paint === void 0 ? {} : _props$paint,\n filter = props.filter,\n minzoom = props.minzoom,\n maxzoom = props.maxzoom,\n beforeId = props.beforeId,\n otherProps = _objectWithoutProperties(props, [\"layout\", \"paint\", \"filter\", \"minzoom\", \"maxzoom\", \"beforeId\"]);\n\n if (beforeId !== prevProps.beforeId) {\n map.moveLayer(id, beforeId);\n }\n\n if (layout !== prevProps.layout) {\n var prevLayout = prevProps.layout || {};\n\n for (var key in layout) {\n if (!deepEqual(layout[key], prevLayout[key])) {\n map.setLayoutProperty(id, key, layout[key]);\n }\n }\n\n for (var _key in prevLayout) {\n if (!layout.hasOwnProperty(_key)) {\n map.setLayoutProperty(id, _key, undefined);\n }\n }\n }\n\n if (paint !== prevProps.paint) {\n var prevPaint = prevProps.paint || {};\n\n for (var _key2 in paint) {\n if (!deepEqual(paint[_key2], prevPaint[_key2])) {\n map.setPaintProperty(id, _key2, paint[_key2]);\n }\n }\n\n for (var _key3 in prevPaint) {\n if (!paint.hasOwnProperty(_key3)) {\n map.setPaintProperty(id, _key3, undefined);\n }\n }\n }\n\n if (!deepEqual(filter, prevProps.filter)) {\n map.setFilter(id, filter);\n }\n\n if (minzoom !== prevProps.minzoom || maxzoom !== prevProps.maxzoom) {\n map.setLayerZoomRange(id, minzoom, maxzoom);\n }\n\n for (var _key4 in otherProps) {\n if (!deepEqual(otherProps[_key4], prevProps[_key4])) {\n map.setLayerProperty(id, _key4, otherProps[_key4]);\n }\n }\n}\n\nfunction createLayer(map, id, props) {\n if (map.style && map.style._loaded) {\n var options = layer_objectSpread(layer_objectSpread({}, props), {}, {\n id: id\n });\n\n delete options.beforeId;\n map.addLayer(options, props.beforeId);\n }\n}\n\nfunction updateLayer(map, id, props, prevProps) {\n utils_assert_assert(props.id === prevProps.id, 'layer id changed');\n utils_assert_assert(props.type === prevProps.type, 'layer type changed');\n\n try {\n diffLayerStyles(map, id, props, prevProps);\n } catch (error) {\n console.warn(error);\n }\n}\n\nvar layerCounter = 0;\n\nfunction Layer(props) {\n var context = (0,react.useContext)(map_context);\n var propsRef = (0,react.useRef)({\n id: props.id,\n type: props.type\n });\n\n var _useState = (0,react.useState)(0),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setStyleLoaded = _useState2[1];\n\n var id = (0,react.useMemo)(function () {\n return props.id || \"jsx-layer-\".concat(layerCounter++);\n }, []);\n var map = context.map;\n (0,react.useEffect)(function () {\n if (map) {\n var forceUpdate = function forceUpdate() {\n return setStyleLoaded(function (version) {\n return version + 1;\n });\n };\n\n map.on('styledata', forceUpdate);\n return function () {\n map.off('styledata', forceUpdate);\n\n if (map.style && map.style._loaded) {\n map.removeLayer(id);\n }\n };\n }\n\n return undefined;\n }, [map]);\n var layer = map && map.style && map.getLayer(id);\n\n if (layer) {\n updateLayer(map, id, props, propsRef.current);\n } else {\n createLayer(map, id, props);\n }\n\n propsRef.current = props;\n return null;\n}\n\nLayer.propTypes = layer_propTypes;\n/* harmony default export */ var components_layer = (Layer);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/use-map-control.js\n\n\n\nvar mapControlDefaultProps = {\n captureScroll: false,\n captureDrag: true,\n captureClick: true,\n captureDoubleClick: true,\n capturePointerMove: false\n};\nvar mapControlPropTypes = {\n captureScroll: prop_types.bool,\n captureDrag: prop_types.bool,\n captureClick: prop_types.bool,\n captureDoubleClick: prop_types.bool,\n capturePointerMove: prop_types.bool\n};\n\nfunction onMount(thisRef) {\n var ref = thisRef.containerRef.current;\n var eventManager = thisRef.context.eventManager;\n\n if (!ref || !eventManager) {\n return undefined;\n }\n\n var events = {\n wheel: function wheel(evt) {\n var props = thisRef.props;\n\n if (props.captureScroll) {\n evt.stopPropagation();\n }\n\n if (props.onScroll) {\n props.onScroll(evt, thisRef);\n }\n },\n panstart: function panstart(evt) {\n var props = thisRef.props;\n\n if (props.captureDrag) {\n evt.stopPropagation();\n }\n\n if (props.onDragStart) {\n props.onDragStart(evt, thisRef);\n }\n },\n anyclick: function anyclick(evt) {\n var props = thisRef.props;\n\n if (props.captureClick) {\n evt.stopPropagation();\n }\n\n if (props.onClick) {\n props.onClick(evt, thisRef);\n }\n },\n click: function click(evt) {\n var props = thisRef.props;\n\n if (props.captureClick) {\n evt.stopPropagation();\n }\n\n if (props.onClick) {\n props.onClick(evt, thisRef);\n }\n },\n dblclick: function dblclick(evt) {\n var props = thisRef.props;\n\n if (props.captureDoubleClick) {\n evt.stopPropagation();\n }\n\n if (props.onDoubleClick) {\n props.onDoubleClick(evt, thisRef);\n }\n },\n pointermove: function pointermove(evt) {\n var props = thisRef.props;\n\n if (props.capturePointerMove) {\n evt.stopPropagation();\n }\n\n if (props.onPointerMove) {\n props.onPointerMove(evt, thisRef);\n }\n }\n };\n eventManager.watch(events, ref);\n return function () {\n eventManager.off(events);\n };\n}\n\nfunction useMapControl() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var context = (0,react.useContext)(map_context);\n var containerRef = (0,react.useRef)(null);\n\n var _thisRef = (0,react.useRef)({\n props: props,\n state: {},\n context: context,\n containerRef: containerRef\n });\n\n var thisRef = _thisRef.current;\n thisRef.props = props;\n thisRef.context = context;\n (0,react.useEffect)(function () {\n return onMount(thisRef);\n }, [context.eventManager]);\n return thisRef;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/base-control.js\n\n\n\n\n\n\n\n\n\nfunction base_control_createSuper(Derived) {\n var hasNativeReflectConstruct = base_control_isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction base_control_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 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\nfunction Control(props) {\n var instance = props.instance;\n\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n instance._context = context;\n instance._containerRef = containerRef;\n return instance._render();\n}\n\nvar BaseControl = function (_PureComponent) {\n _inherits(BaseControl, _PureComponent);\n\n var _super = base_control_createSuper(BaseControl);\n\n function BaseControl() {\n var _this;\n\n _classCallCheck(this, BaseControl);\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 = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"_context\", {});\n\n _defineProperty(_assertThisInitialized(_this), \"_containerRef\", (0,react.createRef)());\n\n _defineProperty(_assertThisInitialized(_this), \"_onScroll\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onDragStart\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onDblClick\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onClick\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onPointerMove\", function (evt) {});\n\n return _this;\n }\n\n _createClass(BaseControl, [{\n key: \"_render\",\n value: function _render() {\n throw new Error('_render() not implemented');\n }\n }, {\n key: \"render\",\n value: function render() {\n return react.createElement(Control, _extends({\n instance: this\n }, this.props, {\n onScroll: this._onScroll,\n onDragStart: this._onDragStart,\n onDblClick: this._onDblClick,\n onClick: this._onClick,\n onPointerMove: this._onPointerMove\n }));\n }\n }]);\n\n return BaseControl;\n}(react.PureComponent);\n\n_defineProperty(BaseControl, \"propTypes\", mapControlPropTypes);\n\n_defineProperty(BaseControl, \"defaultProps\", mapControlDefaultProps);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/draggable-control.js\n\n\n\nfunction draggable_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction draggable_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n draggable_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n draggable_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar draggableControlPropTypes = Object.assign({}, mapControlPropTypes, {\n draggable: prop_types.bool,\n onDrag: prop_types.func,\n onDragEnd: prop_types.func,\n onDragStart: prop_types.func,\n offsetLeft: prop_types.number,\n offsetTop: prop_types.number\n});\nvar draggableControlDefaultProps = Object.assign({}, mapControlDefaultProps, {\n draggable: false,\n offsetLeft: 0,\n offsetTop: 0\n});\n\nfunction getDragEventPosition(event) {\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n return [x, y];\n}\n\nfunction getDragEventOffset(event, container) {\n var _event$center = event.center,\n x = _event$center.x,\n y = _event$center.y;\n\n if (container) {\n var rect = container.getBoundingClientRect();\n return [rect.left - x, rect.top - y];\n }\n\n return null;\n}\n\nfunction getDragLngLat(dragPos, dragOffset, props, context) {\n var x = dragPos[0] + dragOffset[0] - props.offsetLeft;\n var y = dragPos[1] + dragOffset[1] - props.offsetTop;\n return context.viewport.unproject([x, y]);\n}\n\nfunction onDragStart(event, _ref) {\n var props = _ref.props,\n callbacks = _ref.callbacks,\n state = _ref.state,\n context = _ref.context,\n containerRef = _ref.containerRef;\n var draggable = props.draggable;\n\n if (!draggable) {\n return;\n }\n\n event.stopPropagation();\n var dragPos = getDragEventPosition(event);\n var dragOffset = getDragEventOffset(event, containerRef.current);\n state.setDragPos(dragPos);\n state.setDragOffset(dragOffset);\n\n if (callbacks.onDragStart && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDragStart(callbackEvent);\n }\n}\n\nfunction onDrag(event, _ref2) {\n var props = _ref2.props,\n callbacks = _ref2.callbacks,\n state = _ref2.state,\n context = _ref2.context;\n event.stopPropagation();\n var dragPos = getDragEventPosition(event);\n state.setDragPos(dragPos);\n var dragOffset = state.dragOffset;\n\n if (callbacks.onDrag && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDrag(callbackEvent);\n }\n}\n\nfunction onDragEnd(event, _ref3) {\n var props = _ref3.props,\n callbacks = _ref3.callbacks,\n state = _ref3.state,\n context = _ref3.context;\n event.stopPropagation();\n var dragPos = state.dragPos,\n dragOffset = state.dragOffset;\n state.setDragPos(null);\n state.setDragOffset(null);\n\n if (callbacks.onDragEnd && dragPos && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDragEnd(callbackEvent);\n }\n}\n\nfunction onDragCancel(event, _ref4) {\n var state = _ref4.state;\n event.stopPropagation();\n state.setDragPos(null);\n state.setDragOffset(null);\n}\n\nfunction registerEvents(thisRef) {\n var eventManager = thisRef.context.eventManager;\n\n if (!eventManager || !thisRef.state.dragPos) {\n return undefined;\n }\n\n var events = {\n panmove: function panmove(evt) {\n return onDrag(evt, thisRef);\n },\n panend: function panend(evt) {\n return onDragEnd(evt, thisRef);\n },\n pancancel: function pancancel(evt) {\n return onDragCancel(evt, thisRef);\n }\n };\n eventManager.watch(events);\n return function () {\n eventManager.off(events);\n };\n}\n\nfunction useDraggableControl(props) {\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n dragPos = _useState2[0],\n setDragPos = _useState2[1];\n\n var _useState3 = (0,react.useState)(null),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n dragOffset = _useState4[0],\n setDragOffset = _useState4[1];\n\n var thisRef = useMapControl(draggable_control_objectSpread(draggable_control_objectSpread({}, props), {}, {\n onDragStart: onDragStart\n }));\n thisRef.callbacks = props;\n thisRef.state.dragPos = dragPos;\n thisRef.state.setDragPos = setDragPos;\n thisRef.state.dragOffset = dragOffset;\n thisRef.state.setDragOffset = setDragOffset;\n (0,react.useEffect)(function () {\n return registerEvents(thisRef);\n }, [thisRef.context.eventManager, Boolean(dragPos)]);\n return thisRef;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/crisp-pixel.js\nvar pixelRatio = typeof window !== 'undefined' && window.devicePixelRatio || 1;\nvar crispPixel = function crispPixel(size) {\n return Math.round(size * pixelRatio) / pixelRatio;\n};\nvar crispPercentage = function crispPercentage(el, percentage) {\n var dimension = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'x';\n\n if (el === null) {\n return percentage;\n }\n\n var origSize = dimension === 'x' ? el.offsetWidth : el.offsetHeight;\n return crispPixel(percentage / 100 * origSize) / origSize * 100;\n};\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/marker.js\n\n\n\n\n\n\nvar marker_defaultProps = Object.assign({}, draggableControlDefaultProps, {\n className: ''\n});\n\nfunction getPosition(_ref) {\n var props = _ref.props,\n state = _ref.state,\n context = _ref.context;\n var longitude = props.longitude,\n latitude = props.latitude,\n offsetLeft = props.offsetLeft,\n offsetTop = props.offsetTop;\n var dragPos = state.dragPos,\n dragOffset = state.dragOffset;\n var viewport = context.viewport,\n map = context.map;\n\n if (dragPos && dragOffset) {\n return [dragPos[0] + dragOffset[0], dragPos[1] + dragOffset[1]];\n }\n\n var altitude = getTerrainElevation(map, {\n longitude: longitude,\n latitude: latitude\n });\n\n var _viewport$project = viewport.project([longitude, latitude, altitude]),\n _viewport$project2 = slicedToArray_slicedToArray(_viewport$project, 2),\n x = _viewport$project2[0],\n y = _viewport$project2[1];\n\n x += offsetLeft;\n y += offsetTop;\n return [x, y];\n}\n\nfunction Marker(props) {\n var thisRef = useDraggableControl(props);\n var state = thisRef.state,\n containerRef = thisRef.containerRef;\n var children = props.children,\n className = props.className,\n draggable = props.draggable;\n var dragPos = state.dragPos;\n\n var _getPosition = getPosition(thisRef),\n _getPosition2 = slicedToArray_slicedToArray(_getPosition, 2),\n x = _getPosition2[0],\n y = _getPosition2[1];\n\n var transform = \"translate(\".concat(crispPixel(x), \"px, \").concat(crispPixel(y), \"px)\");\n var cursor = draggable ? dragPos ? 'grabbing' : 'grab' : 'auto';\n var control = (0,react.useMemo)(function () {\n var containerStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n transform: transform,\n cursor: cursor\n };\n return react.createElement(\"div\", {\n className: \"mapboxgl-marker \".concat(className),\n ref: thisRef.containerRef,\n style: containerStyle\n }, children);\n }, [children, className]);\n var container = containerRef.current;\n\n if (container) {\n container.style.transform = transform;\n container.style.cursor = cursor;\n }\n\n return control;\n}\n\nMarker.defaultProps = marker_defaultProps;\n/* harmony default export */ var marker = (react.memo(Marker));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/dynamic-position.js\nvar ANCHOR_POSITION = {\n top: {\n x: 0.5,\n y: 0\n },\n 'top-left': {\n x: 0,\n y: 0\n },\n 'top-right': {\n x: 1,\n y: 0\n },\n bottom: {\n x: 0.5,\n y: 1\n },\n 'bottom-left': {\n x: 0,\n y: 1\n },\n 'bottom-right': {\n x: 1,\n y: 1\n },\n left: {\n x: 0,\n y: 0.5\n },\n right: {\n x: 1,\n y: 0.5\n }\n};\nvar ANCHOR_TYPES = Object.keys(ANCHOR_POSITION);\nfunction getDynamicPosition(_ref) {\n var x = _ref.x,\n y = _ref.y,\n width = _ref.width,\n height = _ref.height,\n selfWidth = _ref.selfWidth,\n selfHeight = _ref.selfHeight,\n anchor = _ref.anchor,\n _ref$padding = _ref.padding,\n padding = _ref$padding === void 0 ? 0 : _ref$padding;\n var _ANCHOR_POSITION$anch = ANCHOR_POSITION[anchor],\n anchorX = _ANCHOR_POSITION$anch.x,\n anchorY = _ANCHOR_POSITION$anch.y;\n var top = y - anchorY * selfHeight;\n var bottom = top + selfHeight;\n var cutoffY = Math.max(0, padding - top) + Math.max(0, bottom - height + padding);\n\n if (cutoffY > 0) {\n var bestAnchorY = anchorY;\n var minCutoff = cutoffY;\n\n for (anchorY = 0; anchorY <= 1; anchorY += 0.5) {\n top = y - anchorY * selfHeight;\n bottom = top + selfHeight;\n cutoffY = Math.max(0, padding - top) + Math.max(0, bottom - height + padding);\n\n if (cutoffY < minCutoff) {\n minCutoff = cutoffY;\n bestAnchorY = anchorY;\n }\n }\n\n anchorY = bestAnchorY;\n }\n\n var xStep = 0.5;\n\n if (anchorY === 0.5) {\n anchorX = Math.floor(anchorX);\n xStep = 1;\n }\n\n var left = x - anchorX * selfWidth;\n var right = left + selfWidth;\n var cutoffX = Math.max(0, padding - left) + Math.max(0, right - width + padding);\n\n if (cutoffX > 0) {\n var bestAnchorX = anchorX;\n var _minCutoff = cutoffX;\n\n for (anchorX = 0; anchorX <= 1; anchorX += xStep) {\n left = x - anchorX * selfWidth;\n right = left + selfWidth;\n cutoffX = Math.max(0, padding - left) + Math.max(0, right - width + padding);\n\n if (cutoffX < _minCutoff) {\n _minCutoff = cutoffX;\n bestAnchorX = anchorX;\n }\n }\n\n anchorX = bestAnchorX;\n }\n\n return ANCHOR_TYPES.find(function (positionType) {\n var anchorPosition = ANCHOR_POSITION[positionType];\n return anchorPosition.x === anchorX && anchorPosition.y === anchorY;\n }) || anchor;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/popup.js\n\n\n\nfunction popup_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction popup_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n popup_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n popup_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\nvar popup_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n offsetLeft: 0,\n offsetTop: 0,\n tipSize: 10,\n anchor: 'bottom',\n dynamicPosition: true,\n sortByDepth: false,\n closeButton: true,\n closeOnClick: true,\n onClose: function onClose() {}\n});\n\nfunction popup_getPosition(props, viewport, el, _ref) {\n var _ref2 = slicedToArray_slicedToArray(_ref, 2),\n x = _ref2[0],\n y = _ref2[1];\n\n var anchor = props.anchor,\n dynamicPosition = props.dynamicPosition,\n tipSize = props.tipSize;\n\n if (el) {\n return dynamicPosition ? getDynamicPosition({\n x: x,\n y: y,\n anchor: anchor,\n padding: tipSize,\n width: viewport.width,\n height: viewport.height,\n selfWidth: el.clientWidth,\n selfHeight: el.clientHeight\n }) : anchor;\n }\n\n return anchor;\n}\n\nfunction getContainerStyle(props, viewport, el, _ref3, positionType) {\n var _ref4 = slicedToArray_slicedToArray(_ref3, 3),\n x = _ref4[0],\n y = _ref4[1],\n z = _ref4[2];\n\n var offsetLeft = props.offsetLeft,\n offsetTop = props.offsetTop,\n sortByDepth = props.sortByDepth;\n var anchorPosition = ANCHOR_POSITION[positionType];\n var left = x + offsetLeft;\n var top = y + offsetTop;\n var xPercentage = crispPercentage(el, -anchorPosition.x * 100);\n var yPercentage = crispPercentage(el, -anchorPosition.y * 100, 'y');\n var style = {\n position: 'absolute',\n transform: \"\\n translate(\".concat(xPercentage, \"%, \").concat(yPercentage, \"%)\\n translate(\").concat(crispPixel(left), \"px, \").concat(crispPixel(top), \"px)\\n \"),\n display: undefined,\n zIndex: undefined\n };\n\n if (!sortByDepth) {\n return style;\n }\n\n if (z > 1 || z < -1 || x < 0 || x > viewport.width || y < 0 || y > viewport.height) {\n style.display = 'none';\n } else {\n style.zIndex = Math.floor((1 - z) / 2 * 100000);\n }\n\n return style;\n}\n\nfunction onClick(evt, _ref5) {\n var props = _ref5.props,\n context = _ref5.context;\n\n if (props.closeOnClick || evt.target.className === 'mapboxgl-popup-close-button') {\n props.onClose();\n\n if (context.eventManager) {\n context.eventManager.once('click', function (e) {\n return e.stopPropagation();\n }, evt.target);\n }\n }\n}\n\nfunction Popup(props) {\n var contentRef = (0,react.useRef)(null);\n var thisRef = useMapControl(popup_objectSpread(popup_objectSpread({}, props), {}, {\n onClick: onClick\n }));\n var context = thisRef.context,\n containerRef = thisRef.containerRef;\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setLoaded = _useState2[1];\n\n (0,react.useEffect)(function () {\n setLoaded(true);\n }, [contentRef.current]);\n var viewport = context.viewport,\n map = context.map;\n var className = props.className,\n longitude = props.longitude,\n latitude = props.latitude,\n tipSize = props.tipSize,\n closeButton = props.closeButton,\n children = props.children;\n var altitude = props.altitude;\n\n if (altitude === undefined) {\n altitude = getTerrainElevation(map, {\n longitude: longitude,\n latitude: latitude\n });\n }\n\n var position = viewport.project([longitude, latitude, altitude]);\n var positionType = popup_getPosition(props, viewport, contentRef.current, position);\n var containerStyle = getContainerStyle(props, viewport, containerRef.current, position, positionType);\n var onReactClick = (0,react.useCallback)(function (e) {\n return !context.eventManager && onClick(e, thisRef);\n }, [context.eventManager]);\n return react.createElement(\"div\", {\n className: \"mapboxgl-popup mapboxgl-popup-anchor-\".concat(positionType, \" \").concat(className),\n style: containerStyle,\n ref: containerRef\n }, react.createElement(\"div\", {\n key: \"tip\",\n className: \"mapboxgl-popup-tip\",\n style: {\n borderWidth: tipSize\n }\n }), react.createElement(\"div\", {\n key: \"content\",\n ref: contentRef,\n className: \"mapboxgl-popup-content\",\n onClick: onReactClick\n }, closeButton && react.createElement(\"button\", {\n key: \"close-button\",\n className: \"mapboxgl-popup-close-button\",\n type: \"button\"\n }, \"\\xD7\"), children));\n}\n\nPopup.defaultProps = popup_defaultProps;\n/* harmony default export */ var popup = (react.memo(Popup));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/attribution-control.js\n\n\n\nfunction attribution_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction attribution_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n attribution_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n attribution_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\nvar attribution_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n toggleLabel: 'Toggle Attribution'\n});\n\nfunction setupAttributioncontrol(opts, map, container, attributionContainer) {\n var control = new (maplibre_gl_default()).AttributionControl(opts);\n control._map = map;\n control._container = container;\n control._innerContainer = attributionContainer;\n\n control._updateAttributions();\n\n control._updateEditLink();\n\n map.on('styledata', control._updateData);\n map.on('sourcedata', control._updateData);\n return control;\n}\n\nfunction removeAttributionControl(control) {\n control._map.off('styledata', control._updateData);\n\n control._map.off('sourcedata', control._updateData);\n}\n\nfunction AttributionControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var innerContainerRef = (0,react.useRef)(null);\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n showCompact = _useState2[0],\n setShowCompact = _useState2[1];\n\n (0,react.useEffect)(function () {\n var control;\n\n if (context.map) {\n control = setupAttributioncontrol({\n customAttribution: props.customAttribution\n }, context.map, containerRef.current, innerContainerRef.current);\n }\n\n return function () {\n return control && removeAttributionControl(control);\n };\n }, [context.map]);\n var compact = props.compact === undefined ? context.viewport.width <= 640 : props.compact;\n (0,react.useEffect)(function () {\n if (!compact && showCompact) {\n setShowCompact(false);\n }\n }, [compact]);\n var toggleAttribution = (0,react.useCallback)(function () {\n return setShowCompact(function (value) {\n return !value;\n });\n }, []);\n var style = (0,react.useMemo)(function () {\n return attribution_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: props.className\n }, react.createElement(\"div\", {\n ref: containerRef,\n \"aria-pressed\": showCompact,\n className: \"mapboxgl-ctrl mapboxgl-ctrl-attrib \".concat(compact ? 'mapboxgl-compact' : '', \" \").concat(showCompact ? 'mapboxgl-compact-show' : '')\n }, react.createElement(\"button\", {\n type: \"button\",\n className: \"mapboxgl-ctrl-attrib-button\",\n title: props.toggleLabel,\n onClick: toggleAttribution\n }), react.createElement(\"div\", {\n ref: innerContainerRef,\n className: \"mapboxgl-ctrl-attrib-inner\",\n role: \"list\"\n })));\n}\n\nAttributionControl.defaultProps = attribution_control_defaultProps;\n/* harmony default export */ var attribution_control = (react.memo(AttributionControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/fullscreen-control.js\n\n\n\nfunction fullscreen_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction fullscreen_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n fullscreen_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n fullscreen_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\nvar fullscreen_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n container: null,\n label: 'Toggle fullscreen'\n});\n\nfunction FullscreenControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n isFullscreen = _useState2[0],\n setIsFullscreen = _useState2[1];\n\n var _useState3 = (0,react.useState)(false),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n showButton = _useState4[0],\n setShowButton = _useState4[1];\n\n var _useState5 = (0,react.useState)(null),\n _useState6 = slicedToArray_slicedToArray(_useState5, 2),\n mapboxFullscreenControl = _useState6[0],\n createMapboxFullscreenControl = _useState6[1];\n\n (0,react.useEffect)(function () {\n var control = new (maplibre_gl_default()).FullscreenControl();\n createMapboxFullscreenControl(control);\n setShowButton(control._checkFullscreenSupport());\n\n var onFullscreenChange = function onFullscreenChange() {\n var nextState = !control._fullscreen;\n control._fullscreen = nextState;\n setIsFullscreen(nextState);\n };\n\n document_.addEventListener(control._fullscreenchange, onFullscreenChange);\n return function () {\n document_.removeEventListener(control._fullscreenchange, onFullscreenChange);\n };\n }, []);\n\n var onClickFullscreen = function onClickFullscreen() {\n if (mapboxFullscreenControl) {\n mapboxFullscreenControl._container = props.container || context.container;\n\n mapboxFullscreenControl._onClickFullscreen();\n }\n };\n\n var style = (0,react.useMemo)(function () {\n return fullscreen_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n\n if (!showButton) {\n return null;\n }\n\n var className = props.className,\n label = props.label;\n var type = isFullscreen ? 'shrink' : 'fullscreen';\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, react.createElement(\"button\", {\n key: type,\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-\".concat(type),\n type: \"button\",\n title: label,\n onClick: onClickFullscreen\n }, react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }))));\n}\n\nFullscreenControl.defaultProps = fullscreen_control_defaultProps;\n/* harmony default export */ var fullscreen_control = (react.memo(FullscreenControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/geolocate-utils.js\nvar supported;\nfunction isGeolocationSupported() {\n if (supported !== undefined) {\n return Promise.resolve(supported);\n }\n\n if (window.navigator.permissions !== undefined) {\n return window.navigator.permissions.query({\n name: 'geolocation'\n }).then(function (p) {\n supported = p.state !== 'denied';\n return supported;\n });\n }\n\n supported = Boolean(window.navigator.geolocation);\n return Promise.resolve(supported);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/geolocate-control.js\n\n\n\nfunction geolocate_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction geolocate_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n geolocate_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n geolocate_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\nvar geolocate_control_noop = function noop() {};\n\nvar geolocate_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n label: 'Find My Location',\n disabledLabel: 'Location Not Available',\n auto: false,\n positionOptions: {\n enableHighAccuracy: false,\n timeout: 6000\n },\n fitBoundsOptions: {\n maxZoom: 15\n },\n trackUserLocation: false,\n showUserLocation: true,\n showAccuracyCircle: true,\n onGeolocate: function onGeolocate() {}\n});\n\nfunction geolocate_control_getBounds(position) {\n var center = new (maplibre_gl_default()).LngLat(position.coords.longitude, position.coords.latitude);\n var radius = position.coords.accuracy;\n var bounds = center.toBounds(radius);\n return [[bounds._ne.lng, bounds._ne.lat], [bounds._sw.lng, bounds._sw.lat]];\n}\n\nfunction setupMapboxGeolocateControl(context, props, geolocateButton) {\n var control = new (maplibre_gl_default()).GeolocateControl(props);\n control._container = document_.createElement('div');\n control._map = {\n on: function on() {},\n _getUIString: function _getUIString() {\n return '';\n }\n };\n\n control._setupUI(true);\n\n control._map = context.map;\n control._geolocateButton = geolocateButton;\n var eventManager = context.eventManager;\n\n if (control.options.trackUserLocation && eventManager) {\n eventManager.on('panstart', function () {\n if (control._watchState === 'ACTIVE_LOCK') {\n control._watchState = 'BACKGROUND';\n geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background');\n geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n }\n });\n }\n\n control.on('geolocate', props.onGeolocate);\n return control;\n}\n\nfunction updateCamera(position, _ref) {\n var context = _ref.context,\n props = _ref.props;\n var bounds = geolocate_control_getBounds(position);\n\n var _context$viewport$fit = context.viewport.fitBounds(bounds, props.fitBoundsOptions),\n longitude = _context$viewport$fit.longitude,\n latitude = _context$viewport$fit.latitude,\n zoom = _context$viewport$fit.zoom;\n\n var newViewState = Object.assign({}, context.viewport, {\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n var mapState = new MapState(newViewState);\n var viewState = Object.assign({}, mapState.getViewportProps(), LINEAR_TRANSITION_PROPS);\n var onViewportChange = props.onViewportChange || context.onViewportChange || geolocate_control_noop;\n var onViewStateChange = props.onViewStateChange || context.onViewStateChange || geolocate_control_noop;\n onViewStateChange({\n viewState: viewState\n });\n onViewportChange(viewState);\n}\n\nfunction GeolocateControl(props) {\n var thisRef = useMapControl(props);\n var context = thisRef.context,\n containerRef = thisRef.containerRef;\n var geolocateButtonRef = (0,react.useRef)(null);\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n mapboxGeolocateControl = _useState2[0],\n createMapboxGeolocateControl = _useState2[1];\n\n var _useState3 = (0,react.useState)(false),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n supportsGeolocation = _useState4[0],\n setSupportsGeolocation = _useState4[1];\n\n (0,react.useEffect)(function () {\n var control;\n\n if (context.map) {\n isGeolocationSupported().then(function (result) {\n setSupportsGeolocation(result);\n\n if (geolocateButtonRef.current) {\n control = setupMapboxGeolocateControl(context, props, geolocateButtonRef.current);\n\n control._updateCamera = function (position) {\n return updateCamera(position, thisRef);\n };\n\n createMapboxGeolocateControl(control);\n }\n });\n }\n\n return function () {\n if (control) {\n control._clearWatch();\n }\n };\n }, [context.map]);\n var triggerGeolocate = (0,react.useCallback)(function () {\n if (mapboxGeolocateControl) {\n mapboxGeolocateControl.options = thisRef.props;\n mapboxGeolocateControl.trigger();\n }\n }, [mapboxGeolocateControl]);\n (0,react.useEffect)(function () {\n if (props.auto) {\n triggerGeolocate();\n }\n }, [mapboxGeolocateControl, props.auto]);\n (0,react.useEffect)(function () {\n if (mapboxGeolocateControl) {\n mapboxGeolocateControl._onZoom();\n }\n }, [context.viewport.zoom]);\n var className = props.className,\n label = props.label,\n disabledLabel = props.disabledLabel,\n trackUserLocation = props.trackUserLocation;\n var style = (0,react.useMemo)(function () {\n return geolocate_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n key: \"geolocate-control\",\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, react.createElement(\"button\", {\n key: \"geolocate\",\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-geolocate\",\n ref: geolocateButtonRef,\n disabled: !supportsGeolocation,\n \"aria-pressed\": !trackUserLocation,\n type: \"button\",\n title: supportsGeolocation ? label : disabledLabel,\n \"aria-label\": supportsGeolocation ? label : disabledLabel,\n onClick: triggerGeolocate\n }, react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }))));\n}\n\nGeolocateControl.defaultProps = geolocate_control_defaultProps;\n/* harmony default export */ var geolocate_control = (react.memo(GeolocateControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/version.js\nfunction compareVersions(version1, version2) {\n var v1 = (version1 || '').split('.').map(Number);\n var v2 = (version2 || '').split('.').map(Number);\n\n for (var i = 0; i < 3; i++) {\n var part1 = v1[i] || 0;\n var part2 = v2[i] || 0;\n\n if (part1 < part2) {\n return -1;\n }\n\n if (part1 > part2) {\n return 1;\n }\n }\n\n return 0;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/navigation-control.js\n\n\nfunction navigation_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction navigation_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n navigation_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n navigation_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\nvar navigation_control_noop = function noop() {};\n\nvar navigation_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n showCompass: true,\n showZoom: true,\n zoomInLabel: 'Zoom In',\n zoomOutLabel: 'Zoom Out',\n compassLabel: 'Reset North'\n});\nvar VERSION_LEGACY = 1;\nvar VERSION_1_6 = 2;\n\nfunction getUIVersion(mapboxVersion) {\n return compareVersions(mapboxVersion, '1.6.0') >= 0 ? VERSION_1_6 : VERSION_LEGACY;\n}\n\nfunction updateViewport(context, props, opts) {\n var viewport = context.viewport;\n var mapState = new MapState(Object.assign({}, viewport, opts));\n var viewState = Object.assign({}, mapState.getViewportProps(), LINEAR_TRANSITION_PROPS);\n var onViewportChange = props.onViewportChange || context.onViewportChange || navigation_control_noop;\n var onViewStateChange = props.onViewStateChange || context.onViewStateChange || navigation_control_noop;\n onViewStateChange({\n viewState: viewState\n });\n onViewportChange(viewState);\n}\n\nfunction renderButton(type, label, callback, children) {\n return react.createElement(\"button\", {\n key: type,\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-\".concat(type),\n type: \"button\",\n title: label,\n onClick: callback\n }, children || react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }));\n}\n\nfunction renderCompass(context) {\n var uiVersion = (0,react.useMemo)(function () {\n return context.map ? getUIVersion(context.map.version) : VERSION_1_6;\n }, [context.map]);\n var bearing = context.viewport.bearing;\n var style = {\n transform: \"rotate(\".concat(-bearing, \"deg)\")\n };\n return uiVersion === VERSION_1_6 ? react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\",\n style: style\n }) : react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-compass-arrow\",\n style: style\n });\n}\n\nfunction NavigationControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var onZoomIn = function onZoomIn() {\n updateViewport(context, props, {\n zoom: context.viewport.zoom + 1\n });\n };\n\n var onZoomOut = function onZoomOut() {\n updateViewport(context, props, {\n zoom: context.viewport.zoom - 1\n });\n };\n\n var onResetNorth = function onResetNorth() {\n updateViewport(context, props, {\n bearing: 0,\n pitch: 0\n });\n };\n\n var className = props.className,\n showCompass = props.showCompass,\n showZoom = props.showZoom,\n zoomInLabel = props.zoomInLabel,\n zoomOutLabel = props.zoomOutLabel,\n compassLabel = props.compassLabel;\n var style = (0,react.useMemo)(function () {\n return navigation_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, showZoom && renderButton('zoom-in', zoomInLabel, onZoomIn), showZoom && renderButton('zoom-out', zoomOutLabel, onZoomOut), showCompass && renderButton('compass', compassLabel, onResetNorth, renderCompass(context))));\n}\n\nNavigationControl.defaultProps = navigation_control_defaultProps;\n/* harmony default export */ var navigation_control = (react.memo(NavigationControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/scale-control.js\n\n\n\nfunction scale_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction scale_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n scale_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n scale_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\nvar scale_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n maxWidth: 100,\n unit: 'metric'\n});\n\nfunction ScaleControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n mapboxScaleControl = _useState2[0],\n createMapboxScaleControl = _useState2[1];\n\n (0,react.useEffect)(function () {\n if (context.map) {\n var control = new (maplibre_gl_default()).ScaleControl();\n control._map = context.map;\n control._container = containerRef.current;\n createMapboxScaleControl(control);\n }\n }, [context.map]);\n\n if (mapboxScaleControl) {\n mapboxScaleControl.options = props;\n\n mapboxScaleControl._onMove();\n }\n\n var style = (0,react.useMemo)(function () {\n return scale_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: props.className\n }, react.createElement(\"div\", {\n ref: containerRef,\n className: \"mapboxgl-ctrl mapboxgl-ctrl-scale\"\n }));\n}\n\nScaleControl.defaultProps = scale_control_defaultProps;\n/* harmony default export */ var scale_control = (react.memo(ScaleControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/canvas-overlay.js\n\n\n\n\nvar canvas_overlay_pixelRatio = typeof window !== 'undefined' && window.devicePixelRatio || 1;\nvar canvas_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction CanvasOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n ctx = _useState2[0],\n setDrawingContext = _useState2[1];\n\n (0,react.useEffect)(function () {\n setDrawingContext(containerRef.current.getContext('2d'));\n }, []);\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n if (ctx) {\n ctx.save();\n ctx.scale(canvas_overlay_pixelRatio, canvas_overlay_pixelRatio);\n props.redraw({\n width: viewport.width,\n height: viewport.height,\n ctx: ctx,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n });\n ctx.restore();\n }\n\n return react.createElement(\"canvas\", {\n ref: containerRef,\n width: viewport.width * canvas_overlay_pixelRatio,\n height: viewport.height * canvas_overlay_pixelRatio,\n style: {\n width: \"\".concat(viewport.width, \"px\"),\n height: \"\".concat(viewport.height, \"px\"),\n position: 'absolute',\n left: 0,\n top: 0\n }\n });\n}\n\nCanvasOverlay.defaultProps = canvas_overlay_defaultProps;\n/* harmony default export */ var canvas_overlay = ((/* unused pure expression or super */ null && (CanvasOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/html-overlay.js\n\n\nfunction html_overlay_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction html_overlay_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n html_overlay_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n html_overlay_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar html_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction HTMLOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n var style = html_overlay_objectSpread({\n position: 'absolute',\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height\n }, props.style);\n\n return react.createElement(\"div\", {\n ref: containerRef,\n style: style\n }, props.redraw({\n width: viewport.width,\n height: viewport.height,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n }));\n}\n\nHTMLOverlay.defaultProps = html_overlay_defaultProps;\n/* harmony default export */ var html_overlay = ((/* unused pure expression or super */ null && (HTMLOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/svg-overlay.js\n\n\nfunction svg_overlay_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction svg_overlay_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n svg_overlay_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n svg_overlay_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar svg_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction SVGOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n var style = svg_overlay_objectSpread({\n position: 'absolute',\n left: 0,\n top: 0\n }, props.style);\n\n return react.createElement(\"svg\", {\n width: viewport.width,\n height: viewport.height,\n ref: containerRef,\n style: style\n }, props.redraw({\n width: viewport.width,\n height: viewport.height,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n }));\n}\n\nSVGOverlay.defaultProps = svg_overlay_defaultProps;\n/* harmony default export */ var svg_overlay = ((/* unused pure expression or super */ null && (SVGOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/set-rtl-text-plugin.js\n\nvar setRTLTextPlugin = (maplibre_gl_default()) ? (maplibre_gl_default()).setRTLTextPlugin : function () {};\n/* harmony default export */ var set_rtl_text_plugin = ((/* unused pure expression or super */ null && (setRTLTextPlugin)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/index.js\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;// CONCATENATED MODULE: ./node_modules/@turf/helpers/dist/es/index.js\n/**\n * @module helpers\n */\n\n/**\n * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.\n *\n * @memberof helpers\n * @type {number}\n */\nvar earthRadius = 6371008.8;\n/**\n * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar factors = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: earthRadius / 111325,\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936\n};\n/**\n * Units of measurement factors based on 1 meter.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar unitsFactors = {\n centimeters: 100,\n centimetres: 100,\n degrees: 1 / 111325,\n feet: 3.28084,\n inches: 39.37,\n kilometers: 1 / 1000,\n kilometres: 1 / 1000,\n meters: 1,\n metres: 1,\n miles: 1 / 1609.344,\n millimeters: 1000,\n millimetres: 1000,\n nauticalmiles: 1 / 1852,\n radians: 1 / earthRadius,\n yards: 1.0936133\n};\n/**\n * Area of measurement factors based on 1 square meter.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar areaFactors = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046\n};\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @name feature\n * @param {Geometry} geometry input geometry\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\n\nfunction es_feature(geom, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var feat = {\n type: \"Feature\"\n };\n\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @name geometry\n * @param {string} type Geometry Type\n * @param {Array} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\n\nfunction geometry(type, coordinates, _options) {\n if (_options === void 0) {\n _options = {};\n }\n\n switch (type) {\n case \"Point\":\n return es_point(coordinates).geometry;\n\n case \"LineString\":\n return es_lineString(coordinates).geometry;\n\n case \"Polygon\":\n return polygon(coordinates).geometry;\n\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @name point\n * @param {Array} coordinates longitude, latitude position (each in decimal degrees)\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\n\nfunction es_point(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n var geom = {\n type: \"Point\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @name points\n * @param {Array>} coordinates an array of Points\n * @param {Object} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\n\nfunction points(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return es_point(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @name polygon\n * @param {Array>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\n\nfunction polygon(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {\n var ring = coordinates_1[_i];\n\n if (ring.length < 4) {\n throw new Error(\"Each LinearRing of a Polygon must have 4 or more Positions.\");\n }\n\n for (var j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n\n var geom = {\n type: \"Polygon\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @name polygons\n * @param {Array>>>} coordinates an array of Polygon coordinates\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\n\nfunction polygons(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return polygon(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @name lineString\n * @param {Array>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\n\nfunction es_lineString(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n\n var geom = {\n type: \"LineString\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @name lineStrings\n * @param {Array>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\n\nfunction lineStrings(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return es_lineString(coords, properties);\n }), options);\n}\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @name featureCollection\n * @param {Feature[]} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\n\nfunction featureCollection(features, options) {\n if (options === void 0) {\n options = {};\n }\n\n var fc = {\n type: \"FeatureCollection\"\n };\n\n if (options.id) {\n fc.id = options.id;\n }\n\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n\n fc.features = features;\n return fc;\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiLineString\n * @param {Array>>} coordinates an array of LineStrings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\n\nfunction multiLineString(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiLineString\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPoint\n * @param {Array>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\n\nfunction multiPoint(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiPoint\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPolygon\n * @param {Array>>>} coordinates an array of Polygons\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\n\nfunction multiPolygon(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiPolygon\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name geometryCollection\n * @param {Array} geometries an array of GeoJSON Geometries\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\n\nfunction geometryCollection(geometries, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"GeometryCollection\",\n geometries: geometries\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Round number to precision\n *\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\n\nfunction es_round(num, precision) {\n if (precision === void 0) {\n precision = 0;\n }\n\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name radiansToLength\n * @param {number} radians in radians across the sphere\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\n\nfunction radiansToLength(radians, units) {\n if (units === void 0) {\n units = \"kilometers\";\n }\n\n var factor = factors[units];\n\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n\n return radians * factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name lengthToRadians\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\n\nfunction lengthToRadians(distance, units) {\n if (units === void 0) {\n units = \"kilometers\";\n }\n\n var factor = factors[units];\n\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n\n return distance / factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @name lengthToDegrees\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\n\nfunction lengthToDegrees(distance, units) {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @name bearingToAzimuth\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\n\nfunction bearingToAzimuth(bearing) {\n var angle = bearing % 360;\n\n if (angle < 0) {\n angle += 360;\n }\n\n return angle;\n}\n/**\n * Converts an angle in radians to degrees\n *\n * @name radiansToDegrees\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\n\nfunction radiansToDegrees(radians) {\n var degrees = radians % (2 * Math.PI);\n return degrees * 180 / Math.PI;\n}\n/**\n * Converts an angle in degrees to radians\n *\n * @name degreesToRadians\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\n\nfunction degreesToRadians(degrees) {\n var radians = degrees % 360;\n return radians * Math.PI / 180;\n}\n/**\n * Converts a length to the requested unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @param {number} length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] of the length\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted length\n */\n\nfunction convertLength(length, originalUnit, finalUnit) {\n if (originalUnit === void 0) {\n originalUnit = \"kilometers\";\n }\n\n if (finalUnit === void 0) {\n finalUnit = \"kilometers\";\n }\n\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n/**\n * Converts a area to the requested unit.\n * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares\n * @param {number} area to be converted\n * @param {Units} [originalUnit=\"meters\"] of the distance\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted area\n */\n\nfunction convertArea(area, originalUnit, finalUnit) {\n if (originalUnit === void 0) {\n originalUnit = \"meters\";\n }\n\n if (finalUnit === void 0) {\n finalUnit = \"kilometers\";\n }\n\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n var startFactor = areaFactors[originalUnit];\n\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n var finalFactor = areaFactors[finalUnit];\n\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return area / startFactor * finalFactor;\n}\n/**\n * isNumber\n *\n * @param {*} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\n\nfunction isNumber(num) {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n/**\n * isObject\n *\n * @param {*} input variable to validate\n * @returns {boolean} true/false\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\n\nfunction es_isObject(input) {\n return !!input && input.constructor === Object;\n}\n/**\n * Validate BBox\n *\n * @private\n * @param {Array} bbox BBox to validate\n * @returns {void}\n * @throws Error if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\n\nfunction validateBBox(bbox) {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n\n bbox.forEach(function (num) {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n/**\n * Validate Id\n *\n * @private\n * @param {string|number} id Id to validate\n * @returns {void}\n * @throws Error if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\n\nfunction validateId(id) {\n if (!id) {\n throw new Error(\"id is required\");\n }\n\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@turf/meta/dist/es/index.js\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {Array} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @name coordEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\n\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1; // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection ? geojson.features[featureIndex].geometry : isFeature ? geojson.geometry : geojson;\n isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === \"GeometryCollection\" : false;\n stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection ? geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection; // Handles null Geometry -- Skips this geometry\n\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n wrapShrink = excludeWrapCoord && (geomType === \"Polygon\" || geomType === \"MultiPolygon\") ? 1 : 0;\n\n switch (geomType) {\n case null:\n break;\n\n case \"Point\":\n if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n }\n\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n }\n\n geometryIndex++;\n }\n\n multiFeatureIndex++;\n }\n\n break;\n\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++) {\n if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;\n }\n\n break;\n\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Array} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @name coordReduce\n * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\n\n\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n }, excludeWrapCoord);\n return previousValue;\n}\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {Object} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @name propEach\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\n\n\nfunction propEach(geojson, callback) {\n var i;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n\n break;\n\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {*} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @name propReduce\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\n\n\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;else previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name featureEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\n\n\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name featureReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\n\n\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @name coordAll\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @returns {Array>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\n\n\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @name geomEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\n\n\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1; // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection ? geojson.features[i].geometry : isFeature ? geojson.geometry : geojson;\n featureProperties = isFeatureCollection ? geojson.features[i].properties : isFeature ? geojson.properties : {};\n featureBBox = isFeatureCollection ? geojson.features[i].bbox : isFeature ? geojson.bbox : undefined;\n featureId = isFeatureCollection ? geojson.features[i].id : isFeature ? geojson.id : undefined;\n isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === \"GeometryCollection\" : false;\n stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection ? geometryMaybeCollection.geometries[g] : geometryMaybeCollection; // Handle null Geometry\n\n if (geometry === null) {\n if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n continue;\n }\n\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n {\n if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n break;\n }\n\n case \"GeometryCollection\":\n {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n }\n\n break;\n }\n\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n } // Only increase `featureIndex` per each feature\n\n\n featureIndex++;\n }\n}\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @name geomReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\n\n\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);\n });\n return previousValue;\n}\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name flattenEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\n\n\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (callback(feature(geometry, properties, {\n bbox: bbox,\n id: id\n }), featureIndex, 0) === false) return false;\n return;\n }\n\n var geomType; // Callback for multi-geometry\n\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate\n };\n if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;\n }\n });\n}\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @name flattenReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\n\n\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {\n if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);\n });\n return previousValue;\n}\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\n\n\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0; // Exclude null Geometries\n\n if (!feature.geometry) return; // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return; // Generate 2-vertex line segments\n\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (coordEach(feature, function (currentCoord, coordIndex, featureIndexCoord, multiPartIndexCoord, geometryIndex) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (previousCoords === undefined || featureIndex > previousFeatureIndex || multiPartIndexCoord > previousMultiIndex || geometryIndex > prevGeomIndex) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n\n var currentSegment = lineString([previousCoords, currentCoord], feature.properties);\n if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }) === false) return false;\n });\n}\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\n\n\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n if (started === false && initialValue === undefined) previousValue = currentSegment;else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);\n started = true;\n });\n return previousValue;\n}\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @name lineEach\n * @param {Geometry|Feature} geojson object\n * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\n\n\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false) return false;\n break;\n\n case \"Polygon\":\n for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {\n if (callback(lineString(coords[geometryIndex], feature.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n }\n\n break;\n }\n });\n}\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name lineReduce\n * @param {Geometry|Feature} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\n\n\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);\n });\n return previousValue;\n}\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature>\n */\n\n\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0; // Find FeatureIndex\n\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n\n default:\n throw new Error(\"geojson is invalid\");\n } // Find SegmentIndex\n\n\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);\n\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);\n\n case \"MultiLineString\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);\n\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);\n }\n\n throw new Error(\"geojson is invalid\");\n}\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature>\n */\n\n\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0; // Find FeatureIndex\n\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n\n default:\n throw new Error(\"geojson is invalid\");\n } // Find Coord Index\n\n\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n\n case \"MultiPoint\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n\n case \"MultiLineString\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);\n }\n\n throw new Error(\"geojson is invalid\");\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@turf/bbox/dist/es/index.js\n\n/**\n * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.\n *\n * @name bbox\n * @param {GeoJSON} geojson any GeoJSON object\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\n\nfunction bbox(geojson) {\n var result = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, function (coord) {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nbbox[\"default\"] = bbox;\n/* harmony default export */ var es = (bbox);\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js\nfunction cubicIn(t) {\n return t * t * t;\n}\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n// EXTERNAL MODULE: ./node_modules/react-device-detect/main.js\nvar main = __webpack_require__(1677);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n;// CONCATENATED MODULE: ./src/components/territoryFocusControl.module.scss\n// extracted by mini-css-extract-plugin\nvar territoryFocusButton = \"territoryFocusControl-module--territoryFocusButton--3wWoV\";\nvar territoryFocusContainer = \"territoryFocusControl-module--territoryFocusContainer--3N0XM\";\n;// CONCATENATED MODULE: ./src/components/territoryFocusControl.tsx\nvar TerritoryFocusControl=function TerritoryFocusControl(_ref){var onClickTerritoryFocusButton=_ref.onClickTerritoryFocusButton;var intl=(0,gatsby_plugin_intl.useIntl)();var _useMapControl=useMapControl({// @ts-ignore // Types have not caught up yet, see https://github.com/visgl/react-map-gl/issues/1492\nonClick:onClickTerritoryFocusButton}),containerRef=_useMapControl.containerRef;var territories=[{short:intl.formatMessage({id:'map.territoryFocus.lower48.short',defaultMessage:'48',description:'The abbreviated name indicating the bounds of the Lower 48 states'}),long:intl.formatMessage({id:'map.territoryFocus.lower48.long',defaultMessage:'Lower 48',description:'The longer name indicating the bounds of the Lower 48 states'})},{short:intl.formatMessage({id:'map.territoryFocus.alaska.short',defaultMessage:'AK',description:'The abbreviated indicating the bounds of Alaska'}),long:intl.formatMessage({id:'map.territoryFocus.alaska.long',defaultMessage:'Alaska',description:'The full name indicating the bounds of Alaska'})},{short:intl.formatMessage({id:'map.territoryFocus.hawaii.short',defaultMessage:'HI',description:'The abbreviated name indicating the bounds of Hawaii'}),long:intl.formatMessage({id:'map.territoryFocus.hawaii.long',defaultMessage:'Hawaii',description:'The longer name indicating the bounds of Hawaii'})},{short:intl.formatMessage({id:'map.territoryFocus.puerto_rico.short',defaultMessage:'PR',description:'The abbreviated name indicating the bounds of Puerto Rico'}),long:intl.formatMessage({id:'map.territoryFocus.puerto_rico.long',defaultMessage:'Puerto Rico',description:'The full name indicating the bounds of Puerto Rico'})}];return/*#__PURE__*/react.createElement(\"div\",{ref:containerRef,className:territoryFocusContainer},territories.map(function(territory){return/*#__PURE__*/react.createElement(\"button\",{id:territory.short,key:territory.short,onClick:onClickTerritoryFocusButton,className:territoryFocusButton,\"aria-label\":intl.formatMessage({id:'map.territoryFocus.focusOn',defaultMessage:'Focus on {territory}',description:'Focus on the bounds of a specific territory'},{territory:territory.long})},territory.short);}));};/* harmony default export */ var territoryFocusControl = (TerritoryFocusControl);\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/lightbulb_outline.svg\n/* harmony default export */ var lightbulb_outline = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxnPjxnPjxwYXRoIGQ9Ik05LDIxYzAsMC41NSwwLjQ1LDEsMSwxaDRjMC41NSwwLDEtMC40NSwxLTF2LTFIOVYyMXogTTEyLDJDOC4xNCwyLDUsNS4xNCw1LDljMCwyLjM4LDEuMTksNC40NywzLDUuNzRWMTcgYzAsMC41NSwwLjQ1LDEsMSwxaDZjMC41NSwwLDEtMC40NSwxLTF2LTIuMjZjMS44MS0xLjI3LDMtMy4zNiwzLTUuNzRDMTksNS4xNCwxNS44NiwyLDEyLDJ6IE0xNCwxMy43VjE2aC00di0yLjMgQzguNDgsMTIuNjMsNywxMS41Myw3LDljMC0yLjc2LDIuMjQtNSw1LTVzNSwyLjI0LDUsNUMxNywxMS40OSwxNS40OSwxMi42NSwxNCwxMy43eiIvPjwvZz48L2c+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./src/components/mapIntroduction.module.scss\n// extracted by mini-css-extract-plugin\nvar mapIntroContainer = \"mapIntroduction-module--mapIntroContainer--1K8du\";\nvar mapIntroHeader = \"mapIntroduction-module--mapIntroHeader--32LBs\";\nvar mapIntroText = \"mapIntroduction-module--mapIntroText--Tib8L\";\nvar mapIntroLightbulb = \"mapIntroduction-module--mapIntroLightbulb--3LBx0\";\nvar didYouKnowBox = \"mapIntroduction-module--didYouKnowBox--3ztEy\";\nvar didYouKnow = \"mapIntroduction-module--didYouKnow--3_v_i\";\nvar didYouKnowText = \"mapIntroduction-module--didYouKnowText--3sgHs\";\n;// CONCATENATED MODULE: ./src/components/mapIntroduction.tsx\n// @ts-ignore\nvar MapIntroduction=function MapIntroduction(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({mapIntroHeader:{id:'mapIntro.mapIntroHeader',defaultMessage:'Zoom and select a census block group to view data',description:'introductory text of ways to use the map'},didYouKnow:{id:'mapIntro.didYouKnow',defaultMessage:' Did you know?',description:'text prompting a cite paragraph'},censusBlockGroupDefinition:{id:'mapIntro.censusBlockGroupDefinition',defaultMessage:'A census block group is generally between 600 and 3,000 people. '+'It is the smallest geographical unit for which the U.S. Census '+'Bureau publishes sample data.',description:'cites the definition and helpful information about census groups'}});return/*#__PURE__*/react.createElement(\"aside\",{className:mapIntroContainer},/*#__PURE__*/react.createElement(\"header\",{className:mapIntroHeader},intl.formatMessage(messages.mapIntroHeader)),/*#__PURE__*/react.createElement(\"div\",{className:mapIntroText},/*#__PURE__*/react.createElement(\"img\",{className:mapIntroLightbulb,src:lightbulb_outline}),/*#__PURE__*/react.createElement(\"div\",{className:didYouKnowBox},/*#__PURE__*/react.createElement(\"div\",{className:didYouKnow},intl.formatMessage(messages.didYouKnow)),/*#__PURE__*/react.createElement(\"cite\",{className:didYouKnowText},intl.formatMessage(messages.censusBlockGroupDefinition)))));};/* harmony default export */ var mapIntroduction = (MapIntroduction);\n;// CONCATENATED MODULE: ./src/components/AreaDetail/areaDetail.module.scss\n// extracted by mini-css-extract-plugin\nvar areaDetailContainer = \"areaDetail-module--areaDetailContainer--YFThR\";\nvar topRow = \"areaDetail-module--topRow--mrsfo\";\nvar cumulativeIndexScore = \"areaDetail-module--cumulativeIndexScore--1MjN-\";\nvar areaDetail_module_categorization = \"areaDetail-module--categorization--hB9K8\";\nvar topRowTitle = \"areaDetail-module--topRowTitle--umx39\";\nvar censusLabel = \"areaDetail-module--censusLabel--3SC-c\";\nvar topRowSubTitle = \"areaDetail-module--topRowSubTitle--3je7r\";\nvar areaDetail_module_score = \"areaDetail-module--score--3bk9b\";\nvar scoreSuperscript = \"areaDetail-module--scoreSuperscript--3VIYX\";\nvar priority = \"areaDetail-module--priority--36uI7\";\nvar prioritized = \"areaDetail-module--prioritized--1XdWQ\";\nvar threshold = \"areaDetail-module--threshold--1Y2Xo\";\nvar nonPrioritized = \"areaDetail-module--nonPrioritized--1bTJl\";\nvar prioritization = \"areaDetail-module--prioritization--2NmrB\";\nvar censusRow = \"areaDetail-module--censusRow--169O8\";\nvar censusText = \"areaDetail-module--censusText--3j1xg\";\nvar indicatorDescription = \"areaDetail-module--indicatorDescription--2xFDY\";\nvar divider = \"areaDetail-module--divider--3yw9U\";\nvar indicatorBox = \"areaDetail-module--indicatorBox--2wAUP\";\nvar indicatorTitle = \"areaDetail-module--indicatorTitle--3Ij_h\";\nvar indicatorValue = \"areaDetail-module--indicatorValue--3EtVQ\";\n;// CONCATENATED MODULE: ./src/data/constants.tsx\n// URLS\nvar DOWNLOAD_ZIP_URL='https://justice40-data.s3.amazonaws.com/data-pipeline/data/score/downloadable/Screening+Tool+Data.zip';// This is the URL for the origin S3 bucket:\n// export const ORIGIN_BASE_URL = 'https://justice40-data.s3.amazonaws.com';\n// This is the URL for the CDN that delivers the tile data\nvar FEATURE_TILE_BASE_URL='https://d3jqyw10j8e7p9.cloudfront.net';var FEATURE_TILE_PATH='data-pipeline/data/score/tiles';// This is the URL for the CDN that delivers the application\n// const APP_BASE_URL = 'https://d2zjid6n5ja2pt.cloudfront.net';\nvar XYZ_SUFFIX='{z}/{x}/{y}.pbf';var featureURLForTilesetName=function featureURLForTilesetName(tilesetName){return FEATURE_TILE_BASE_URL+\"/\"+FEATURE_TILE_PATH+\"/\"+tilesetName+\"/\"+XYZ_SUFFIX;};var FEATURE_TILE_HIGH_ZOOM_URL=featureURLForTilesetName('high');var FEATURE_TILE_LOW_ZOOM_URL=featureURLForTilesetName('low');// Performance markers\nvar PERFORMANCE_MARKER_MAP_IDLE='MAP_IDLE';// Properties\nvar SCORE_PROPERTY_HIGH='Score E (percentile)';var SCORE_PROPERTY_LOW='E_SCORE';var GEOID_PROPERTY='GEOID10';var HIGH_SCORE_SOURCE_NAME='score-high';var HIGH_SCORE_LAYER_NAME='score-high-layer';var LOW_SCORE_SOURCE_NAME='score-low';var LOW_SCORE_LAYER_NAME='score-low-layer';var SELECTED_PROPERTY='selected';var CURRENTLY_SELECTED_FEATURE_HIGHLIGHT_LAYER_NAME='currently-selected-feature-highlight-layer';var BLOCK_GROUP_BOUNDARY_LAYER_NAME='block-group-boundary-layer';// Properties\nvar POVERTY_PROPERTY_PERCENTILE='Poverty (Less than 200% of federal poverty line) (percentile)';var HOUSING_BURDEN_PROPERTY_PERCENTILE='Housing burden (percent) (percentile)';var LINGUISTIC_ISOLATION_PROPERTY_PERCENTILE='Linguistic isolation (percent) (percentile)';var UNEMPLOYMENT_PROPERTY_PERCENTILE='Unemployed civilians (percent) (percentile)';var TOTAL_POPULATION='Total population';var EDUCATION_PROPERTY_PERCENTILE=\"Percent individuals age 25 or over with less than high school degree (percentile)\";var COUNTY_NAME='County Name';var STATE_NAME='State Name';// The name of the layer within the tiles that contains the score\nvar SCORE_SOURCE_LAYER='blocks';// Zoom\nvar GLOBAL_MIN_ZOOM=3;var GLOBAL_MAX_ZOOM=22;var GLOBAL_MIN_ZOOM_LOW=3;var GLOBAL_MAX_ZOOM_LOW=7;var GLOBAL_MIN_ZOOM_HIGHLIGHT=8;var GLOBAL_MAX_ZOOM_HIGHLIGHT=22;var GLOBAL_MIN_ZOOM_HIGH=7;var GLOBAL_MAX_ZOOM_HIGH=11;// Bounds\nvar GLOBAL_MAX_BOUNDS=(/* unused pure expression or super */ null && ([[-180.118306,5.499550],[-65.0,83.162102]]));var LOWER_48_BOUNDS=[[-124.7844079,24.7433195],[-66.9513812,49.3457868]];var ALASKA_BOUNDS=[[-183.856888,50.875311],[-140.932617,71.958797]];var HAWAII_BOUNDS=[[-168.118306,18.748115],[-154.757881,22.378413]];var PUERTO_RICO_BOUNDS=[[-67.945404,17.88328],[-65.220703,18.515683]];var GUAM_BOUNDS=(/* unused pure expression or super */ null && ([[-215.389709,13.225909],[-215.040894,13.663335]]));var MARIANA_ISLAND_BOUNDS=(/* unused pure expression or super */ null && ([[-215.313449,14.007801],[-213.742404,19.750326]]));var AMERICAN_SAMOA_BOUNDS=(/* unused pure expression or super */ null && ([[-171.089874,-14.548699],[-168.1433,-11.046934]]));var DEFAULT_CENTER=[32.4687126,-86.502136];// Opacity\nvar DEFAULT_LAYER_OPACITY=0.6;// Colors\nvar DEFAULT_OUTLINE_COLOR='#4EA5CF';var MIN_COLOR='#FFFFFF';var MED_COLOR='#D1DAE6';var MAX_COLOR='#768FB3';var BORDER_HIGHLIGHT_COLOR='#00BDE3';var CURRENTLY_SELECTED_FEATURE_LAYER_OPACITY=0.5;// Widths\nvar HIGHLIGHT_BORDER_WIDTH=5.0;var CURRENTLY_SELECTED_FEATURE_LAYER_WIDTH=0.8;// Score boundaries\nvar SCORE_BOUNDARY_LOW=0.0;var SCORE_BOUNDARY_THRESHOLD=0.6;var SCORE_BOUNDARY_PRIORITIZED=0.75;// Explore the Tool:\nvar EXPLORE_TOOL_PAGE_TEXT=(0,lib/* defineMessages */.vU)({PRIORITY_LABEL:{id:'legend.info.priority.label',defaultMessage:'Prioritized community',description:'the label of the prioritized community legend'},THRESHOLD_LABEL:{id:'legend.info.threshold.label',defaultMessage:'Threshold community',description:'the label of the threshold community legend'},LEGEND_LABEL:{id:'legend.colorkey.label',defaultMessage:'COLOR KEY',description:'the label of the key in the legend'}});var isMobile=main/* isMobile */.tq;\n;// CONCATENATED MODULE: ./src/components/AreaDetail/index.tsx\n// External Libs:\n// Components:\n// Styles and constants\nvar readablePercent=function readablePercent(percent){return\"\"+(percent*100).toFixed(1);};var getCategorization=function getCategorization(percentile){var categorization;var categoryCircleStyle;if(percentile>=SCORE_BOUNDARY_PRIORITIZED){categorization='Prioritized';categoryCircleStyle=prioritized;}else if(SCORE_BOUNDARY_THRESHOLD<=percentile&&percentile',SCORE_PROPERTY_LOW,SCORE_BOUNDARY_THRESHOLD]],'paint':makePaint({field:SCORE_PROPERTY_LOW,minRamp:SCORE_BOUNDARY_LOW,medRamp:SCORE_BOUNDARY_THRESHOLD,maxRamp:SCORE_BOUNDARY_PRIORITIZED}),'minzoom':GLOBAL_MIN_ZOOM_LOW,'maxzoom':GLOBAL_MAX_ZOOM_LOW},{// We put labels last to ensure prominence\n'id':'labels-only-layer','type':'raster','source':'labels','minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM}]};};\n;// CONCATENATED MODULE: ./src/components/J40Map.module.scss\n// extracted by mini-css-extract-plugin\nvar mapAndInfoPanelContainer = \"J40Map-module--mapAndInfoPanelContainer--q-ody\";\nvar j40Popup = \"J40Map-module--j40Popup--3yJGr\";\nvar navigationControl = \"J40Map-module--navigationControl--2Aybf\";\nvar fullscreenControl = \"J40Map-module--fullscreenControl--1UBKe\";\nvar geolocateControl = \"J40Map-module--geolocateControl--3KVAk\";\nvar J40Map_module_mapInfoPanel = \"J40Map-module--mapInfoPanel--F3jR4\";\n;// CONCATENATED MODULE: ./src/components/J40Map.tsx\n/* eslint-disable no-unused-vars */ // External Libs:\n// Contexts:\n// Components:\n// Styles and constants\n;;var J40Map=function J40Map(_ref){var location=_ref.location;// Hash portion of URL is of the form #zoom/lat/lng\nvar _location$hash$slice$=location.hash.slice(1).split('/'),zoom=_location$hash$slice$[0],lat=_location$hash$slice$[1],lng=_location$hash$slice$[2];var _useState=(0,react.useState)({latitude:lat&&parseFloat(lat)||DEFAULT_CENTER[0],longitude:lng&&parseFloat(lng)||DEFAULT_CENTER[1],zoom:zoom&&parseFloat(zoom)||GLOBAL_MIN_ZOOM}),viewport=_useState[0],setViewport=_useState[1];var _useState2=(0,react.useState)(),selectedFeature=_useState2[0],setSelectedFeature=_useState2[1];var _useState3=(0,react.useState)(),detailViewData=_useState3[0],setDetailViewData=_useState3[1];var _useState4=(0,react.useState)(false),transitionInProgress=_useState4[0],setTransitionInProgress=_useState4[1];var _useState5=(0,react.useState)(false),geolocationInProgress=_useState5[0],setGeolocationInProgress=_useState5[1];var _useState6=(0,react.useState)(false),isMobileMapState=_useState6[0],setIsMobileMapState=_useState6[1];var mapRef=(0,react.useRef)(null);var flags=(0,FlagContext/* useFlags */.Vb)();var selectedFeatureId=selectedFeature&&selectedFeature.id||'';var filter=(0,react.useMemo)(function(){return['in',GEOID_PROPERTY,selectedFeatureId];},[selectedFeature]);var onClick=function onClick(event){var feature=event.features&&event.features[0];if(feature){var _bbox=es(feature),minLng=_bbox[0],minLat=_bbox[1],maxLng=_bbox[2],maxLat=_bbox[3];var newViewPort=new WebMercatorViewport({height:viewport.height,width:viewport.width});var _newViewPort$fitBound=newViewPort.fitBounds([[minLng,minLat],[maxLng,maxLat]],{padding:40}),longitude=_newViewPort$fitBound.longitude,latitude=_newViewPort$fitBound.latitude,_zoom=_newViewPort$fitBound.zoom;if(feature.id!==selectedFeatureId){setSelectedFeature(feature);}else{setSelectedFeature(undefined);}var popupInfo={longitude:longitude,latitude:latitude,zoom:_zoom,properties:feature.properties};goToPlace([[minLng,minLat],[maxLng,maxLat]]);setDetailViewData(popupInfo);}};var onLoad=function onLoad(){if(typeof window!=='undefined'&&window.Cypress&&mapRef.current){window.underlyingMap=mapRef.current.getMap();}if(main/* isMobile */.tq)setIsMobileMapState(true);};var goToPlace=function goToPlace(bounds){var _WebMercatorViewport$=new WebMercatorViewport({height:viewport.height,width:viewport.width}).fitBounds(bounds,{padding:20,offset:[0,-100]}),longitude=_WebMercatorViewport$.longitude,latitude=_WebMercatorViewport$.latitude,zoom=_WebMercatorViewport$.zoom;setViewport(Object.assign({},viewport,{longitude:longitude,latitude:latitude,zoom:zoom,transitionDuration:1000,transitionInterpolator:new ViewportFlyToInterpolator(),transitionEasing:cubicInOut}));};var onClickTerritoryFocusButton=function onClickTerritoryFocusButton(event){event.stopPropagation();var buttonID=event.target&&event.target.id;switch(buttonID){case'48':goToPlace(LOWER_48_BOUNDS);break;case'AK':goToPlace(ALASKA_BOUNDS);break;case'HI':goToPlace(HAWAII_BOUNDS);break;case'PR':goToPlace(PUERTO_RICO_BOUNDS);break;default:break;}};var onTransitionStart=function onTransitionStart(){setTransitionInProgress(true);};var onTransitionEnd=function onTransitionEnd(){setTransitionInProgress(false);};var onGeolocate=function onGeolocate(){setGeolocationInProgress(false);};var onClickGeolocate=function onClickGeolocate(){setGeolocationInProgress(true);};return/*#__PURE__*/react.createElement(\"div\",{className:mapAndInfoPanelContainer},/*#__PURE__*/react.createElement(interactive_map,Object.assign({},viewport,{mapStyle:makeMapStyle(flags),minZoom:GLOBAL_MIN_ZOOM,maxZoom:GLOBAL_MAX_ZOOM,mapOptions:{hash:true},width:\"100%\",height:isMobileMapState?'44vh':'100%',dragRotate:false,touchRotate:false,interactiveLayerIds:[HIGH_SCORE_LAYER_NAME],onViewportChange:setViewport,onClick:onClick,onLoad:onLoad,onTransitionStart:onTransitionStart,onTransitionEnd:onTransitionEnd,ref:mapRef,\"data-cy\":'reactMapGL'}),/*#__PURE__*/react.createElement(source,{id:HIGH_SCORE_SOURCE_NAME,type:\"vector\",promoteId:GEOID_PROPERTY,tiles:[FEATURE_TILE_HIGH_ZOOM_URL],maxzoom:GLOBAL_MIN_ZOOM_HIGH,minzoom:GLOBAL_MAX_ZOOM_HIGH},/*#__PURE__*/react.createElement(components_layer,{id:CURRENTLY_SELECTED_FEATURE_HIGHLIGHT_LAYER_NAME,\"source-layer\":SCORE_SOURCE_LAYER,type:\"line\",paint:{'line-color':DEFAULT_OUTLINE_COLOR,'line-width':CURRENTLY_SELECTED_FEATURE_LAYER_WIDTH,'line-opacity':CURRENTLY_SELECTED_FEATURE_LAYER_OPACITY},minzoom:GLOBAL_MIN_ZOOM_HIGHLIGHT,maxzoom:GLOBAL_MAX_ZOOM_HIGHLIGHT}),/*#__PURE__*/react.createElement(components_layer,{id:BLOCK_GROUP_BOUNDARY_LAYER_NAME,type:\"line\",\"source-layer\":SCORE_SOURCE_LAYER,paint:{'line-color':BORDER_HIGHLIGHT_COLOR,'line-width':HIGHLIGHT_BORDER_WIDTH},filter:filter,minzoom:GLOBAL_MIN_ZOOM_HIGH})),'fs'in flags&&detailViewData&&!transitionInProgress&&/*#__PURE__*/react.createElement(popup,{className:j40Popup,tipSize:5,anchor:\"top\",longitude:detailViewData.longitude,latitude:detailViewData.latitude,closeOnClick:true,onClose:setDetailViewData,captureScroll:true},/*#__PURE__*/react.createElement(components_AreaDetail,{properties:detailViewData.properties})),/*#__PURE__*/react.createElement(navigation_control,{showCompass:false,className:navigationControl}),'gl'in flags?/*#__PURE__*/react.createElement(geolocate_control,{className:geolocateControl,positionOptions:{enableHighAccuracy:true},onGeolocate:onGeolocate// @ts-ignore // Types have not caught up yet, see https://github.com/visgl/react-map-gl/issues/1492\n,onClick:onClickGeolocate}):'',geolocationInProgress?/*#__PURE__*/react.createElement(\"div\",null,\"Geolocation in progress...\"):'',/*#__PURE__*/react.createElement(territoryFocusControl,{onClickTerritoryFocusButton:onClickTerritoryFocusButton}),'fs'in flags?/*#__PURE__*/react.createElement(fullscreen_control,{className:fullscreenControl}):''),/*#__PURE__*/react.createElement(mapInfoPanel,{className:J40Map_module_mapInfoPanel,featureProperties:detailViewData===null||detailViewData===void 0?void 0:detailViewData.properties,selectedFeatureId:selectedFeature===null||selectedFeature===void 0?void 0:selectedFeature.id}));};/* harmony default export */ var components_J40Map = (J40Map);\n;// CONCATENATED MODULE: ./src/components/MapWrapper/mapWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar mapCaptionTextLink = \"mapWrapper-module--mapCaptionTextLink--23b2n\";\n;// CONCATENATED MODULE: ./src/components/MapWrapper/index.tsx\nvar MapWrapper=function MapWrapper(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({downloadLinkText:{id:'mapwrapper.download.link',defaultMessage:'Download the draft list of prioritized communities (pre-decisional) and datasets used',description:'download link for datasets'},downloadContents:{id:'mapwrapper.download.contents',defaultMessage:'ZIP file will contain one .xlsx, one .csv and one .pdf (30 MB).',description:'download link contents'}});return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:false,showLimitedDataAlert:true}),/*#__PURE__*/react.createElement(components_J40Map,{location:location}),/*#__PURE__*/react.createElement(\"div\",{className:mapCaptionTextLink},/*#__PURE__*/react.createElement(\"a\",{href:DOWNLOAD_ZIP_URL},intl.formatMessage(messages.downloadLinkText))),/*#__PURE__*/react.createElement(\"div\",null,intl.formatMessage(messages.downloadContents)));};/* harmony default export */ var components_MapWrapper = (MapWrapper);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar react_uswds_lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/components/MapLegend/mapLegend.module.scss\n// extracted by mini-css-extract-plugin\nvar legendContainer = \"mapLegend-module--legendContainer--2FaKH\";\nvar legendTooltipText = \"mapLegend-module--legendTooltipText--3wq6f\";\nvar legendHeader = \"mapLegend-module--legendHeader--2GZK6\";\nvar swatchContainer = \"mapLegend-module--swatchContainer--1vU2J\";\nvar legendItem = \"mapLegend-module--legendItem--2VxVZ\";\nvar infoIconWrapper = \"mapLegend-module--infoIconWrapper--2_1Kg\";\nvar infoIcon = \"mapLegend-module--infoIcon--3MRe8\";\nvar colorSwatch = \"mapLegend-module--colorSwatch--_SQwT\";\nvar mapLegend_module_prioritized = \"mapLegend-module--prioritized--2vkQG\";\nvar mapLegend_module_threshold = \"mapLegend-module--threshold--2-1Kq\";\nvar mapLegend_module_nonPrioritized = \"mapLegend-module--nonPrioritized--XbGzN\";\nvar legendTooltipTheme = \"mapLegend-module--legendTooltipTheme--3PGDy\";\nvar placeTop = \"mapLegend-module--place-top--2t_ed\";\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/info_outline.svg\n/* harmony default export */ var info_outline = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHBhdGggZD0iTTAsMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTExLDdoMnYyaC0yVjd6IE0xMSwxMWgydjZoLTJWMTF6IE0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMnM0LjQ4LDEwLDEwLDEwczEwLTQuNDgsMTAtMTBTMTcuNTIsMiwxMiwyeiBNMTIsMjAgYy00LjQxLDAtOC0zLjU5LTgtOHMzLjU5LTgsOC04czgsMy41OSw4LDhTMTYuNDEsMjAsMTIsMjB6Ii8+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./src/components/MapLegend/index.tsx\nvar _excluded=[\"className\",\"children\"];// @ts-ignore\n// Todo VS: This information will be used in the re-design of the tool-tip\n// const getToolTipContent = (type:string) => {\n// const intl = useIntl();\n// const messages = defineMessages({\n// priorityHeader: {\n// id: 'tooltip.info.priority.header',\n// defaultMessage: constants.PRIORITIZED_COMMUNITY,\n// description: 'the header of the prioritized community tooltip',\n// },\n// thresholdHeader: {\n// id: 'tooltip.info.threshold.header',\n// defaultMessage: constants.THRESHOLD_COMMUNITY,\n// description: 'the header of the threshold community tooltip',\n// },\n// priorityText: {\n// id: 'tooltip.info.priority.text',\n// defaultMessage: 'A prioritized community is one that has a cumulative index score of Xth ' +\n// 'percentile and above. 40% of the benefits from investments outlined by the ' +\n// 'Justice40 Initiative should go to prioritized communities.',\n// description: 'the text of the prioritized community tooltip',\n// },\n// thresholdText: {\n// id: 'tooltip.info.threshold.text',\n// defaultMessage: 'Communities with a cumulative index score between Y - X.99th percentile are ' +\n// 'considered threshold communities. While these communities are currently not considered a ' +\n// 'prioritized community, this may change based on updates to the scoring method.',\n// description: 'the text of the threshold community tooltip',\n// },\n// });\n// return (type === 'prioritized') ?\n// (\n//
\n//

{intl.formatMessage(messages.priorityHeader)}

\n//

{intl.formatMessage(messages.priorityText)}

\n//
\n// ) :\n// (\n//
\n//

{intl.formatMessage(messages.thresholdHeader)}

\n//

{intl.formatMessage(messages.thresholdText)}

\n//
\n// );\n// };\nvar MapLegend=function MapLegend(){var intl=(0,gatsby_plugin_intl.useIntl)();// Type definitions required for @trussworks tooltip. This type defines the div that wraps the icon.\n// This allows to pass children and other attributes.\nvar IconWrapper=/*#__PURE__*/react.forwardRef(function(_ref,ref){var className=_ref.className,children=_ref.children,tooltipProps=_objectWithoutPropertiesLoose(_ref,_excluded);return/*#__PURE__*/react.createElement(\"div\",Object.assign({ref:ref,className:infoIconWrapper},tooltipProps),children);});IconWrapper.displayName='custom info wrapper';return/*#__PURE__*/react.createElement(\"div\",{className:legendContainer},/*#__PURE__*/react.createElement(\"h3\",{className:legendHeader},intl.formatMessage(EXPLORE_TOOL_PAGE_TEXT.LEGEND_LABEL)),/*#__PURE__*/react.createElement(\"div\",{className:swatchContainer},/*#__PURE__*/react.createElement(\"div\",{className:legendItem},/*#__PURE__*/react.createElement(\"div\",{className:colorSwatch,id:mapLegend_module_prioritized}),/*#__PURE__*/react.createElement(\"span\",null,intl.formatMessage(EXPLORE_TOOL_PAGE_TEXT.PRIORITY_LABEL)),/*#__PURE__*/react.createElement(react_uswds_lib.Tooltip,{label:\"\\n Communities that have cumulative \\n index score of Xth percentile\\n and above\\n \",position:\"left\",asCustom:IconWrapper},/*#__PURE__*/react.createElement(\"img\",{className:infoIcon,src:info_outline}))),/*#__PURE__*/react.createElement(\"div\",{className:legendItem},/*#__PURE__*/react.createElement(\"div\",{className:colorSwatch,id:mapLegend_module_threshold}),/*#__PURE__*/react.createElement(\"span\",null,intl.formatMessage(EXPLORE_TOOL_PAGE_TEXT.THRESHOLD_LABEL)),/*#__PURE__*/react.createElement(react_uswds_lib.Tooltip,{label:\"\\n Communities with a cumulative \\n index score between Y - X.99th\\n percentile\\n \",position:\"left\",asCustom:IconWrapper},/*#__PURE__*/react.createElement(\"img\",{className:infoIcon,src:info_outline})))));};/* harmony default export */ var components_MapLegend = (MapLegend);\n;// CONCATENATED MODULE: ./src/pages/cejst.module.scss\n// extracted by mini-css-extract-plugin\nvar explorePageHeader = \"cejst-module--explorePageHeader--2TwDz\";\nvar explorePageSubHeader = \"cejst-module--explorePageSubHeader--SF-1J\";\nvar explorePageHeaderText = \"cejst-module--explorePageHeaderText--RSpUL\";\n;// CONCATENATED MODULE: ./src/pages/cejst.tsx\nvar CEJSTPage=function CEJSTPage(_ref){var location=_ref.location;// We temporarily removed MapControls, which would enable you to `setFeatures` also, for now\n// We will bring back later when we have interactive controls.\nreturn/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-main-content'},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(\"h1\",{className:explorePageHeader},\"Explore the tool\"),/*#__PURE__*/react.createElement(\"div\",{className:explorePageSubHeader},/*#__PURE__*/react.createElement(\"div\",{className:explorePageHeaderText},/*#__PURE__*/react.createElement(\"p\",null,\"Zoom into the map to see which communities the tool has currently identified as prioritized (the top 25% of communities) or on the threshold. Learn more about the formula and datasets that were used to prioritize these communities on the\",\" \",/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology'},\"Data & methodology\"),\" \",\"page.\")),/*#__PURE__*/react.createElement(components_MapLegend,null))))),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(components_MapWrapper,{location:location})))),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(components_HowYouCanHelp,null))))));};/* harmony default export */ var cejst = (CEJSTPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0hvd1lvdUNhbkhlbHAvaG93WW91Q2FuSGVscC5tb2R1bGUuc2Nzcz8yOWZiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSG93WW91Q2FuSGVscC9pbmRleC50c3g/Zjk3NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzP2MzMWQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanM/YWRlMyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcz8wZDIxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzPzA5ZjAiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzPzNkOGMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcz8zODM1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrLmpzP2Q0ZWMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanM/YmVlMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcz9iOTNlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjNC5qcz84OWJiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9tYXRoLXV0aWxzLmpzP2Q5MDYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQ0LmpzPzQ1ODkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzPzFhNzEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzPzg5MDIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL2Fzc2VydC5qcz9hYTdhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS93ZWItbWVyY2F0b3ItdXRpbHMuanM/NzM1MiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AbWF0aC5nbC93ZWItbWVyY2F0b3IvZGlzdC9lc20vZml0LWJvdW5kcy5qcz84MTdlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9nZXQtYm91bmRzLmpzPzQwZjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL3dlYi1tZXJjYXRvci12aWV3cG9ydC5qcz8xYWQ2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9ub3JtYWxpemUtdmlld3BvcnQtcHJvcHMuanM/YzNkOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AbWF0aC5nbC93ZWItbWVyY2F0b3IvZGlzdC9lc20vZmx5LXRvLXZpZXdwb3J0LmpzPzNjMjgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL2luZGV4LmpzP2U1YjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdC9tb2R1bGUuanM/ZTI0NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwvZGlzdC9SZXNpemVPYnNlcnZlci5lcy5qcz82ZmVhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9nbG9iYWxzLmpzP2U3YWUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3N0eWxlLXV0aWxzLmpzP2UyZGEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL21hcGJveC9tYXBib3guanM/OWM3ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWF0aC11dGlscy5qcz9mOTFhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9hc3NlcnQuanM/ODA0NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWFwLXN0YXRlLmpzPzRmYjEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL21hcC1jb25zdHJhaW50cy5qcz8yMWNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL21hcC1jb250ZXh0LmpzP2M2N2EiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QuanM/NGY3MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdGVycmFpbi5qcz8xMDFiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3N0YXRpYy1tYXAuanM/NjhkMCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLWludGVycG9sYXRvci5qcz80YWQ0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcz8yNTdlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzPzI2MmUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcz85OWRlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzPzdlODQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3RyYW5zaXRpb24vdHJhbnNpdGlvbi11dGlscy5qcz84ZDM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy90cmFuc2l0aW9uL3ZpZXdwb3J0LWZseS10by1pbnRlcnBvbGF0b3IuanM/NDg3MiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi9saW5lYXItaW50ZXJwb2xhdG9yLmpzPzRiMGUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3RyYW5zaXRpb24vaW5kZXguanM/MmJiOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi1tYW5hZ2VyLmpzP2MzMzQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9oYW1tZXItb3ZlcnJpZGVzLmpzPzNjNzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9oYW1tZXIuYnJvd3Nlci5qcz9iNjk4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL21qb2xuaXIuanMvZGlzdC9lc20vY29uc3RhbnRzLmpzP2Y0MjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9nbG9iYWxzLmpzP2UxNDEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMvd2hlZWwtaW5wdXQuanM/MDUzZSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL2lucHV0cy9tb3ZlLWlucHV0LmpzP2JiNDAiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMva2V5LWlucHV0LmpzPzQzMmEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMvY29udGV4dG1lbnUtaW5wdXQuanM/NWVkMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL3V0aWxzL2V2ZW50LXV0aWxzLmpzPzI1NjIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9ldmVudC1yZWdpc3RyYXIuanM/NDc1MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL2V2ZW50LW1hbmFnZXIuanM/ZDE3MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWFwLWNvbnRyb2xsZXIuanM/MmM1MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9pbnRlcmFjdGl2ZS1tYXAuanM/ODZkYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanM/NTNjYSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvZGVlcC1lcXVhbC5qcz82NTAyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3NvdXJjZS5qcz82ZWU0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanM/Y2NiNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcz8xNWZkIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL2xheWVyLmpzPzlmZjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sLmpzPzgzYjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvYmFzZS1jb250cm9sLmpzP2MzNTciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvZHJhZ2dhYmxlLWNvbnRyb2wuanM/MmY3NCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvY3Jpc3AtcGl4ZWwuanM/ODhhZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9tYXJrZXIuanM/MDA4ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvZHluYW1pYy1wb3NpdGlvbi5qcz9hZDM5Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3BvcHVwLmpzPzk5MzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvYXR0cmlidXRpb24tY29udHJvbC5qcz8yMzEyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL2Z1bGxzY3JlZW4tY29udHJvbC5qcz8xMDM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9nZW9sb2NhdGUtdXRpbHMuanM/ZDM2YiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9nZW9sb2NhdGUtY29udHJvbC5qcz9hYzMwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy92ZXJzaW9uLmpzP2IyNzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1jb250cm9sLmpzP2ExYzUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvc2NhbGUtY29udHJvbC5qcz9lNzIwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9vdmVybGF5cy9jYW52YXMtb3ZlcmxheS5qcz84NTMzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9vdmVybGF5cy9odG1sLW92ZXJsYXkuanM/Y2Q3ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vb3ZlcmxheXMvc3ZnLW92ZXJsYXkuanM/OGU1MCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvc2V0LXJ0bC10ZXh0LXBsdWdpbi5qcz8wMGNmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9pbmRleC5qcz9jMWIzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2hlbHBlcnMvZGlzdC9lcy9pbmRleC5qcz8yOTI1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL21ldGEvZGlzdC9lcy9pbmRleC5qcz80ZTU4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2Jib3gvZGlzdC9lcy9pbmRleC5qcz9jZTFjIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzP2U0MmQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy90ZXJyaXRvcnlGb2N1c0NvbnRyb2wubW9kdWxlLnNjc3M/MDAwYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL3RlcnJpdG9yeUZvY3VzQ29udHJvbC50c3g/MTRlNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvbGlnaHRidWxiX291dGxpbmUuc3ZnPzg0YWYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9tYXBJbnRyb2R1Y3Rpb24ubW9kdWxlLnNjc3M/YWE4NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL21hcEludHJvZHVjdGlvbi50c3g/MmJkMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FyZWFEZXRhaWwvYXJlYURldGFpbC5tb2R1bGUuc2Nzcz80YzM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2RhdGEvY29uc3RhbnRzLnRzeD9iZTVhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvQXJlYURldGFpbC9pbmRleC50c3g/MDk5NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL21hcEluZm9QYW5lbC50c3g/ODg0MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL21hcFN0eWxlLnRzeD85ZDk2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSjQwTWFwLm1vZHVsZS5zY3NzP2I3ZGIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBNYXAudHN4P2FmNzciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBXcmFwcGVyL21hcFdyYXBwZXIubW9kdWxlLnNjc3M/MDJhOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL01hcFdyYXBwZXIvaW5kZXgudHN4P2JkYjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBMZWdlbmQvbWFwTGVnZW5kLm1vZHVsZS5zY3NzPzdlMzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2luZm9fb3V0bGluZS5zdmc/MDczOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL01hcExlZ2VuZC9pbmRleC50c3g/MjhmZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9jZWpzdC5tb2R1bGUuc2Nzcz82MWUzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL3BhZ2VzL2NlanN0LnRzeD9lMWRmIl0sIm5hbWVzIjpbIkhvd1lvdUNhbkhlbHAiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJ5b3VDYW5IZWxwSGVhZGVyIiwiaWQiLCJkZWZhdWx0TWVzc2FnZSIsImRlc2NyaXB0aW9uIiwieW91Q2FuSGVscEluZm9UZXh0IiwieW91Q2FuSGVscEluZm9MaW5rVGV4dCIsInlvdUNhbkhlbHBEYXRhTWV0aFByZWZpeFRleHQiLCJ5b3VDYW5IZWxwRGF0YU1ldGhMaW5rVGV4dCIsInlvdUNhbkhlbHBEYXRhTWV0aFN1ZmZpeFRleHQiLCJ5b3VDYW5IZWxwU2hhcmluZ1ByZWZpeFRleHQiLCJ5b3VDYW5IZWxwU2hhcmluZ0xpbmtUZXh0Iiwic3R5bGVzIiwiZm9ybWF0TWVzc2FnZSIsIlRlcnJpdG9yeUZvY3VzQ29udHJvbCIsIm9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbiIsInVzZU1hcENvbnRyb2wiLCJvbkNsaWNrIiwiY29udGFpbmVyUmVmIiwidGVycml0b3JpZXMiLCJzaG9ydCIsImxvbmciLCJtYXAiLCJ0ZXJyaXRvcnkiLCJNYXBJbnRyb2R1Y3Rpb24iLCJtYXBJbnRyb0hlYWRlciIsImRpZFlvdUtub3ciLCJjZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbiIsImxpZ2h0YnVsYkljb24iLCJET1dOTE9BRF9aSVBfVVJMIiwiRkVBVFVSRV9USUxFX0JBU0VfVVJMIiwiRkVBVFVSRV9USUxFX1BBVEgiLCJYWVpfU1VGRklYIiwiZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lIiwidGlsZXNldE5hbWUiLCJGRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTCIsIkZFQVRVUkVfVElMRV9MT1dfWk9PTV9VUkwiLCJQRVJGT1JNQU5DRV9NQVJLRVJfTUFQX0lETEUiLCJTQ09SRV9QUk9QRVJUWV9ISUdIIiwiU0NPUkVfUFJPUEVSVFlfTE9XIiwiR0VPSURfUFJPUEVSVFkiLCJISUdIX1NDT1JFX1NPVVJDRV9OQU1FIiwiSElHSF9TQ09SRV9MQVlFUl9OQU1FIiwiTE9XX1NDT1JFX1NPVVJDRV9OQU1FIiwiTE9XX1NDT1JFX0xBWUVSX05BTUUiLCJTRUxFQ1RFRF9QUk9QRVJUWSIsIkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0hJR0hMSUdIVF9MQVlFUl9OQU1FIiwiQkxPQ0tfR1JPVVBfQk9VTkRBUllfTEFZRVJfTkFNRSIsIlBPVkVSVFlfUFJPUEVSVFlfUEVSQ0VOVElMRSIsIkhPVVNJTkdfQlVSREVOX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJMSU5HVUlTVElDX0lTT0xBVElPTl9QUk9QRVJUWV9QRVJDRU5USUxFIiwiVU5FTVBMT1lNRU5UX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJUT1RBTF9QT1BVTEFUSU9OIiwiRURVQ0FUSU9OX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJDT1VOVFlfTkFNRSIsIlNUQVRFX05BTUUiLCJTQ09SRV9TT1VSQ0VfTEFZRVIiLCJHTE9CQUxfTUlOX1pPT00iLCJHTE9CQUxfTUFYX1pPT00iLCJHTE9CQUxfTUlOX1pPT01fTE9XIiwiR0xPQkFMX01BWF9aT09NX0xPVyIsIkdMT0JBTF9NSU5fWk9PTV9ISUdITElHSFQiLCJHTE9CQUxfTUFYX1pPT01fSElHSExJR0hUIiwiR0xPQkFMX01JTl9aT09NX0hJR0giLCJHTE9CQUxfTUFYX1pPT01fSElHSCIsIkdMT0JBTF9NQVhfQk9VTkRTIiwiTE9XRVJfNDhfQk9VTkRTIiwiQUxBU0tBX0JPVU5EUyIsIkhBV0FJSV9CT1VORFMiLCJQVUVSVE9fUklDT19CT1VORFMiLCJHVUFNX0JPVU5EUyIsIk1BUklBTkFfSVNMQU5EX0JPVU5EUyIsIkFNRVJJQ0FOX1NBTU9BX0JPVU5EUyIsIkRFRkFVTFRfQ0VOVEVSIiwiREVGQVVMVF9MQVlFUl9PUEFDSVRZIiwiREVGQVVMVF9PVVRMSU5FX0NPTE9SIiwiTUlOX0NPTE9SIiwiTUVEX0NPTE9SIiwiTUFYX0NPTE9SIiwiQk9SREVSX0hJR0hMSUdIVF9DT0xPUiIsIkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX09QQUNJVFkiLCJISUdITElHSFRfQk9SREVSX1dJRFRIIiwiQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfV0lEVEgiLCJTQ09SRV9CT1VOREFSWV9MT1ciLCJTQ09SRV9CT1VOREFSWV9USFJFU0hPTEQiLCJTQ09SRV9CT1VOREFSWV9QUklPUklUSVpFRCIsIkVYUExPUkVfVE9PTF9QQUdFX1RFWFQiLCJQUklPUklUWV9MQUJFTCIsIlRIUkVTSE9MRF9MQUJFTCIsIkxFR0VORF9MQUJFTCIsImlzTW9iaWxlIiwiaXNNb2JpbGVSZWFjdERldmljZURldGVjdCIsInJlYWRhYmxlUGVyY2VudCIsInBlcmNlbnQiLCJ0b0ZpeGVkIiwiZ2V0Q2F0ZWdvcml6YXRpb24iLCJwZXJjZW50aWxlIiwiY2F0ZWdvcml6YXRpb24iLCJjYXRlZ29yeUNpcmNsZVN0eWxlIiwiY29uc3RhbnRzIiwiQXJlYURldGFpbCIsInByb3BlcnRpZXMiLCJjdW11bGF0aXZlSW5kZXhTY29yZSIsImNlbnN1c0Jsb2NrR3JvdXAiLCJjb3VudHkiLCJzdGF0ZSIsInBvcHVsYXRpb24iLCJpbmRpY2F0b3JDb2x1bW5IZWFkZXIiLCJwZXJjZW50aWxlQ29sdW1uSGVhZGVyIiwicG92ZXJ0eSIsImVkdWNhdGlvbiIsImxpbmd1aXN0aWNJc29sYXRpb24iLCJ1bmVtcGxveW1lbnQiLCJob3VzZUJ1cmRlbiIsInNjb3JlIiwiYmxvY2tHcm91cCIsImNvdW50eU5hbWUiLCJzdGF0ZU5hbWUiLCJwb3ZlcnR5SW5mbyIsImxhYmVsIiwidmFsdWUiLCJlZHVJbmZvIiwibGluSXNvSW5mbyIsInVtZW1wbG95SW5mbyIsImluZGljYXRvcnMiLCJ0b0xvY2FsZVN0cmluZyIsImluZGljYXRvciIsImluZGV4IiwiTWFwSW5mb1BhbmVsIiwiY2xhc3NOYW1lIiwiZmVhdHVyZVByb3BlcnRpZXMiLCJzZWxlY3RlZEZlYXR1cmVJZCIsImhleFRvSFNMQSIsImhleCIsImFscGhhIiwiY2hyb21hIiwiY3NzIiwibWFrZVBhaW50IiwiZmllbGQiLCJtaW5SYW1wIiwibWVkUmFtcCIsIm1heFJhbXAiLCJwYWludERlc2NyaXB0b3IiLCJpbWFnZVN1ZmZpeCIsIm1ha2VNYXBTdHlsZSIsImZsYWdDb250YWluZXIiLCJKNDBNYXAiLCJsb2NhdGlvbiIsImhhc2giLCJzbGljZSIsInNwbGl0Iiwiem9vbSIsImxhdCIsImxuZyIsInVzZVN0YXRlIiwibGF0aXR1ZGUiLCJwYXJzZUZsb2F0IiwibG9uZ2l0dWRlIiwidmlld3BvcnQiLCJzZXRWaWV3cG9ydCIsInNlbGVjdGVkRmVhdHVyZSIsInNldFNlbGVjdGVkRmVhdHVyZSIsImRldGFpbFZpZXdEYXRhIiwic2V0RGV0YWlsVmlld0RhdGEiLCJ0cmFuc2l0aW9uSW5Qcm9ncmVzcyIsInNldFRyYW5zaXRpb25JblByb2dyZXNzIiwiZ2VvbG9jYXRpb25JblByb2dyZXNzIiwic2V0R2VvbG9jYXRpb25JblByb2dyZXNzIiwiaXNNb2JpbGVNYXBTdGF0ZSIsInNldElzTW9iaWxlTWFwU3RhdGUiLCJtYXBSZWYiLCJ1c2VSZWYiLCJmbGFncyIsInVzZUZsYWdzIiwiZmlsdGVyIiwidXNlTWVtbyIsImV2ZW50IiwiZmVhdHVyZSIsImZlYXR1cmVzIiwiYmJveCIsIm1pbkxuZyIsIm1pbkxhdCIsIm1heExuZyIsIm1heExhdCIsIm5ld1ZpZXdQb3J0IiwiV2ViTWVyY2F0b3JWaWV3cG9ydCIsImhlaWdodCIsIndpZHRoIiwiZml0Qm91bmRzIiwicGFkZGluZyIsInVuZGVmaW5lZCIsInBvcHVwSW5mbyIsImdvVG9QbGFjZSIsIm9uTG9hZCIsIndpbmRvdyIsIkN5cHJlc3MiLCJjdXJyZW50IiwidW5kZXJseWluZ01hcCIsImdldE1hcCIsImJvdW5kcyIsIm9mZnNldCIsInRyYW5zaXRpb25EdXJhdGlvbiIsInRyYW5zaXRpb25JbnRlcnBvbGF0b3IiLCJGbHlUb0ludGVycG9sYXRvciIsInRyYW5zaXRpb25FYXNpbmciLCJkMyIsInN0b3BQcm9wYWdhdGlvbiIsImJ1dHRvbklEIiwidGFyZ2V0Iiwib25UcmFuc2l0aW9uU3RhcnQiLCJvblRyYW5zaXRpb25FbmQiLCJvbkdlb2xvY2F0ZSIsIm9uQ2xpY2tHZW9sb2NhdGUiLCJlbmFibGVIaWdoQWNjdXJhY3kiLCJNYXBXcmFwcGVyIiwiZG93bmxvYWRMaW5rVGV4dCIsImRvd25sb2FkQ29udGVudHMiLCJNYXBMZWdlbmQiLCJJY29uV3JhcHBlciIsIlJlYWN0IiwicmVmIiwiY2hpbGRyZW4iLCJ0b29sdGlwUHJvcHMiLCJkaXNwbGF5TmFtZSIsImluZm9JY29uIiwiQ0VKU1RQYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Rjs7QUNFUCxHQUFNQSxjQUFhLENBQUcsUUFBaEJBLGNBQWdCLEVBQU0sQ0FDMUIsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUNBLEdBQU1DLFNBQVEsQ0FBR0MsOEJBQWMsQ0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FB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LHFCQUFELEVBQVEsUUFBUSxDQUFFQSxRQUFsQixlQUNOLG9CQUFDLG1DQUFELG1CQUNFLG9CQUFDLDJCQUFELEVBQWMsYUFBYSxDQUFFLElBQTdCLENBQW1DLG9CQUFvQixDQUFFLEtBQXpELEVBREYsQ0FETSxjQUtOLG9CQUFDLG1DQUFELEVBQXNCLFNBQVMsQ0FBRSxrQkFBakMsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUFVLG9CQUFDLG9CQUFELEVBQU0sR0FBRyxLQUFULGVBQ1IsZ0RBQ0UsMEJBQUksU0FBUyxDQUFFdkksaUJBQWYscUJBREYsY0FFRSwyQkFBSyxTQUFTLENBQUVBLG9CQUFoQixlQUNFLDJCQUFLLFNBQVMsQ0FBRUEscUJBQWhCLGVBQ0UsOFJBTUUsb0JBQUMsdUJBQUQsRUFBTSxFQUFFLENBQUUsY0FBVix1QkFORixhQURGLENBREYsY0FhRSxvQkFBQyxvQkFBRCxNQWJGLENBRkYsQ0FEUSxDQUFWLENBREYsY0FzQkUsb0JBQUMsb0JBQUQsRUFBTSxHQUFHLEtBQVQsZUFBVSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUNSLGdEQUNFLG9CQUFDLHFCQUFELEVBQVksUUFBUSxDQUFFdUksUUFBdEIsRUFERixDQURRLENBQVYsQ0F0QkYsY0E0QkUsb0JBQUMsb0JBQUQsRUFBTSxHQUFHLEtBQVQsZUFBVSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUNSLGdEQUNFLG9CQUFDLHdCQUFELE1BREYsQ0FEUSxDQUFWLENBNUJGLENBTE0sQ0FBUixDQXdDRCxDQTNDRCxDQTZDQSwwQ0FBZThFLFNBQWYiLCJmaWxlIjoiNjY2Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBob3dZb3VDYW5IZWxwQ29udGFpbmVyID0gXCJob3dZb3VDYW5IZWxwLW1vZHVsZS0taG93WW91Q2FuSGVscENvbnRhaW5lci0tM3djb3dcIjtcbmV4cG9ydCB2YXIgaG93WW91Q2FuSGVscFRleHQgPSBcImhvd1lvdUNhbkhlbHAtbW9kdWxlLS1ob3dZb3VDYW5IZWxwVGV4dC0tMzhIU0FcIjtcbmV4cG9ydCB2YXIgaG93WW91Q2FuSGVscEhlYWRlciA9IFwiaG93WW91Q2FuSGVscC1tb2R1bGUtLWhvd1lvdUNhbkhlbHBIZWFkZXItLTE2QTFrXCI7XG5leHBvcnQgdmFyIGhvd1lvdUNhbkhlbHBMaXN0ID0gXCJob3dZb3VDYW5IZWxwLW1vZHVsZS0taG93WW91Q2FuSGVscExpc3QtLTN3eUZ2XCI7XG5leHBvcnQgdmFyIGhvd1lvdUNhbkhlbHBMaXN0V3JhcHBlciA9IFwiaG93WW91Q2FuSGVscC1tb2R1bGUtLWhvd1lvdUNhbkhlbHBMaXN0V3JhcHBlci0tQkw3QURcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2hvd1lvdUNhbkhlbHAubW9kdWxlLnNjc3MnO1xuXG5jb25zdCBIb3dZb3VDYW5IZWxwID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICB5b3VDYW5IZWxwSGVhZGVyOiB7XG4gICAgICBpZDogJ2hvd1lvdUNhbkhlbHAuaGVhZGVyLnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdIb3cgWW91IENhbiBIZWxwIEltcHJvdmUgdGhlIFRvb2wnLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgaGVhZGVyIG9mIHRoZSBob3cgeW91IGNhbiBoZWxwIHNlY3Rpb24nLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscEluZm9UZXh0OiB7XG4gICAgICBpZDogJ3lvdUNhbkhlbHBJbmZvVGV4dC5saXN0LmVsZW1lbnQucHJlZml4JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSWYgeW91IGhhdmUgaGVscGZ1bCBpbmZvcm1hdGlvbiwgd2XigJlkIGxvdmUgdG8nLFxuICAgICAgZGVzY3JpcHRpb246ICd5b3UgY2FuIGhlbHAgaW5mbyB0ZXh0ICcsXG4gICAgfSxcbiAgICB5b3VDYW5IZWxwSW5mb0xpbmtUZXh0OiB7XG4gICAgICBpZDogJ3lvdUNhbkhlbHBJbmZvTGluay5saW5rLnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdnZXQgYW4gZW1haWwgZnJvbSB5b3UnLFxuICAgICAgZGVzY3JpcHRpb246ICd5b3UgY2FuIGhlbHAgaW5mbyB0ZXh0ICcsXG4gICAgfSxcbiAgICB5b3VDYW5IZWxwRGF0YU1ldGhQcmVmaXhUZXh0OiB7XG4gICAgICBpZDogJ3lvdUNhbkhlbHBEYXRhTWV0aFByZWZpeFRleHQubGluay5wcmVmaXgudGV4dCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1ZpZXcgb3VyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAndmlldyBvdXInLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscERhdGFNZXRoTGlua1RleHQ6IHtcbiAgICAgIGlkOiAneW91Q2FuSGVscERhdGFNZXRoTGlua1RleHQubGluay50ZXh0JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YSAmIG1ldGhvZG9sb2d5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGF0YSAmIG1ldGhvZG9sb2d5IGxpbmsnLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscERhdGFNZXRoU3VmZml4VGV4dDoge1xuICAgICAgaWQ6ICd5b3VDYW5IZWxwRGF0YU1ldGhTdWZmaXhUZXh0Lmxpbmsuc3VmZml4LnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdhbmQgc2VuZCB1cyBmZWVkYmFjaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ3NlbmQgdXMgZmVlZGJhY2t2IHZpYSBlbWFpbCcsXG4gICAgfSxcbiAgICB5b3VDYW5IZWxwU2hhcmluZ1ByZWZpeFRleHQ6IHtcbiAgICAgIGlkOiAneW91Q2FuSGVscFNoYXJpbmdQcmVmaXhUZXh0LmxpbmsucHJlZml4LnRleHQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGaW5kIHlvdXIgY29tbXVuaXR5IGFuZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ2ZpbmQgeW91ciBjb21tdW5pdHknLFxuICAgIH0sXG4gICAgeW91Q2FuSGVscFNoYXJpbmdMaW5rVGV4dDoge1xuICAgICAgaWQ6ICd5b3VDYW5IZWxwU2hhcmluZ0xpbmtUZXh0LmxpbmsudGV4dCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ3NoYXJlIHlvdXIgZmVlZGJhY2snLFxuICAgICAgZGVzY3JpcHRpb246ICdzaGFyaW5nIGxpbmsgdG8gZW1haWwnLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5ob3dZb3VDYW5IZWxwQ29udGFpbmVyfT5cbiAgICAgIDxoMiBjbGFzc05hbWU9e3N0eWxlcy5ob3dZb3VDYW5IZWxwSGVhZGVyfT5cbiAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwSGVhZGVyKX1cbiAgICAgIDwvaDI+XG4gICAgICA8dWwgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3RXcmFwcGVyfT5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBMaXN0fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBUZXh0fT5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMueW91Q2FuSGVscEluZm9UZXh0KX1cbiAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICA8YSBocmVmPXsnbWFpbHRvOnNjcmVlbmluZ3Rvb2wuZmVlZGJhY2tAdXNkcy5nb3YnfT5cbiAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwSW5mb0xpbmtUZXh0KX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIHtgIGB9LlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3R9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscFRleHR9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwRGF0YU1ldGhQcmVmaXhUZXh0KX1cbiAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICA8TGluayB0bz17Jy9tZXRob2RvbG9neSd9PlxuICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnlvdUNhbkhlbHBEYXRhTWV0aExpbmtUZXh0KX1cbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnlvdUNhbkhlbHBEYXRhTWV0aFN1ZmZpeFRleHQpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3R9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscFRleHR9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy55b3VDYW5IZWxwU2hhcmluZ1ByZWZpeFRleHQpfVxuICAgICAgICAgICAge2AgYH1cbiAgICAgICAgICAgIDxhIGhyZWY9eydtYWlsdG86c2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdid9PlxuICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnlvdUNhbkhlbHBTaGFyaW5nTGlua1RleHQpfVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAge2AgYH0uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSG93WW91Q2FuSGVscDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdO1xuXG4gIGlmIChfaSA9PSBudWxsKSByZXR1cm47XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuXG4gIHZhciBfcywgX2U7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufSIsImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheUxpbWl0IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufSIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5cbi8qKlxyXG4gKiBDb21tb24gdXRpbGl0aWVzXHJcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcclxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxyXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuICpcclxuICogQHBhcmFtIHtGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3J9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRNYXRyaXhBcnJheVR5cGUodHlwZSkge1xuICBBUlJBWV9UWVBFID0gdHlwZTtcbn1cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuLyoqXHJcbiAqIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBBbmdsZSBpbiBEZWdyZWVzXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SYWRpYW4oYSkge1xuICByZXR1cm4gYSAqIGRlZ3JlZTtcbn1cbi8qKlxyXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJndW1lbnRzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB2YWx1ZSwgd2l0aGluIGFuIGFic29sdXRlXHJcbiAqIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSBvZiBnbE1hdHJpeC5FUFNJTE9OIChhbiBhYnNvbHV0ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgdmFsdWVzIGxlc3NcclxuICogdGhhbiBvciBlcXVhbCB0byAxLjAsIGFuZCBhIHJlbGF0aXZlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciBsYXJnZXIgdmFsdWVzKVxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgbnVtYmVyIHRvIHRlc3QuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgbnVtYmVyIHRvIHRlc3QuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXJzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuaWYgKCFNYXRoLmh5cG90KSBNYXRoLmh5cG90ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgeSA9IDAsXG4gICAgICBpID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgeSArPSBhcmd1bWVudHNbaV0gKiBhcmd1bWVudHNbaV07XG4gIH1cblxuICByZXR1cm4gTWF0aC5zcXJ0KHkpO1xufTsiLCJpbXBvcnQgXCJjb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qc1wiO1xuaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogNCBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWM0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjNFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjNCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeiwgdykge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5jZWlsKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguZmxvb3IoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICBvdXRbM10gPSBNYXRoLm1pbihhWzNdLCBiWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByb3VuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzQncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSAtYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IHggKiBsZW47XG4gIG91dFsxXSA9IHkgKiBsZW47XG4gIG91dFsyXSA9IHogKiBsZW47XG4gIG91dFszXSA9IHcgKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjcm9zcy1wcm9kdWN0IG9mIHRocmVlIHZlY3RvcnMgaW4gYSA0LWRpbWVuc2lvbmFsIHNwYWNlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSByZXN1bHQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFUgdGhlIGZpcnN0IHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVyB0aGUgdGhpcmQgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSByZXN1bHRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIHUsIHYsIHcpIHtcbiAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLFxuICAgICAgQiA9IHZbMF0gKiB3WzJdIC0gdlsyXSAqIHdbMF0sXG4gICAgICBDID0gdlswXSAqIHdbM10gLSB2WzNdICogd1swXSxcbiAgICAgIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLFxuICAgICAgRSA9IHZbMV0gKiB3WzNdIC0gdlszXSAqIHdbMV0sXG4gICAgICBGID0gdlsyXSAqIHdbM10gLSB2WzNdICogd1syXTtcbiAgdmFyIEcgPSB1WzBdO1xuICB2YXIgSCA9IHVbMV07XG4gIHZhciBJID0gdVsyXTtcbiAgdmFyIEogPSB1WzNdO1xuICBvdXRbMF0gPSBIICogRiAtIEkgKiBFICsgSiAqIEQ7XG4gIG91dFsxXSA9IC0oRyAqIEYpICsgSSAqIEMgLSBKICogQjtcbiAgb3V0WzJdID0gRyAqIEUgLSBIICogQyArIEogKiBBO1xuICBvdXRbM10gPSAtKEcgKiBEKSArIEggKiBCIC0gSSAqIEE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIHZhciBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDsgLy8gTWFyc2FnbGlhLCBHZW9yZ2UuIENob29zaW5nIGEgUG9pbnQgZnJvbSB0aGUgU3VyZmFjZSBvZiBhXG4gIC8vIFNwaGVyZS4gQW5uLiBNYXRoLiBTdGF0aXN0LiA0MyAoMTk3MiksIG5vLiAyLCA2NDUtLTY0Ni5cbiAgLy8gaHR0cDovL3Byb2plY3RldWNsaWQub3JnL2V1Y2xpZC5hb21zLzExNzc2OTI2NDQ7XG5cbiAgdmFyIHYxLCB2MiwgdjMsIHY0O1xuICB2YXIgczEsIHMyO1xuXG4gIGRvIHtcbiAgICB2MSA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMxID0gdjEgKiB2MSArIHYyICogdjI7XG4gIH0gd2hpbGUgKHMxID49IDEpO1xuXG4gIGRvIHtcbiAgICB2MyA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjQgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMyID0gdjMgKiB2MyArIHY0ICogdjQ7XG4gIH0gd2hpbGUgKHMyID49IDEpO1xuXG4gIHZhciBkID0gTWF0aC5zcXJ0KCgxIC0gczEpIC8gczIpO1xuICBvdXRbMF0gPSBzY2FsZSAqIHYxO1xuICBvdXRbMV0gPSBzY2FsZSAqIHYyO1xuICBvdXRbMl0gPSBzY2FsZSAqIHYzICogZDtcbiAgb3V0WzNdID0gc2NhbGUgKiB2NCAqIGQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTsgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcblxuICB2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG4gIHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcbiAgdmFyIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuICB2YXIgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6OyAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cbiAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWM0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjNHMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDQ7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIHZlY1szXSA9IGFbaSArIDNdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICAgIGFbaSArIDNdID0gdmVjWzNdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIHZlYzQgZnJvbSAnZ2wtbWF0cml4L3ZlYzQnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hdDQoKSB7XG4gIHJldHVybiBbMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMV07XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtVmVjdG9yKG1hdHJpeCwgdmVjdG9yKSB7XG4gIHZhciByZXN1bHQgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIHZlY3RvciwgbWF0cml4KTtcbiAgdmVjNC5zY2FsZShyZXN1bHQsIHJlc3VsdCwgMSAvIHJlc3VsdFszXSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbW9kKHZhbHVlLCBkaXZpc29yKSB7XG4gIHZhciBtb2R1bHVzID0gdmFsdWUgJSBkaXZpc29yO1xuICByZXR1cm4gbW9kdWx1cyA8IDAgPyBkaXZpc29yICsgbW9kdWx1cyA6IG1vZHVsdXM7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVycChzdGFydCwgZW5kLCBzdGVwKSB7XG4gIHJldHVybiBzdGVwICogZW5kICsgKDEgLSBzdGVwKSAqIHN0YXJ0O1xufVxuXG5mdW5jdGlvbiBpZUxvZzIoeCkge1xuICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzJFO1xufVxuXG5leHBvcnQgdmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgaWVMb2cyOyIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5pbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiA0eDQgTWF0cml4PGJyPkZvcm1hdDogY29sdW1uLW1ham9yLCB3aGVuIHR5cGVkIG91dCBpdCBsb29rcyBsaWtlIHJvdy1tYWpvcjxicj5UaGUgbWF0cmljZXMgYXJlIGJlaW5nIHBvc3QgbXVsdGlwbGllZC5cclxuICogQG1vZHVsZSBtYXQ0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQ0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFs1XSA9IDE7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICBvdXRbOV0gPSBhWzldO1xuICBvdXRbMTBdID0gYVsxMF07XG4gIG91dFsxMV0gPSBhWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQ0IHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hdDQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcclxuICogQHJldHVybnMge21hdDR9IEEgbmV3IG1hdDRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMDM7XG4gIG91dFs0XSA9IG0xMDtcbiAgb3V0WzVdID0gbTExO1xuICBvdXRbNl0gPSBtMTI7XG4gIG91dFs3XSA9IG0xMztcbiAgb3V0WzhdID0gbTIwO1xuICBvdXRbOV0gPSBtMjE7XG4gIG91dFsxMF0gPSBtMjI7XG4gIG91dFsxMV0gPSBtMjM7XG4gIG91dFsxMl0gPSBtMzA7XG4gIG91dFsxM10gPSBtMzE7XG4gIG91dFsxNF0gPSBtMzI7XG4gIG91dFsxNV0gPSBtMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMDM7XG4gIG91dFs0XSA9IG0xMDtcbiAgb3V0WzVdID0gbTExO1xuICBvdXRbNl0gPSBtMTI7XG4gIG91dFs3XSA9IG0xMztcbiAgb3V0WzhdID0gbTIwO1xuICBvdXRbOV0gPSBtMjE7XG4gIG91dFsxMF0gPSBtMjI7XG4gIG91dFsxMV0gPSBtMjM7XG4gIG91dFsxMl0gPSBtMzA7XG4gIG91dFsxM10gPSBtMzE7XG4gIG91dFsxNF0gPSBtMzI7XG4gIG91dFsxNV0gPSBtMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM107XG4gICAgdmFyIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG4gICAgdmFyIGEyMyA9IGFbMTFdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhMDE7XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhMDI7XG4gICAgb3V0WzldID0gYTEyO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYTAzO1xuICAgIG91dFsxM10gPSBhMTM7XG4gICAgb3V0WzE0XSA9IGEyMztcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhWzFdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhWzJdO1xuICAgIG91dFs5XSA9IGFbNl07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYVszXTtcbiAgICBvdXRbMTNdID0gYVs3XTtcbiAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBJbnZlcnRzIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICBvdXRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgb3V0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0O1xuICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgb3V0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0O1xuICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgb3V0WzBdID0gYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpO1xuICBvdXRbMV0gPSAtKGEwMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gIG91dFsyXSA9IGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzNdID0gLShhMDEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbNF0gPSAtKGExMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gIG91dFs1XSA9IGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKTtcbiAgb3V0WzZdID0gLShhMDAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbN10gPSBhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFs4XSA9IGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKTtcbiAgb3V0WzldID0gLShhMDAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkpO1xuICBvdXRbMTBdID0gYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpO1xuICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICBvdXRbMTJdID0gLShhMTAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkpO1xuICBvdXRbMTNdID0gYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpO1xuICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICBvdXRbMTVdID0gYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0NHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07IC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuXG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzJdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFszXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbNF07XG4gIGIxID0gYls1XTtcbiAgYjIgPSBiWzZdO1xuICBiMyA9IGJbN107XG4gIG91dFs0XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbNV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzZdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFs3XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbOF07XG4gIGIxID0gYls5XTtcbiAgYjIgPSBiWzEwXTtcbiAgYjMgPSBiWzExXTtcbiAgb3V0WzhdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs5XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTBdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxMV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzEyXTtcbiAgYjEgPSBiWzEzXTtcbiAgYjIgPSBiWzE0XTtcbiAgYjMgPSBiWzE1XTtcbiAgb3V0WzEyXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMTNdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxNF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzE1XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdLFxuICAgICAgeiA9IHZbMl07XG4gIHZhciBhMDAsIGEwMSwgYTAyLCBhMDM7XG4gIHZhciBhMTAsIGExMSwgYTEyLCBhMTM7XG4gIHZhciBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgaWYgKGEgPT09IG91dCkge1xuICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMl0gKiB4ICsgYVs2XSAqIHkgKyBhWzEwXSAqIHogKyBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICB9IGVsc2Uge1xuICAgIGEwMCA9IGFbMF07XG4gICAgYTAxID0gYVsxXTtcbiAgICBhMDIgPSBhWzJdO1xuICAgIGEwMyA9IGFbM107XG4gICAgYTEwID0gYVs0XTtcbiAgICBhMTEgPSBhWzVdO1xuICAgIGExMiA9IGFbNl07XG4gICAgYTEzID0gYVs3XTtcbiAgICBhMjAgPSBhWzhdO1xuICAgIGEyMSA9IGFbOV07XG4gICAgYTIyID0gYVsxMF07XG4gICAgYTIzID0gYVsxMV07XG4gICAgb3V0WzBdID0gYTAwO1xuICAgIG91dFsxXSA9IGEwMTtcbiAgICBvdXRbMl0gPSBhMDI7XG4gICAgb3V0WzNdID0gYTAzO1xuICAgIG91dFs0XSA9IGExMDtcbiAgICBvdXRbNV0gPSBhMTE7XG4gICAgb3V0WzZdID0gYTEyO1xuICAgIG91dFs3XSA9IGExMztcbiAgICBvdXRbOF0gPSBhMjA7XG4gICAgb3V0WzldID0gYTIxO1xuICAgIG91dFsxMF0gPSBhMjI7XG4gICAgb3V0WzExXSA9IGEyMztcbiAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdO1xuICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyBub3QgdXNpbmcgdmVjdG9yaXphdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgb3V0WzBdID0gYVswXSAqIHg7XG4gIG91dFsxXSA9IGFbMV0gKiB4O1xuICBvdXRbMl0gPSBhWzJdICogeDtcbiAgb3V0WzNdID0gYVszXSAqIHg7XG4gIG91dFs0XSA9IGFbNF0gKiB5O1xuICBvdXRbNV0gPSBhWzVdICogeTtcbiAgb3V0WzZdID0gYVs2XSAqIHk7XG4gIG91dFs3XSA9IGFbN10gKiB5O1xuICBvdXRbOF0gPSBhWzhdICogejtcbiAgb3V0WzldID0gYVs5XSAqIHo7XG4gIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBnaXZlbiBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG4gIHZhciBhMDAsIGEwMSwgYTAyLCBhMDM7XG4gIHZhciBhMTAsIGExMSwgYTEyLCBhMTM7XG4gIHZhciBhMjAsIGEyMSwgYTIyLCBhMjM7XG4gIHZhciBiMDAsIGIwMSwgYjAyO1xuICB2YXIgYjEwLCBiMTEsIGIxMjtcbiAgdmFyIGIyMCwgYjIxLCBiMjI7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjO1xuICBhMDAgPSBhWzBdO1xuICBhMDEgPSBhWzFdO1xuICBhMDIgPSBhWzJdO1xuICBhMDMgPSBhWzNdO1xuICBhMTAgPSBhWzRdO1xuICBhMTEgPSBhWzVdO1xuICBhMTIgPSBhWzZdO1xuICBhMTMgPSBhWzddO1xuICBhMjAgPSBhWzhdO1xuICBhMjEgPSBhWzldO1xuICBhMjIgPSBhWzEwXTtcbiAgYTIzID0gYVsxMV07IC8vIENvbnN0cnVjdCB0aGUgZWxlbWVudHMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeFxuXG4gIGIwMCA9IHggKiB4ICogdCArIGM7XG4gIGIwMSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBiMDIgPSB6ICogeCAqIHQgLSB5ICogcztcbiAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIGIxMSA9IHkgKiB5ICogdCArIGM7XG4gIGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICBiMjAgPSB4ICogeiAqIHQgKyB5ICogcztcbiAgYjIxID0geSAqIHogKiB0IC0geCAqIHM7XG4gIGIyMiA9IHogKiB6ICogdCArIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICBvdXRbMV0gPSBhMDEgKiBiMDAgKyBhMTEgKiBiMDEgKyBhMjEgKiBiMDI7XG4gIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjtcbiAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICBvdXRbNF0gPSBhMDAgKiBiMTAgKyBhMTAgKiBiMTEgKyBhMjAgKiBiMTI7XG4gIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjtcbiAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICBvdXRbN10gPSBhMDMgKiBiMTAgKyBhMTMgKiBiMTEgKyBhMjMgKiBiMTI7XG4gIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjtcbiAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICBvdXRbMTBdID0gYTAyICogYjIwICsgYTEyICogYjIxICsgYTIyICogYjIyO1xuICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcbiAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xuICBvdXRbOV0gPSBhMDEgKiBzICsgYTIxICogYztcbiAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xuICBvdXRbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogcztcbiAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcbiAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IHZbMV07XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSB2WzJdO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGUgYXJvdW5kIGEgZ2l2ZW4gYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZShkZXN0LCBkZXN0LCByYWQsIGF4aXMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVgoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVhSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IC1zO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21ZUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAtcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gcztcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWihkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWlJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLXM7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiBhbmQgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dCwgcSwgdikge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0gKHl5ICsgenopO1xuICBvdXRbMV0gPSB4eSArIHd6O1xuICBvdXRbMl0gPSB4eiAtIHd5O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4eSAtIHd6O1xuICBvdXRbNV0gPSAxIC0gKHh4ICsgenopO1xuICBvdXRbNl0gPSB5eiArIHd4O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4eiArIHd5O1xuICBvdXRbOV0gPSB5eiAtIHd4O1xuICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBmcm9tIGEgZHVhbCBxdWF0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBNYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7bWF0NH0gbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0MihvdXQsIGEpIHtcbiAgdmFyIHRyYW5zbGF0aW9uID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN107XG4gIHZhciBtYWduaXR1ZGUgPSBieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnogKyBidyAqIGJ3OyAvL09ubHkgc2NhbGUgaWYgaXQgbWFrZXMgc2Vuc2VcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIHRyYW5zbGF0aW9uWzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDIgLyBtYWduaXR1ZGU7XG4gICAgdHJhbnNsYXRpb25bMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyIC8gbWFnbml0dWRlO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zbGF0aW9uWzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMjtcbiAgICB0cmFuc2xhdGlvblsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDI7XG4gICAgdHJhbnNsYXRpb25bMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyO1xuICB9XG5cbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBhLCB0cmFuc2xhdGlvbik7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXHJcbiAqICBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGggZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sXHJcbiAqICB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHRyYW5zbGF0aW9uIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXHJcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgbWF0KSB7XG4gIG91dFswXSA9IG1hdFsxMl07XG4gIG91dFsxXSA9IG1hdFsxM107XG4gIG91dFsyXSA9IG1hdFsxNF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgc2NhbGluZyBmYWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cclxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlXHJcbiAqICB3aXRoIGEgbm9ybWFsaXplZCBRdWF0ZXJuaW9uIHBhcmFtdGVyLCB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmVcclxuICogIHRoZSBzYW1lIGFzIHRoZSBzY2FsaW5nIHZlY3RvclxyXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXHJcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxpbmcob3V0LCBtYXQpIHtcbiAgdmFyIG0xMSA9IG1hdFswXTtcbiAgdmFyIG0xMiA9IG1hdFsxXTtcbiAgdmFyIG0xMyA9IG1hdFsyXTtcbiAgdmFyIG0yMSA9IG1hdFs0XTtcbiAgdmFyIG0yMiA9IG1hdFs1XTtcbiAgdmFyIG0yMyA9IG1hdFs2XTtcbiAgdmFyIG0zMSA9IG1hdFs4XTtcbiAgdmFyIG0zMiA9IG1hdFs5XTtcbiAgdmFyIG0zMyA9IG1hdFsxMF07XG4gIG91dFswXSA9IE1hdGguaHlwb3QobTExLCBtMTIsIG0xMyk7XG4gIG91dFsxXSA9IE1hdGguaHlwb3QobTIxLCBtMjIsIG0yMyk7XG4gIG91dFsyXSA9IE1hdGguaHlwb3QobTMxLCBtMzIsIG0zMyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSByb3RhdGlvbmFsIGNvbXBvbmVudFxyXG4gKiAgb2YgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGhcclxuICogIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLCB0aGUgcmV0dXJuZWQgcXVhdGVybmlvbiB3aWxsIGJlIHRoZVxyXG4gKiAgc2FtZSBhcyB0aGUgcXVhdGVybmlvbiBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBRdWF0ZXJuaW9uIHRvIHJlY2VpdmUgdGhlIHJvdGF0aW9uIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHtcbiAgdmFyIHNjYWxpbmcgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgZ2V0U2NhbGluZyhzY2FsaW5nLCBtYXQpO1xuICB2YXIgaXMxID0gMSAvIHNjYWxpbmdbMF07XG4gIHZhciBpczIgPSAxIC8gc2NhbGluZ1sxXTtcbiAgdmFyIGlzMyA9IDEgLyBzY2FsaW5nWzJdO1xuICB2YXIgc20xMSA9IG1hdFswXSAqIGlzMTtcbiAgdmFyIHNtMTIgPSBtYXRbMV0gKiBpczI7XG4gIHZhciBzbTEzID0gbWF0WzJdICogaXMzO1xuICB2YXIgc20yMSA9IG1hdFs0XSAqIGlzMTtcbiAgdmFyIHNtMjIgPSBtYXRbNV0gKiBpczI7XG4gIHZhciBzbTIzID0gbWF0WzZdICogaXMzO1xuICB2YXIgc20zMSA9IG1hdFs4XSAqIGlzMTtcbiAgdmFyIHNtMzIgPSBtYXRbOV0gKiBpczI7XG4gIHZhciBzbTMzID0gbWF0WzEwXSAqIGlzMztcbiAgdmFyIHRyYWNlID0gc20xMSArIHNtMjIgKyBzbTMzO1xuICB2YXIgUyA9IDA7XG5cbiAgaWYgKHRyYWNlID4gMCkge1xuICAgIFMgPSBNYXRoLnNxcnQodHJhY2UgKyAxLjApICogMjtcbiAgICBvdXRbM10gPSAwLjI1ICogUztcbiAgICBvdXRbMF0gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMV0gPSAoc20zMSAtIHNtMTMpIC8gUztcbiAgICBvdXRbMl0gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgfSBlbHNlIGlmIChzbTExID4gc20yMiAmJiBzbTExID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMjMgLSBzbTMyKSAvIFM7XG4gICAgb3V0WzBdID0gMC4yNSAqIFM7XG4gICAgb3V0WzFdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzJdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gIH0gZWxzZSBpZiAoc20yMiA+IHNtMzMpIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMjIgLSBzbTExIC0gc20zMykgKiAyO1xuICAgIG91dFszXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFswXSA9IChzbTEyICsgc20yMSkgLyBTO1xuICAgIG91dFsxXSA9IDAuMjUgKiBTO1xuICAgIG91dFsyXSA9IChzbTIzICsgc20zMikgLyBTO1xuICB9IGVsc2Uge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20zMyAtIHNtMTEgLSBzbTIyKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMTIgLSBzbTIxKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gICAgb3V0WzFdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gICAgb3V0WzJdID0gMC4yNSAqIFM7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBzIFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlKG91dCwgcSwgdiwgcykge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICB2YXIgc3ggPSBzWzBdO1xuICB2YXIgc3kgPSBzWzFdO1xuICB2YXIgc3ogPSBzWzJdO1xuICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlLCByb3RhdGluZyBhbmQgc2NhbGluZyBhcm91bmQgdGhlIGdpdmVuIG9yaWdpblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgb3JpZ2luKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgbmVnYXRpdmVPcmlnaW4pO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IG8gVGhlIG9yaWdpbiB2ZWN0b3IgYXJvdW5kIHdoaWNoIHRvIHNjYWxlIGFuZCByb3RhdGVcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW4ob3V0LCBxLCB2LCBzLCBvKSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIHZhciBzeCA9IHNbMF07XG4gIHZhciBzeSA9IHNbMV07XG4gIHZhciBzeiA9IHNbMl07XG4gIHZhciBveCA9IG9bMF07XG4gIHZhciBveSA9IG9bMV07XG4gIHZhciBveiA9IG9bMl07XG4gIHZhciBvdXQwID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIHZhciBvdXQxID0gKHh5ICsgd3opICogc3g7XG4gIHZhciBvdXQyID0gKHh6IC0gd3kpICogc3g7XG4gIHZhciBvdXQ0ID0gKHh5IC0gd3opICogc3k7XG4gIHZhciBvdXQ1ID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIHZhciBvdXQ2ID0gKHl6ICsgd3gpICogc3k7XG4gIHZhciBvdXQ4ID0gKHh6ICsgd3kpICogc3o7XG4gIHZhciBvdXQ5ID0gKHl6IC0gd3gpICogc3o7XG4gIHZhciBvdXQxMCA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICBvdXRbMF0gPSBvdXQwO1xuICBvdXRbMV0gPSBvdXQxO1xuICBvdXRbMl0gPSBvdXQyO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSBvdXQ0O1xuICBvdXRbNV0gPSBvdXQ1O1xuICBvdXRbNl0gPSBvdXQ2O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBvdXQ4O1xuICBvdXRbOV0gPSBvdXQ5O1xuICBvdXRbMTBdID0gb3V0MTA7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXSArIG94IC0gKG91dDAgKiBveCArIG91dDQgKiBveSArIG91dDggKiBveik7XG4gIG91dFsxM10gPSB2WzFdICsgb3kgLSAob3V0MSAqIG94ICsgb3V0NSAqIG95ICsgb3V0OSAqIG96KTtcbiAgb3V0WzE0XSA9IHZbMl0gKyBveiAtIChvdXQyICogb3ggKyBvdXQ2ICogb3kgKyBvdXQxMCAqIG96KTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geXggLSB3ejtcbiAgb3V0WzVdID0gMSAtIHh4IC0geno7XG4gIG91dFs2XSA9IHp5ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHp4ICsgd3k7XG4gIG91dFs5XSA9IHp5IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0geHggLSB5eTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZydXN0dW0ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCk7XG4gIHZhciB0YiA9IDEgLyAodG9wIC0gYm90dG9tKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gbmVhciAqIDIgKiBybDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gbmVhciAqIDIgKiB0YjtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHJpZ2h0ICsgbGVmdCkgKiBybDtcbiAgb3V0WzldID0gKHRvcCArIGJvdHRvbSkgKiB0YjtcbiAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgKiAyICogbmY7XG4gIG91dFsxNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cclxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgbmY7XG4gIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGY7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTVdID0gMDtcblxuICBpZiAoZmFyICE9IG51bGwgJiYgZmFyICE9PSBJbmZpbml0eSkge1xuICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE0XSA9IDIgKiBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtMiAqIG5lYXI7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGZpZWxkIG9mIHZpZXcuXHJcbiAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBwcm9qZWN0aW9uIG1hdHJpY2VzIHRvIGJlIHVzZWRcclxuICogd2l0aCB0aGUgc3RpbGwgZXhwZXJpZW1lbnRhbCBXZWJWUiBBUEkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtPYmplY3R9IGZvdiBPYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHZhbHVlczogdXBEZWdyZWVzLCBkb3duRGVncmVlcywgbGVmdERlZ3JlZXMsIHJpZ2h0RGVncmVlc1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyhvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgdmFyIHlTY2FsZSA9IDIuMCAvICh1cFRhbiArIGRvd25UYW4pO1xuICBvdXRbMF0gPSB4U2NhbGU7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIG91dFs0XSA9IDAuMDtcbiAgb3V0WzVdID0geVNjYWxlO1xuICBvdXRbNl0gPSAwLjA7XG4gIG91dFs3XSA9IDAuMDtcbiAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gIG91dFs5XSA9ICh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41O1xuICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTFdID0gLTEuMDtcbiAgb3V0WzEyXSA9IDAuMDtcbiAgb3V0WzEzXSA9IDAuMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxNV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRobyhvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBsciA9IDEgLyAobGVmdCAtIHJpZ2h0KTtcbiAgdmFyIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSAtMiAqIGxyO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAtMiAqIGJ0O1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMiAqIG5mO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxyXG4gKiBJZiB5b3Ugd2FudCBhIG1hdHJpeCB0aGF0IGFjdHVhbGx5IG1ha2VzIGFuIG9iamVjdCBsb29rIGF0IGFub3RoZXIgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSB0YXJnZXRUbyBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW47XG4gIHZhciBleWV4ID0gZXllWzBdO1xuICB2YXIgZXlleSA9IGV5ZVsxXTtcbiAgdmFyIGV5ZXogPSBleWVbMl07XG4gIHZhciB1cHggPSB1cFswXTtcbiAgdmFyIHVweSA9IHVwWzFdO1xuICB2YXIgdXB6ID0gdXBbMl07XG4gIHZhciBjZW50ZXJ4ID0gY2VudGVyWzBdO1xuICB2YXIgY2VudGVyeSA9IGNlbnRlclsxXTtcbiAgdmFyIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoZXlleSAtIGNlbnRlcnkpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KG91dCk7XG4gIH1cblxuICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICB6MSA9IGV5ZXkgLSBjZW50ZXJ5O1xuICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuICBsZW4gPSAxIC8gTWF0aC5oeXBvdCh6MCwgejEsIHoyKTtcbiAgejAgKj0gbGVuO1xuICB6MSAqPSBsZW47XG4gIHoyICo9IGxlbjtcbiAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgbGVuID0gTWF0aC5oeXBvdCh4MCwgeDEsIHgyKTtcblxuICBpZiAoIWxlbikge1xuICAgIHgwID0gMDtcbiAgICB4MSA9IDA7XG4gICAgeDIgPSAwO1xuICB9IGVsc2Uge1xuICAgIGxlbiA9IDEgLyBsZW47XG4gICAgeDAgKj0gbGVuO1xuICAgIHgxICo9IGxlbjtcbiAgICB4MiAqPSBsZW47XG4gIH1cblxuICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICB5MSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuICBsZW4gPSBNYXRoLmh5cG90KHkwLCB5MSwgeTIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeTAgPSAwO1xuICAgIHkxID0gMDtcbiAgICB5MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB5MCAqPSBsZW47XG4gICAgeTEgKj0gbGVuO1xuICAgIHkyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB5MDtcbiAgb3V0WzJdID0gejA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHgxO1xuICBvdXRbNV0gPSB5MTtcbiAgb3V0WzZdID0gejE7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHgyO1xuICBvdXRbOV0gPSB5MjtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgb3V0WzE0XSA9IC0oejAgKiBleWV4ICsgejEgKiBleWV5ICsgejIgKiBleWV6KTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgbWF0cml4IHRoYXQgbWFrZXMgc29tZXRoaW5nIGxvb2sgYXQgc29tZXRoaW5nIGVsc2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0YXJnZXRUbyhvdXQsIGV5ZSwgdGFyZ2V0LCB1cCkge1xuICB2YXIgZXlleCA9IGV5ZVswXSxcbiAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICB1cHkgPSB1cFsxXSxcbiAgICAgIHVweiA9IHVwWzJdO1xuICB2YXIgejAgPSBleWV4IC0gdGFyZ2V0WzBdLFxuICAgICAgejEgPSBleWV5IC0gdGFyZ2V0WzFdLFxuICAgICAgejIgPSBleWV6IC0gdGFyZ2V0WzJdO1xuICB2YXIgbGVuID0gejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuICB9XG5cbiAgdmFyIHgwID0gdXB5ICogejIgLSB1cHogKiB6MSxcbiAgICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MixcbiAgICAgIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgbGVuID0geDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHgwICo9IGxlbjtcbiAgICB4MSAqPSBsZW47XG4gICAgeDIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHgxO1xuICBvdXRbMl0gPSB4MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gejEgKiB4MiAtIHoyICogeDE7XG4gIG91dFs1XSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICBvdXRbNl0gPSB6MCAqIHgxIC0gejEgKiB4MDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gejA7XG4gIG91dFs5XSA9IHoxO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gZXlleDtcbiAgb3V0WzEzXSA9IGV5ZXk7XG4gIG91dFsxNF0gPSBleWV6O1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0NChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIsIFwiICsgYVs4XSArIFwiLCBcIiArIGFbOV0gKyBcIiwgXCIgKyBhWzEwXSArIFwiLCBcIiArIGFbMTFdICsgXCIsIFwiICsgYVsxMl0gKyBcIiwgXCIgKyBhWzEzXSArIFwiLCBcIiArIGFbMTRdICsgXCIsIFwiICsgYVsxNV0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdLCBhWzldLCBhWzEwXSwgYVsxMV0sIGFbMTJdLCBhWzEzXSwgYVsxNF0sIGFbMTVdKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQ0J3NcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gLSBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gLSBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdIC0gYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSAtIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gLSBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdIC0gYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSAtIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICBvdXRbNl0gPSBhWzZdICogYjtcbiAgb3V0WzddID0gYVs3XSAqIGI7XG4gIG91dFs4XSA9IGFbOF0gKiBiO1xuICBvdXRbOV0gPSBhWzldICogYjtcbiAgb3V0WzEwXSA9IGFbMTBdICogYjtcbiAgb3V0WzExXSA9IGFbMTFdICogYjtcbiAgb3V0WzEyXSA9IGFbMTJdICogYjtcbiAgb3V0WzEzXSA9IGFbMTNdICogYjtcbiAgb3V0WzE0XSA9IGFbMTRdICogYjtcbiAgb3V0WzE1XSA9IGFbMTVdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdICogc2NhbGU7XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdICogc2NhbGU7XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdICogc2NhbGU7XG4gIG91dFs3XSA9IGFbN10gKyBiWzddICogc2NhbGU7XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdICogc2NhbGU7XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldICogc2NhbGU7XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdICogc2NhbGU7XG4gIG91dFsxMV0gPSBhWzExXSArIGJbMTFdICogc2NhbGU7XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdICogc2NhbGU7XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdICogc2NhbGU7XG4gIG91dFsxNF0gPSBhWzE0XSArIGJbMTRdICogc2NhbGU7XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdICYmIGFbOV0gPT09IGJbOV0gJiYgYVsxMF0gPT09IGJbMTBdICYmIGFbMTFdID09PSBiWzExXSAmJiBhWzEyXSA9PT0gYlsxMl0gJiYgYVsxM10gPT09IGJbMTNdICYmIGFbMTRdID09PSBiWzE0XSAmJiBhWzE1XSA9PT0gYlsxNV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN107XG4gIHZhciBhOCA9IGFbOF0sXG4gICAgICBhOSA9IGFbOV0sXG4gICAgICBhMTAgPSBhWzEwXSxcbiAgICAgIGExMSA9IGFbMTFdO1xuICB2YXIgYTEyID0gYVsxMl0sXG4gICAgICBhMTMgPSBhWzEzXSxcbiAgICAgIGExNCA9IGFbMTRdLFxuICAgICAgYTE1ID0gYVsxNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHZhciBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN107XG4gIHZhciBiOCA9IGJbOF0sXG4gICAgICBiOSA9IGJbOV0sXG4gICAgICBiMTAgPSBiWzEwXSxcbiAgICAgIGIxMSA9IGJbMTFdO1xuICB2YXIgYjEyID0gYlsxMl0sXG4gICAgICBiMTMgPSBiWzEzXSxcbiAgICAgIGIxNCA9IGJbMTRdLFxuICAgICAgYjE1ID0gYlsxNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKSAmJiBNYXRoLmFicyhhOSAtIGI5KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOSksIE1hdGguYWJzKGI5KSkgJiYgTWF0aC5hYnMoYTEwIC0gYjEwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTApLCBNYXRoLmFicyhiMTApKSAmJiBNYXRoLmFicyhhMTEgLSBiMTEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMSksIE1hdGguYWJzKGIxMSkpICYmIE1hdGguYWJzKGExMiAtIGIxMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEyKSwgTWF0aC5hYnMoYjEyKSkgJiYgTWF0aC5hYnMoYTEzIC0gYjEzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTMpLCBNYXRoLmFicyhiMTMpKSAmJiBNYXRoLmFicyhhMTQgLSBiMTQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNCksIE1hdGguYWJzKGIxNCkpICYmIE1hdGguYWJzKGExNSAtIGIxNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE1KSwgTWF0aC5hYnMoYjE1KSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0IFwiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIjtcbmltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDIgRGltZW5zaW9uYWwgVmVjdG9yXHJcbiAqIEBtb2R1bGUgdmVjMlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzJcclxuICpcclxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSkge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNlaWxcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxyXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHk7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcclxuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDIob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzNdICogeSArIG1bNl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMCdcclxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgMkQgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgdmVjMiBwb2ludCB0byByb3RhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgYiwgcmFkKSB7XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgdmFyIHAwID0gYVswXSAtIGJbMF0sXG4gICAgICBwMSA9IGFbMV0gLSBiWzFdLFxuICAgICAgc2luQyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjb3NDID0gTWF0aC5jb3MocmFkKTsgLy9wZXJmb3JtIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHAwICogY29zQyAtIHAxICogc2luQyArIGJbMF07XG4gIG91dFsxXSA9IHAwICogc2luQyArIHAxICogY29zQyArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIHgxID0gYVswXSxcbiAgICAgIHkxID0gYVsxXSxcbiAgICAgIHgyID0gYlswXSxcbiAgICAgIHkyID0gYlsxXSxcbiAgICAgIC8vIG1hZyBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgbWFnbml0dWRlcyBvZiBhIGFuZCBiXG4gIG1hZyA9IE1hdGguc3FydCh4MSAqIHgxICsgeTEgKiB5MSkgKiBNYXRoLnNxcnQoeDIgKiB4MiArIHkyICogeTIpLFxuICAgICAgLy8gbWFnICYmLi4gc2hvcnQgY2lyY3VpdHMgaWYgbWFnID09IDBcbiAgY29zaW5lID0gbWFnICYmICh4MSAqIHgyICsgeTEgKiB5MikgLyBtYWc7IC8vIE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSBjbGFtcHMgdGhlIGNvc2luZSBiZXR3ZWVuIC0xIGFuZCAxXG5cbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBleGFjdGx5IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5pbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzNcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSwgeikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHopIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0O1xuICB2YXIgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvO1xuICB2YXIgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgdmFyIHogPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAtIDEuMDtcbiAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAgLSB6ICogeikgKiBzY2FsZTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICBvdXRbMl0gPSB6ICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cclxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTtcbiAgdyA9IHcgfHwgMS4wO1xuICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgb3V0WzFdID0gKG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdKSAvIHc7XG4gIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XG4gIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XHJcbiAqIENhbiBhbHNvIGJlIHVzZWQgZm9yIGR1YWwgcXVhdGVybmlvbnMuIChNdWx0aXBseSBpdCB3aXRoIHRoZSByZWFsIHBhcnQpXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIC8vIGJlbmNobWFya3M6IGh0dHBzOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXRyYW5zZm9ybS12ZWMzLWltcGxlbWVudGF0aW9ucy1maXhlZFxuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdO1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdOyAvLyB2YXIgcXZlYyA9IFtxeCwgcXksIHF6XTtcbiAgLy8gdmFyIHV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgYSk7XG5cbiAgdmFyIHV2eCA9IHF5ICogeiAtIHF6ICogeSxcbiAgICAgIHV2eSA9IHF6ICogeCAtIHF4ICogeixcbiAgICAgIHV2eiA9IHF4ICogeSAtIHF5ICogeDsgLy8gdmFyIHV1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIHV2KTtcblxuICB2YXIgdXV2eCA9IHF5ICogdXZ6IC0gcXogKiB1dnksXG4gICAgICB1dXZ5ID0gcXogKiB1dnggLSBxeCAqIHV2eixcbiAgICAgIHV1dnogPSBxeCAqIHV2eSAtIHF5ICogdXZ4OyAvLyB2ZWMzLnNjYWxlKHV2LCB1diwgMiAqIHcpO1xuXG4gIHZhciB3MiA9IHF3ICogMjtcbiAgdXZ4ICo9IHcyO1xuICB1dnkgKj0gdzI7XG4gIHV2eiAqPSB3MjsgLy8gdmVjMy5zY2FsZSh1dXYsIHV1diwgMik7XG5cbiAgdXV2eCAqPSAyO1xuICB1dXZ5ICo9IDI7XG4gIHV1dnogKj0gMjsgLy8gcmV0dXJuIHZlYzMuYWRkKG91dCwgYSwgdmVjMy5hZGQob3V0LCB1diwgdXV2KSk7XG5cbiAgb3V0WzBdID0geCArIHV2eCArIHV1dng7XG4gIG91dFsxXSA9IHkgKyB1dnkgKyB1dXZ5O1xuICBvdXRbMl0gPSB6ICsgdXZ6ICsgdXV2ejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhyYWQpIC0gcFsyXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMl0gPSBwWzFdICogTWF0aC5zaW4ocmFkKSArIHBbMl0gKiBNYXRoLmNvcyhyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB6LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKHJhZCkgLSBwWzFdICogTWF0aC5zaW4ocmFkKTtcbiAgclsxXSA9IHBbMF0gKiBNYXRoLnNpbihyYWQpICsgcFsxXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMl0gPSBwWzJdOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgbWFnMSA9IE1hdGguc3FydChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopLFxuICAgICAgbWFnMiA9IE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnopLFxuICAgICAgbWFnID0gbWFnMSAqIG1hZzIsXG4gICAgICBjb3NpbmUgPSBtYWcgJiYgZG90KGEsIGIpIC8gbWFnO1xuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMyB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzNzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yOiBhc3NlcnRpb24gZmFpbGVkLicpO1xuICB9XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IGNyZWF0ZU1hdDQsIHRyYW5zZm9ybVZlY3RvciwgbG9nMiB9IGZyb20gJy4vbWF0aC11dGlscyc7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gJ2dsLW1hdHJpeC9tYXQ0JztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tICdnbC1tYXRyaXgvdmVjMyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4vYXNzZXJ0JztcbnZhciBQSSA9IE1hdGguUEk7XG52YXIgUElfNCA9IFBJIC8gNDtcbnZhciBERUdSRUVTX1RPX1JBRElBTlMgPSBQSSAvIDE4MDtcbnZhciBSQURJQU5TX1RPX0RFR1JFRVMgPSAxODAgLyBQSTtcbnZhciBUSUxFX1NJWkUgPSA1MTI7XG52YXIgRUFSVEhfQ0lSQ1VNRkVSRU5DRSA9IDQwLjAzZTY7XG5leHBvcnQgdmFyIERFRkFVTFRfQUxUSVRVREUgPSAxLjU7XG5leHBvcnQgZnVuY3Rpb24gem9vbVRvU2NhbGUoem9vbSkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUb1pvb20oc2NhbGUpIHtcbiAgcmV0dXJuIGxvZzIoc2NhbGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxuZ0xhdFRvV29ybGQoX3JlZikge1xuICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgIGxuZyA9IF9yZWYyWzBdLFxuICAgICAgbGF0ID0gX3JlZjJbMV07XG5cbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsbmcpKTtcbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsYXQpICYmIGxhdCA+PSAtOTAgJiYgbGF0IDw9IDkwLCAnaW52YWxpZCBsYXRpdHVkZScpO1xuICB2YXIgbGFtYmRhMiA9IGxuZyAqIERFR1JFRVNfVE9fUkFESUFOUztcbiAgdmFyIHBoaTIgPSBsYXQgKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIHZhciB4ID0gVElMRV9TSVpFICogKGxhbWJkYTIgKyBQSSkgLyAoMiAqIFBJKTtcbiAgdmFyIHkgPSBUSUxFX1NJWkUgKiAoUEkgKyBNYXRoLmxvZyhNYXRoLnRhbihQSV80ICsgcGhpMiAqIDAuNSkpKSAvICgyICogUEkpO1xuICByZXR1cm4gW3gsIHldO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdvcmxkVG9MbmdMYXQoX3JlZjMpIHtcbiAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDIpLFxuICAgICAgeCA9IF9yZWY0WzBdLFxuICAgICAgeSA9IF9yZWY0WzFdO1xuXG4gIHZhciBsYW1iZGEyID0geCAvIFRJTEVfU0laRSAqICgyICogUEkpIC0gUEk7XG4gIHZhciBwaGkyID0gMiAqIChNYXRoLmF0YW4oTWF0aC5leHAoeSAvIFRJTEVfU0laRSAqICgyICogUEkpIC0gUEkpKSAtIFBJXzQpO1xuICByZXR1cm4gW2xhbWJkYTIgKiBSQURJQU5TX1RPX0RFR1JFRVMsIHBoaTIgKiBSQURJQU5TX1RPX0RFR1JFRVNdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGVyWm9vbShfcmVmNSkge1xuICB2YXIgbGF0aXR1ZGUgPSBfcmVmNS5sYXRpdHVkZTtcbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsYXRpdHVkZSkpO1xuICB2YXIgbGF0Q29zaW5lID0gTWF0aC5jb3MobGF0aXR1ZGUgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuICByZXR1cm4gc2NhbGVUb1pvb20oRUFSVEhfQ0lSQ1VNRkVSRU5DRSAqIGxhdENvc2luZSkgLSA5O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlU2NhbGVzKF9yZWY2KSB7XG4gIHZhciBsYXRpdHVkZSA9IF9yZWY2LmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlID0gX3JlZjYubG9uZ2l0dWRlLFxuICAgICAgX3JlZjYkaGlnaFByZWNpc2lvbiA9IF9yZWY2LmhpZ2hQcmVjaXNpb24sXG4gICAgICBoaWdoUHJlY2lzaW9uID0gX3JlZjYkaGlnaFByZWNpc2lvbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRoaWdoUHJlY2lzaW9uO1xuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxhdGl0dWRlKSAmJiBOdW1iZXIuaXNGaW5pdGUobG9uZ2l0dWRlKSk7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIHdvcmxkU2l6ZSA9IFRJTEVfU0laRTtcbiAgdmFyIGxhdENvc2luZSA9IE1hdGguY29zKGxhdGl0dWRlICogREVHUkVFU19UT19SQURJQU5TKTtcbiAgdmFyIHVuaXRzUGVyRGVncmVlWCA9IHdvcmxkU2l6ZSAvIDM2MDtcbiAgdmFyIHVuaXRzUGVyRGVncmVlWSA9IHVuaXRzUGVyRGVncmVlWCAvIGxhdENvc2luZTtcbiAgdmFyIGFsdFVuaXRzUGVyTWV0ZXIgPSB3b3JsZFNpemUgLyBFQVJUSF9DSVJDVU1GRVJFTkNFIC8gbGF0Q29zaW5lO1xuICByZXN1bHQudW5pdHNQZXJNZXRlciA9IFthbHRVbml0c1Blck1ldGVyLCBhbHRVbml0c1Blck1ldGVyLCBhbHRVbml0c1Blck1ldGVyXTtcbiAgcmVzdWx0Lm1ldGVyc1BlclVuaXQgPSBbMSAvIGFsdFVuaXRzUGVyTWV0ZXIsIDEgLyBhbHRVbml0c1Blck1ldGVyLCAxIC8gYWx0VW5pdHNQZXJNZXRlcl07XG4gIHJlc3VsdC51bml0c1BlckRlZ3JlZSA9IFt1bml0c1BlckRlZ3JlZVgsIHVuaXRzUGVyRGVncmVlWSwgYWx0VW5pdHNQZXJNZXRlcl07XG4gIHJlc3VsdC5kZWdyZWVzUGVyVW5pdCA9IFsxIC8gdW5pdHNQZXJEZWdyZWVYLCAxIC8gdW5pdHNQZXJEZWdyZWVZLCAxIC8gYWx0VW5pdHNQZXJNZXRlcl07XG5cbiAgaWYgKGhpZ2hQcmVjaXNpb24pIHtcbiAgICB2YXIgbGF0Q29zaW5lMiA9IERFR1JFRVNfVE9fUkFESUFOUyAqIE1hdGgudGFuKGxhdGl0dWRlICogREVHUkVFU19UT19SQURJQU5TKSAvIGxhdENvc2luZTtcbiAgICB2YXIgdW5pdHNQZXJEZWdyZWVZMiA9IHVuaXRzUGVyRGVncmVlWCAqIGxhdENvc2luZTIgLyAyO1xuICAgIHZhciBhbHRVbml0c1BlckRlZ3JlZTIgPSB3b3JsZFNpemUgLyBFQVJUSF9DSVJDVU1GRVJFTkNFICogbGF0Q29zaW5lMjtcbiAgICB2YXIgYWx0VW5pdHNQZXJNZXRlcjIgPSBhbHRVbml0c1BlckRlZ3JlZTIgLyB1bml0c1BlckRlZ3JlZVkgKiBhbHRVbml0c1Blck1ldGVyO1xuICAgIHJlc3VsdC51bml0c1BlckRlZ3JlZTIgPSBbMCwgdW5pdHNQZXJEZWdyZWVZMiwgYWx0VW5pdHNQZXJEZWdyZWUyXTtcbiAgICByZXN1bHQudW5pdHNQZXJNZXRlcjIgPSBbYWx0VW5pdHNQZXJNZXRlcjIsIDAsIGFsdFVuaXRzUGVyTWV0ZXIyXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkTWV0ZXJzVG9MbmdMYXQobG5nTGF0WiwgeHl6KSB7XG4gIHZhciBfbG5nTGF0WiA9IF9zbGljZWRUb0FycmF5KGxuZ0xhdFosIDMpLFxuICAgICAgbG9uZ2l0dWRlID0gX2xuZ0xhdFpbMF0sXG4gICAgICBsYXRpdHVkZSA9IF9sbmdMYXRaWzFdLFxuICAgICAgejAgPSBfbG5nTGF0WlsyXTtcblxuICB2YXIgX3h5eiA9IF9zbGljZWRUb0FycmF5KHh5eiwgMyksXG4gICAgICB4ID0gX3h5elswXSxcbiAgICAgIHkgPSBfeHl6WzFdLFxuICAgICAgeiA9IF94eXpbMl07XG5cbiAgdmFyIF9nZXREaXN0YW5jZVNjYWxlcyA9IGdldERpc3RhbmNlU2NhbGVzKHtcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgaGlnaFByZWNpc2lvbjogdHJ1ZVxuICB9KSxcbiAgICAgIHVuaXRzUGVyTWV0ZXIgPSBfZ2V0RGlzdGFuY2VTY2FsZXMudW5pdHNQZXJNZXRlcixcbiAgICAgIHVuaXRzUGVyTWV0ZXIyID0gX2dldERpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXIyO1xuXG4gIHZhciB3b3JsZHNwYWNlID0gbG5nTGF0VG9Xb3JsZChsbmdMYXRaKTtcbiAgd29ybGRzcGFjZVswXSArPSB4ICogKHVuaXRzUGVyTWV0ZXJbMF0gKyB1bml0c1Blck1ldGVyMlswXSAqIHkpO1xuICB3b3JsZHNwYWNlWzFdICs9IHkgKiAodW5pdHNQZXJNZXRlclsxXSArIHVuaXRzUGVyTWV0ZXIyWzFdICogeSk7XG4gIHZhciBuZXdMbmdMYXQgPSB3b3JsZFRvTG5nTGF0KHdvcmxkc3BhY2UpO1xuICB2YXIgbmV3WiA9ICh6MCB8fCAwKSArICh6IHx8IDApO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHowKSB8fCBOdW1iZXIuaXNGaW5pdGUoeikgPyBbbmV3TG5nTGF0WzBdLCBuZXdMbmdMYXRbMV0sIG5ld1pdIDogbmV3TG5nTGF0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdNYXRyaXgoX3JlZjcpIHtcbiAgdmFyIGhlaWdodCA9IF9yZWY3LmhlaWdodCxcbiAgICAgIHBpdGNoID0gX3JlZjcucGl0Y2gsXG4gICAgICBiZWFyaW5nID0gX3JlZjcuYmVhcmluZyxcbiAgICAgIGFsdGl0dWRlID0gX3JlZjcuYWx0aXR1ZGUsXG4gICAgICBzY2FsZSA9IF9yZWY3LnNjYWxlLFxuICAgICAgX3JlZjckY2VudGVyID0gX3JlZjcuY2VudGVyLFxuICAgICAgY2VudGVyID0gX3JlZjckY2VudGVyID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjckY2VudGVyO1xuICB2YXIgdm0gPSBjcmVhdGVNYXQ0KCk7XG4gIG1hdDQudHJhbnNsYXRlKHZtLCB2bSwgWzAsIDAsIC1hbHRpdHVkZV0pO1xuICBtYXQ0LnJvdGF0ZVgodm0sIHZtLCAtcGl0Y2ggKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuICBtYXQ0LnJvdGF0ZVoodm0sIHZtLCBiZWFyaW5nICogREVHUkVFU19UT19SQURJQU5TKTtcbiAgc2NhbGUgLz0gaGVpZ2h0O1xuICBtYXQ0LnNjYWxlKHZtLCB2bSwgW3NjYWxlLCBzY2FsZSwgc2NhbGVdKTtcblxuICBpZiAoY2VudGVyKSB7XG4gICAgbWF0NC50cmFuc2xhdGUodm0sIHZtLCB2ZWMzLm5lZ2F0ZShbXSwgY2VudGVyKSk7XG4gIH1cblxuICByZXR1cm4gdm07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvamVjdGlvblBhcmFtZXRlcnMoX3JlZjgpIHtcbiAgdmFyIHdpZHRoID0gX3JlZjgud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmOC5oZWlnaHQsXG4gICAgICBfcmVmOCRmb3Z5ID0gX3JlZjguZm92eSxcbiAgICAgIGZvdnkgPSBfcmVmOCRmb3Z5ID09PSB2b2lkIDAgPyBhbHRpdHVkZVRvRm92eShERUZBVUxUX0FMVElUVURFKSA6IF9yZWY4JGZvdnksXG4gICAgICBhbHRpdHVkZSA9IF9yZWY4LmFsdGl0dWRlLFxuICAgICAgX3JlZjgkcGl0Y2ggPSBfcmVmOC5waXRjaCxcbiAgICAgIHBpdGNoID0gX3JlZjgkcGl0Y2ggPT09IHZvaWQgMCA/IDAgOiBfcmVmOCRwaXRjaCxcbiAgICAgIF9yZWY4JG5lYXJaTXVsdGlwbGllciA9IF9yZWY4Lm5lYXJaTXVsdGlwbGllcixcbiAgICAgIG5lYXJaTXVsdGlwbGllciA9IF9yZWY4JG5lYXJaTXVsdGlwbGllciA9PT0gdm9pZCAwID8gMSA6IF9yZWY4JG5lYXJaTXVsdGlwbGllcixcbiAgICAgIF9yZWY4JGZhclpNdWx0aXBsaWVyID0gX3JlZjguZmFyWk11bHRpcGxpZXIsXG4gICAgICBmYXJaTXVsdGlwbGllciA9IF9yZWY4JGZhclpNdWx0aXBsaWVyID09PSB2b2lkIDAgPyAxIDogX3JlZjgkZmFyWk11bHRpcGxpZXI7XG5cbiAgaWYgKGFsdGl0dWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3Z5ID0gYWx0aXR1ZGVUb0ZvdnkoYWx0aXR1ZGUpO1xuICB9XG5cbiAgdmFyIGhhbGZGb3YgPSAwLjUgKiBmb3Z5ICogREVHUkVFU19UT19SQURJQU5TO1xuICB2YXIgZm9jYWxEaXN0YW5jZSA9IGZvdnlUb0FsdGl0dWRlKGZvdnkpO1xuICB2YXIgcGl0Y2hSYWRpYW5zID0gcGl0Y2ggKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIHZhciB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID0gTWF0aC5zaW4oaGFsZkZvdikgKiBmb2NhbERpc3RhbmNlIC8gTWF0aC5zaW4oTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5QSSAvIDIgLSBwaXRjaFJhZGlhbnMgLSBoYWxmRm92LCAwLjAxKSwgTWF0aC5QSSAtIDAuMDEpKTtcbiAgdmFyIGZhclogPSBNYXRoLnNpbihwaXRjaFJhZGlhbnMpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIGZvY2FsRGlzdGFuY2U7XG4gIHJldHVybiB7XG4gICAgZm92OiAyICogaGFsZkZvdixcbiAgICBhc3BlY3Q6IHdpZHRoIC8gaGVpZ2h0LFxuICAgIGZvY2FsRGlzdGFuY2U6IGZvY2FsRGlzdGFuY2UsXG4gICAgbmVhcjogbmVhclpNdWx0aXBsaWVyLFxuICAgIGZhcjogZmFyWiAqIGZhclpNdWx0aXBsaWVyXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvamVjdGlvbk1hdHJpeChfcmVmOSkge1xuICB2YXIgd2lkdGggPSBfcmVmOS53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWY5LmhlaWdodCxcbiAgICAgIHBpdGNoID0gX3JlZjkucGl0Y2gsXG4gICAgICBhbHRpdHVkZSA9IF9yZWY5LmFsdGl0dWRlLFxuICAgICAgZm92eSA9IF9yZWY5LmZvdnksXG4gICAgICBuZWFyWk11bHRpcGxpZXIgPSBfcmVmOS5uZWFyWk11bHRpcGxpZXIsXG4gICAgICBmYXJaTXVsdGlwbGllciA9IF9yZWY5LmZhclpNdWx0aXBsaWVyO1xuXG4gIHZhciBfZ2V0UHJvamVjdGlvblBhcmFtZXQgPSBnZXRQcm9qZWN0aW9uUGFyYW1ldGVycyh7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGFsdGl0dWRlOiBhbHRpdHVkZSxcbiAgICBmb3Z5OiBmb3Z5LFxuICAgIHBpdGNoOiBwaXRjaCxcbiAgICBuZWFyWk11bHRpcGxpZXI6IG5lYXJaTXVsdGlwbGllcixcbiAgICBmYXJaTXVsdGlwbGllcjogZmFyWk11bHRpcGxpZXJcbiAgfSksXG4gICAgICBmb3YgPSBfZ2V0UHJvamVjdGlvblBhcmFtZXQuZm92LFxuICAgICAgYXNwZWN0ID0gX2dldFByb2plY3Rpb25QYXJhbWV0LmFzcGVjdCxcbiAgICAgIG5lYXIgPSBfZ2V0UHJvamVjdGlvblBhcmFtZXQubmVhcixcbiAgICAgIGZhciA9IF9nZXRQcm9qZWN0aW9uUGFyYW1ldC5mYXI7XG5cbiAgdmFyIHByb2plY3Rpb25NYXRyaXggPSBtYXQ0LnBlcnNwZWN0aXZlKFtdLCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyKTtcbiAgcmV0dXJuIHByb2plY3Rpb25NYXRyaXg7XG59XG5leHBvcnQgZnVuY3Rpb24gYWx0aXR1ZGVUb0ZvdnkoYWx0aXR1ZGUpIHtcbiAgcmV0dXJuIDIgKiBNYXRoLmF0YW4oMC41IC8gYWx0aXR1ZGUpICogUkFESUFOU19UT19ERUdSRUVTO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvdnlUb0FsdGl0dWRlKGZvdnkpIHtcbiAgcmV0dXJuIDAuNSAvIE1hdGgudGFuKDAuNSAqIGZvdnkgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdvcmxkVG9QaXhlbHMoeHl6LCBwaXhlbFByb2plY3Rpb25NYXRyaXgpIHtcbiAgdmFyIF94eXoyID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgIHggPSBfeHl6MlswXSxcbiAgICAgIHkgPSBfeHl6MlsxXSxcbiAgICAgIF94eXoyJCA9IF94eXoyWzJdLFxuICAgICAgeiA9IF94eXoyJCA9PT0gdm9pZCAwID8gMCA6IF94eXoyJDtcblxuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKHgpICYmIE51bWJlci5pc0Zpbml0ZSh5KSAmJiBOdW1iZXIuaXNGaW5pdGUoeikpO1xuICByZXR1cm4gdHJhbnNmb3JtVmVjdG9yKHBpeGVsUHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIHosIDFdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwaXhlbHNUb1dvcmxkKHh5eiwgcGl4ZWxVbnByb2plY3Rpb25NYXRyaXgpIHtcbiAgdmFyIHRhcmdldFogPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgdmFyIF94eXozID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgIHggPSBfeHl6M1swXSxcbiAgICAgIHkgPSBfeHl6M1sxXSxcbiAgICAgIHogPSBfeHl6M1syXTtcblxuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKHgpICYmIE51bWJlci5pc0Zpbml0ZSh5KSwgJ2ludmFsaWQgcGl4ZWwgY29vcmRpbmF0ZScpO1xuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeikpIHtcbiAgICB2YXIgY29vcmQgPSB0cmFuc2Zvcm1WZWN0b3IocGl4ZWxVbnByb2plY3Rpb25NYXRyaXgsIFt4LCB5LCB6LCAxXSk7XG4gICAgcmV0dXJuIGNvb3JkO1xuICB9XG5cbiAgdmFyIGNvb3JkMCA9IHRyYW5zZm9ybVZlY3RvcihwaXhlbFVucHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIDAsIDFdKTtcbiAgdmFyIGNvb3JkMSA9IHRyYW5zZm9ybVZlY3RvcihwaXhlbFVucHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIDEsIDFdKTtcbiAgdmFyIHowID0gY29vcmQwWzJdO1xuICB2YXIgejEgPSBjb29yZDFbMl07XG4gIHZhciB0ID0gejAgPT09IHoxID8gMCA6ICgodGFyZ2V0WiB8fCAwKSAtIHowKSAvICh6MSAtIHowKTtcbiAgcmV0dXJuIHZlYzIubGVycChbXSwgY29vcmQwLCBjb29yZDEsIHQpO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IGxvZzIgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZml0Qm91bmRzKF9yZWYpIHtcbiAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgYm91bmRzID0gX3JlZi5ib3VuZHMsXG4gICAgICBfcmVmJG1pbkV4dGVudCA9IF9yZWYubWluRXh0ZW50LFxuICAgICAgbWluRXh0ZW50ID0gX3JlZiRtaW5FeHRlbnQgPT09IHZvaWQgMCA/IDAgOiBfcmVmJG1pbkV4dGVudCxcbiAgICAgIF9yZWYkbWF4Wm9vbSA9IF9yZWYubWF4Wm9vbSxcbiAgICAgIG1heFpvb20gPSBfcmVmJG1heFpvb20gPT09IHZvaWQgMCA/IDI0IDogX3JlZiRtYXhab29tLFxuICAgICAgX3JlZiRwYWRkaW5nID0gX3JlZi5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9yZWYkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9yZWYkcGFkZGluZyxcbiAgICAgIF9yZWYkb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfcmVmJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX3JlZiRvZmZzZXQ7XG5cbiAgdmFyIF9ib3VuZHMgPSBfc2xpY2VkVG9BcnJheShib3VuZHMsIDIpLFxuICAgICAgX2JvdW5kcyQgPSBfc2xpY2VkVG9BcnJheShfYm91bmRzWzBdLCAyKSxcbiAgICAgIHdlc3QgPSBfYm91bmRzJFswXSxcbiAgICAgIHNvdXRoID0gX2JvdW5kcyRbMV0sXG4gICAgICBfYm91bmRzJDIgPSBfc2xpY2VkVG9BcnJheShfYm91bmRzWzFdLCAyKSxcbiAgICAgIGVhc3QgPSBfYm91bmRzJDJbMF0sXG4gICAgICBub3J0aCA9IF9ib3VuZHMkMlsxXTtcblxuICBpZiAoTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcpKSB7XG4gICAgdmFyIHAgPSBwYWRkaW5nO1xuICAgIHBhZGRpbmcgPSB7XG4gICAgICB0b3A6IHAsXG4gICAgICBib3R0b206IHAsXG4gICAgICBsZWZ0OiBwLFxuICAgICAgcmlnaHQ6IHBcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUocGFkZGluZy50b3ApICYmIE51bWJlci5pc0Zpbml0ZShwYWRkaW5nLmJvdHRvbSkgJiYgTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcubGVmdCkgJiYgTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcucmlnaHQpKTtcbiAgfVxuXG4gIHZhciB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbG9uZ2l0dWRlOiAwLFxuICAgIGxhdGl0dWRlOiAwLFxuICAgIHpvb206IDBcbiAgfSk7XG4gIHZhciBudyA9IHZpZXdwb3J0LnByb2plY3QoW3dlc3QsIG5vcnRoXSk7XG4gIHZhciBzZSA9IHZpZXdwb3J0LnByb2plY3QoW2Vhc3QsIHNvdXRoXSk7XG4gIHZhciBzaXplID0gW01hdGgubWF4KE1hdGguYWJzKHNlWzBdIC0gbndbMF0pLCBtaW5FeHRlbnQpLCBNYXRoLm1heChNYXRoLmFicyhzZVsxXSAtIG53WzFdKSwgbWluRXh0ZW50KV07XG4gIHZhciB0YXJnZXRTaXplID0gW3dpZHRoIC0gcGFkZGluZy5sZWZ0IC0gcGFkZGluZy5yaWdodCAtIE1hdGguYWJzKG9mZnNldFswXSkgKiAyLCBoZWlnaHQgLSBwYWRkaW5nLnRvcCAtIHBhZGRpbmcuYm90dG9tIC0gTWF0aC5hYnMob2Zmc2V0WzFdKSAqIDJdO1xuICBhc3NlcnQodGFyZ2V0U2l6ZVswXSA+IDAgJiYgdGFyZ2V0U2l6ZVsxXSA+IDApO1xuICB2YXIgc2NhbGVYID0gdGFyZ2V0U2l6ZVswXSAvIHNpemVbMF07XG4gIHZhciBzY2FsZVkgPSB0YXJnZXRTaXplWzFdIC8gc2l6ZVsxXTtcbiAgdmFyIG9mZnNldFggPSAocGFkZGluZy5yaWdodCAtIHBhZGRpbmcubGVmdCkgLyAyIC8gc2NhbGVYO1xuICB2YXIgb2Zmc2V0WSA9IChwYWRkaW5nLmJvdHRvbSAtIHBhZGRpbmcudG9wKSAvIDIgLyBzY2FsZVk7XG4gIHZhciBjZW50ZXIgPSBbKHNlWzBdICsgbndbMF0pIC8gMiArIG9mZnNldFgsIChzZVsxXSArIG53WzFdKSAvIDIgKyBvZmZzZXRZXTtcbiAgdmFyIGNlbnRlckxuZ0xhdCA9IHZpZXdwb3J0LnVucHJvamVjdChjZW50ZXIpO1xuICB2YXIgem9vbSA9IE1hdGgubWluKG1heFpvb20sIHZpZXdwb3J0Lnpvb20gKyBsb2cyKE1hdGguYWJzKE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKSkpKTtcbiAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZSh6b29tKSk7XG4gIHJldHVybiB7XG4gICAgbG9uZ2l0dWRlOiBjZW50ZXJMbmdMYXRbMF0sXG4gICAgbGF0aXR1ZGU6IGNlbnRlckxuZ0xhdFsxXSxcbiAgICB6b29tOiB6b29tXG4gIH07XG59IiwiaW1wb3J0IHsgd29ybGRUb0xuZ0xhdCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xuaW1wb3J0IHsgdHJhbnNmb3JtVmVjdG9yIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbnZhciBERUdSRUVTX1RPX1JBRElBTlMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRzKHZpZXdwb3J0KSB7XG4gIHZhciB6ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgd2lkdGggPSB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodCxcbiAgICAgIHVucHJvamVjdCA9IHZpZXdwb3J0LnVucHJvamVjdDtcbiAgdmFyIHVucHJvamVjdE9wcyA9IHtcbiAgICB0YXJnZXRaOiB6XG4gIH07XG4gIHZhciBib3R0b21MZWZ0ID0gdW5wcm9qZWN0KFswLCBoZWlnaHRdLCB1bnByb2plY3RPcHMpO1xuICB2YXIgYm90dG9tUmlnaHQgPSB1bnByb2plY3QoW3dpZHRoLCBoZWlnaHRdLCB1bnByb2plY3RPcHMpO1xuICB2YXIgdG9wTGVmdDtcbiAgdmFyIHRvcFJpZ2h0O1xuICB2YXIgaGFsZkZvdiA9IHZpZXdwb3J0LmZvdnkgPyAwLjUgKiB2aWV3cG9ydC5mb3Z5ICogREVHUkVFU19UT19SQURJQU5TIDogTWF0aC5hdGFuKDAuNSAvIHZpZXdwb3J0LmFsdGl0dWRlKTtcbiAgdmFyIGFuZ2xlVG9Hcm91bmQgPSAoOTAgLSB2aWV3cG9ydC5waXRjaCkgKiBERUdSRUVTX1RPX1JBRElBTlM7XG5cbiAgaWYgKGhhbGZGb3YgPiBhbmdsZVRvR3JvdW5kIC0gMC4wMSkge1xuICAgIHRvcExlZnQgPSB1bnByb2plY3RPbkZhclBsYW5lKHZpZXdwb3J0LCAwLCB6KTtcbiAgICB0b3BSaWdodCA9IHVucHJvamVjdE9uRmFyUGxhbmUodmlld3BvcnQsIHdpZHRoLCB6KTtcbiAgfSBlbHNlIHtcbiAgICB0b3BMZWZ0ID0gdW5wcm9qZWN0KFswLCAwXSwgdW5wcm9qZWN0T3BzKTtcbiAgICB0b3BSaWdodCA9IHVucHJvamVjdChbd2lkdGgsIDBdLCB1bnByb2plY3RPcHMpO1xuICB9XG5cbiAgcmV0dXJuIFtib3R0b21MZWZ0LCBib3R0b21SaWdodCwgdG9wUmlnaHQsIHRvcExlZnRdO1xufVxuXG5mdW5jdGlvbiB1bnByb2plY3RPbkZhclBsYW5lKHZpZXdwb3J0LCB4LCB0YXJnZXRaKSB7XG4gIHZhciBwaXhlbFVucHJvamVjdGlvbk1hdHJpeCA9IHZpZXdwb3J0LnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4O1xuICB2YXIgY29vcmQwID0gdHJhbnNmb3JtVmVjdG9yKHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCBbeCwgMCwgMSwgMV0pO1xuICB2YXIgY29vcmQxID0gdHJhbnNmb3JtVmVjdG9yKHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCBbeCwgdmlld3BvcnQuaGVpZ2h0LCAxLCAxXSk7XG4gIHZhciB6ID0gdGFyZ2V0WiAqIHZpZXdwb3J0LmRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXJbMl07XG4gIHZhciB0ID0gKHogLSBjb29yZDBbMl0pIC8gKGNvb3JkMVsyXSAtIGNvb3JkMFsyXSk7XG4gIHZhciBjb29yZCA9IHZlYzIubGVycChbXSwgY29vcmQwLCBjb29yZDEsIHQpO1xuICB2YXIgcmVzdWx0ID0gd29ybGRUb0xuZ0xhdChjb29yZCk7XG4gIHJlc3VsdFsyXSA9IHRhcmdldFo7XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IGNyZWF0ZU1hdDQgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuaW1wb3J0IHsgem9vbVRvU2NhbGUsIHBpeGVsc1RvV29ybGQsIGxuZ0xhdFRvV29ybGQsIHdvcmxkVG9MbmdMYXQsIHdvcmxkVG9QaXhlbHMsIGFsdGl0dWRlVG9Gb3Z5LCBmb3Z5VG9BbHRpdHVkZSwgREVGQVVMVF9BTFRJVFVERSwgZ2V0UHJvamVjdGlvbk1hdHJpeCwgZ2V0RGlzdGFuY2VTY2FsZXMsIGdldFZpZXdNYXRyaXggfSBmcm9tICcuL3dlYi1tZXJjYXRvci11dGlscyc7XG5pbXBvcnQgX2ZpdEJvdW5kcyBmcm9tICcuL2ZpdC1ib3VuZHMnO1xuaW1wb3J0IGdldEJvdW5kcyBmcm9tICcuL2dldC1ib3VuZHMnO1xuaW1wb3J0ICogYXMgbWF0NCBmcm9tICdnbC1tYXRyaXgvbWF0NCc7XG5pbXBvcnQgKiBhcyB2ZWMyIGZyb20gJ2dsLW1hdHJpeC92ZWMyJztcbmltcG9ydCAqIGFzIHZlYzMgZnJvbSAnZ2wtbWF0cml4L3ZlYzMnO1xuXG52YXIgV2ViTWVyY2F0b3JWaWV3cG9ydCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdlYk1lcmNhdG9yVmlld3BvcnQoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHtcbiAgICAgIHdpZHRoOiAxLFxuICAgICAgaGVpZ2h0OiAxXG4gICAgfSxcbiAgICAgICAgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICAgICAgX3JlZiRsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlID0gX3JlZiRsYXRpdHVkZSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkbGF0aXR1ZGUsXG4gICAgICAgIF9yZWYkbG9uZ2l0dWRlID0gX3JlZi5sb25naXR1ZGUsXG4gICAgICAgIGxvbmdpdHVkZSA9IF9yZWYkbG9uZ2l0dWRlID09PSB2b2lkIDAgPyAwIDogX3JlZiRsb25naXR1ZGUsXG4gICAgICAgIF9yZWYkem9vbSA9IF9yZWYuem9vbSxcbiAgICAgICAgem9vbSA9IF9yZWYkem9vbSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkem9vbSxcbiAgICAgICAgX3JlZiRwaXRjaCA9IF9yZWYucGl0Y2gsXG4gICAgICAgIHBpdGNoID0gX3JlZiRwaXRjaCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkcGl0Y2gsXG4gICAgICAgIF9yZWYkYmVhcmluZyA9IF9yZWYuYmVhcmluZyxcbiAgICAgICAgYmVhcmluZyA9IF9yZWYkYmVhcmluZyA9PT0gdm9pZCAwID8gMCA6IF9yZWYkYmVhcmluZyxcbiAgICAgICAgX3JlZiRhbHRpdHVkZSA9IF9yZWYuYWx0aXR1ZGUsXG4gICAgICAgIGFsdGl0dWRlID0gX3JlZiRhbHRpdHVkZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkYWx0aXR1ZGUsXG4gICAgICAgIF9yZWYkZm92eSA9IF9yZWYuZm92eSxcbiAgICAgICAgZm92eSA9IF9yZWYkZm92eSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkZm92eSxcbiAgICAgICAgX3JlZiRwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sXG4gICAgICAgIHBvc2l0aW9uID0gX3JlZiRwb3NpdGlvbiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcG9zaXRpb24sXG4gICAgICAgIF9yZWYkbmVhclpNdWx0aXBsaWVyID0gX3JlZi5uZWFyWk11bHRpcGxpZXIsXG4gICAgICAgIG5lYXJaTXVsdGlwbGllciA9IF9yZWYkbmVhclpNdWx0aXBsaWVyID09PSB2b2lkIDAgPyAwLjAyIDogX3JlZiRuZWFyWk11bHRpcGxpZXIsXG4gICAgICAgIF9yZWYkZmFyWk11bHRpcGxpZXIgPSBfcmVmLmZhclpNdWx0aXBsaWVyLFxuICAgICAgICBmYXJaTXVsdGlwbGllciA9IF9yZWYkZmFyWk11bHRpcGxpZXIgPT09IHZvaWQgMCA/IDEuMDEgOiBfcmVmJGZhclpNdWx0aXBsaWVyO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdlYk1lcmNhdG9yVmlld3BvcnQpO1xuXG4gICAgd2lkdGggPSB3aWR0aCB8fCAxO1xuICAgIGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG4gICAgaWYgKGZvdnkgPT09IG51bGwgJiYgYWx0aXR1ZGUgPT09IG51bGwpIHtcbiAgICAgIGFsdGl0dWRlID0gREVGQVVMVF9BTFRJVFVERTtcbiAgICAgIGZvdnkgPSBhbHRpdHVkZVRvRm92eShhbHRpdHVkZSk7XG4gICAgfSBlbHNlIGlmIChmb3Z5ID09PSBudWxsKSB7XG4gICAgICBmb3Z5ID0gYWx0aXR1ZGVUb0ZvdnkoYWx0aXR1ZGUpO1xuICAgIH0gZWxzZSBpZiAoYWx0aXR1ZGUgPT09IG51bGwpIHtcbiAgICAgIGFsdGl0dWRlID0gZm92eVRvQWx0aXR1ZGUoZm92eSk7XG4gICAgfVxuXG4gICAgdmFyIHNjYWxlID0gem9vbVRvU2NhbGUoem9vbSk7XG4gICAgYWx0aXR1ZGUgPSBNYXRoLm1heCgwLjc1LCBhbHRpdHVkZSk7XG4gICAgdmFyIGRpc3RhbmNlU2NhbGVzID0gZ2V0RGlzdGFuY2VTY2FsZXMoe1xuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGVcbiAgICB9KTtcbiAgICB2YXIgY2VudGVyID0gbG5nTGF0VG9Xb3JsZChbbG9uZ2l0dWRlLCBsYXRpdHVkZV0pO1xuICAgIGNlbnRlclsyXSA9IDA7XG5cbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIHZlYzMuYWRkKGNlbnRlciwgY2VudGVyLCB2ZWMzLm11bChbXSwgcG9zaXRpb24sIGRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXIpKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3Rpb25NYXRyaXggPSBnZXRQcm9qZWN0aW9uTWF0cml4KHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgZm92eTogZm92eSxcbiAgICAgIG5lYXJaTXVsdGlwbGllcjogbmVhclpNdWx0aXBsaWVyLFxuICAgICAgZmFyWk11bHRpcGxpZXI6IGZhclpNdWx0aXBsaWVyXG4gICAgfSk7XG4gICAgdGhpcy52aWV3TWF0cml4ID0gZ2V0Vmlld01hdHJpeCh7XG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgIGNlbnRlcjogY2VudGVyLFxuICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgYmVhcmluZzogYmVhcmluZyxcbiAgICAgIGFsdGl0dWRlOiBhbHRpdHVkZVxuICAgIH0pO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5sYXRpdHVkZSA9IGxhdGl0dWRlO1xuICAgIHRoaXMubG9uZ2l0dWRlID0gbG9uZ2l0dWRlO1xuICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgdGhpcy5waXRjaCA9IHBpdGNoO1xuICAgIHRoaXMuYmVhcmluZyA9IGJlYXJpbmc7XG4gICAgdGhpcy5hbHRpdHVkZSA9IGFsdGl0dWRlO1xuICAgIHRoaXMuZm92eSA9IGZvdnk7XG4gICAgdGhpcy5jZW50ZXIgPSBjZW50ZXI7XG4gICAgdGhpcy5tZXRlck9mZnNldCA9IHBvc2l0aW9uIHx8IFswLCAwLCAwXTtcbiAgICB0aGlzLmRpc3RhbmNlU2NhbGVzID0gZGlzdGFuY2VTY2FsZXM7XG5cbiAgICB0aGlzLl9pbml0TWF0cmljZXMoKTtcblxuICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2plY3QgPSB0aGlzLnByb2plY3QuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVucHJvamVjdCA9IHRoaXMudW5wcm9qZWN0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9qZWN0UG9zaXRpb24gPSB0aGlzLnByb2plY3RQb3NpdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMudW5wcm9qZWN0UG9zaXRpb24gPSB0aGlzLnVucHJvamVjdFBvc2l0aW9uLmJpbmQodGhpcyk7XG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhXZWJNZXJjYXRvclZpZXdwb3J0LCBbe1xuICAgIGtleTogXCJfaW5pdE1hdHJpY2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0TWF0cmljZXMoKSB7XG4gICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgIHByb2plY3Rpb25NYXRyaXggPSB0aGlzLnByb2plY3Rpb25NYXRyaXgsXG4gICAgICAgICAgdmlld01hdHJpeCA9IHRoaXMudmlld01hdHJpeDtcbiAgICAgIHZhciB2cG0gPSBjcmVhdGVNYXQ0KCk7XG4gICAgICBtYXQ0Lm11bHRpcGx5KHZwbSwgdnBtLCBwcm9qZWN0aW9uTWF0cml4KTtcbiAgICAgIG1hdDQubXVsdGlwbHkodnBtLCB2cG0sIHZpZXdNYXRyaXgpO1xuICAgICAgdGhpcy52aWV3UHJvamVjdGlvbk1hdHJpeCA9IHZwbTtcbiAgICAgIHZhciBtID0gY3JlYXRlTWF0NCgpO1xuICAgICAgbWF0NC5zY2FsZShtLCBtLCBbd2lkdGggLyAyLCAtaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWzEsIC0xLCAwXSk7XG4gICAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIHZwbSk7XG4gICAgICB2YXIgbUludmVyc2UgPSBtYXQ0LmludmVydChjcmVhdGVNYXQ0KCksIG0pO1xuXG4gICAgICBpZiAoIW1JbnZlcnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGl4ZWwgcHJvamVjdCBtYXRyaXggbm90IGludmVydGlibGUnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5waXhlbFByb2plY3Rpb25NYXRyaXggPSBtO1xuICAgICAgdGhpcy5waXhlbFVucHJvamVjdGlvbk1hdHJpeCA9IG1JbnZlcnNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlcXVhbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXF1YWxzKHZpZXdwb3J0KSB7XG4gICAgICBpZiAoISh2aWV3cG9ydCBpbnN0YW5jZW9mIFdlYk1lcmNhdG9yVmlld3BvcnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0LndpZHRoID09PSB0aGlzLndpZHRoICYmIHZpZXdwb3J0LmhlaWdodCA9PT0gdGhpcy5oZWlnaHQgJiYgbWF0NC5lcXVhbHModmlld3BvcnQucHJvamVjdGlvbk1hdHJpeCwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KSAmJiBtYXQ0LmVxdWFscyh2aWV3cG9ydC52aWV3TWF0cml4LCB0aGlzLnZpZXdNYXRyaXgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9qZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2plY3QoeHl6KSB7XG4gICAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICAgIF9yZWYyJHRvcExlZnQgPSBfcmVmMi50b3BMZWZ0LFxuICAgICAgICAgIHRvcExlZnQgPSBfcmVmMiR0b3BMZWZ0ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjIkdG9wTGVmdDtcblxuICAgICAgdmFyIHdvcmxkUG9zaXRpb24gPSB0aGlzLnByb2plY3RQb3NpdGlvbih4eXopO1xuICAgICAgdmFyIGNvb3JkID0gd29ybGRUb1BpeGVscyh3b3JsZFBvc2l0aW9uLCB0aGlzLnBpeGVsUHJvamVjdGlvbk1hdHJpeCk7XG5cbiAgICAgIHZhciBfY29vcmQgPSBfc2xpY2VkVG9BcnJheShjb29yZCwgMiksXG4gICAgICAgICAgeCA9IF9jb29yZFswXSxcbiAgICAgICAgICB5ID0gX2Nvb3JkWzFdO1xuXG4gICAgICB2YXIgeTIgPSB0b3BMZWZ0ID8geSA6IHRoaXMuaGVpZ2h0IC0geTtcbiAgICAgIHJldHVybiB4eXoubGVuZ3RoID09PSAyID8gW3gsIHkyXSA6IFt4LCB5MiwgY29vcmRbMl1dO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnByb2plY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5wcm9qZWN0KHh5eikge1xuICAgICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgICBfcmVmMyR0b3BMZWZ0ID0gX3JlZjMudG9wTGVmdCxcbiAgICAgICAgICB0b3BMZWZ0ID0gX3JlZjMkdG9wTGVmdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYzJHRvcExlZnQsXG4gICAgICAgICAgX3JlZjMkdGFyZ2V0WiA9IF9yZWYzLnRhcmdldFosXG4gICAgICAgICAgdGFyZ2V0WiA9IF9yZWYzJHRhcmdldFogPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYzJHRhcmdldFo7XG5cbiAgICAgIHZhciBfeHl6ID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgICAgICB4ID0gX3h5elswXSxcbiAgICAgICAgICB5ID0gX3h5elsxXSxcbiAgICAgICAgICB6ID0gX3h5elsyXTtcblxuICAgICAgdmFyIHkyID0gdG9wTGVmdCA/IHkgOiB0aGlzLmhlaWdodCAtIHk7XG4gICAgICB2YXIgdGFyZ2V0WldvcmxkID0gdGFyZ2V0WiAmJiB0YXJnZXRaICogdGhpcy5kaXN0YW5jZVNjYWxlcy51bml0c1Blck1ldGVyWzJdO1xuICAgICAgdmFyIGNvb3JkID0gcGl4ZWxzVG9Xb3JsZChbeCwgeTIsIHpdLCB0aGlzLnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCB0YXJnZXRaV29ybGQpO1xuXG4gICAgICB2YXIgX3RoaXMkdW5wcm9qZWN0UG9zaXRpID0gdGhpcy51bnByb2plY3RQb3NpdGlvbihjb29yZCksXG4gICAgICAgICAgX3RoaXMkdW5wcm9qZWN0UG9zaXRpMiA9IF9zbGljZWRUb0FycmF5KF90aGlzJHVucHJvamVjdFBvc2l0aSwgMyksXG4gICAgICAgICAgWCA9IF90aGlzJHVucHJvamVjdFBvc2l0aTJbMF0sXG4gICAgICAgICAgWSA9IF90aGlzJHVucHJvamVjdFBvc2l0aTJbMV0sXG4gICAgICAgICAgWiA9IF90aGlzJHVucHJvamVjdFBvc2l0aTJbMl07XG5cbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoeikpIHtcbiAgICAgICAgcmV0dXJuIFtYLCBZLCBaXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0YXJnZXRaKSA/IFtYLCBZLCB0YXJnZXRaXSA6IFtYLCBZXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJvamVjdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2plY3RQb3NpdGlvbih4eXopIHtcbiAgICAgIHZhciBfbG5nTGF0VG9Xb3JsZCA9IGxuZ0xhdFRvV29ybGQoeHl6KSxcbiAgICAgICAgICBfbG5nTGF0VG9Xb3JsZDIgPSBfc2xpY2VkVG9BcnJheShfbG5nTGF0VG9Xb3JsZCwgMiksXG4gICAgICAgICAgWCA9IF9sbmdMYXRUb1dvcmxkMlswXSxcbiAgICAgICAgICBZID0gX2xuZ0xhdFRvV29ybGQyWzFdO1xuXG4gICAgICB2YXIgWiA9ICh4eXpbMl0gfHwgMCkgKiB0aGlzLmRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXJbMl07XG4gICAgICByZXR1cm4gW1gsIFksIFpdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnByb2plY3RQb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnByb2plY3RQb3NpdGlvbih4eXopIHtcbiAgICAgIHZhciBfd29ybGRUb0xuZ0xhdCA9IHdvcmxkVG9MbmdMYXQoeHl6KSxcbiAgICAgICAgICBfd29ybGRUb0xuZ0xhdDIgPSBfc2xpY2VkVG9BcnJheShfd29ybGRUb0xuZ0xhdCwgMiksXG4gICAgICAgICAgWCA9IF93b3JsZFRvTG5nTGF0MlswXSxcbiAgICAgICAgICBZID0gX3dvcmxkVG9MbmdMYXQyWzFdO1xuXG4gICAgICB2YXIgWiA9ICh4eXpbMl0gfHwgMCkgKiB0aGlzLmRpc3RhbmNlU2NhbGVzLm1ldGVyc1BlclVuaXRbMl07XG4gICAgICByZXR1cm4gW1gsIFksIFpdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9qZWN0RmxhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9qZWN0RmxhdChsbmdMYXQpIHtcbiAgICAgIHJldHVybiBsbmdMYXRUb1dvcmxkKGxuZ0xhdCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVucHJvamVjdEZsYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5wcm9qZWN0RmxhdCh4eSkge1xuICAgICAgcmV0dXJuIHdvcmxkVG9MbmdMYXQoeHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oX3JlZjQpIHtcbiAgICAgIHZhciBsbmdMYXQgPSBfcmVmNC5sbmdMYXQsXG4gICAgICAgICAgcG9zID0gX3JlZjQucG9zO1xuICAgICAgdmFyIGZyb21Mb2NhdGlvbiA9IHBpeGVsc1RvV29ybGQocG9zLCB0aGlzLnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4KTtcbiAgICAgIHZhciB0b0xvY2F0aW9uID0gbG5nTGF0VG9Xb3JsZChsbmdMYXQpO1xuICAgICAgdmFyIHRyYW5zbGF0ZSA9IHZlYzIuYWRkKFtdLCB0b0xvY2F0aW9uLCB2ZWMyLm5lZ2F0ZShbXSwgZnJvbUxvY2F0aW9uKSk7XG4gICAgICB2YXIgbmV3Q2VudGVyID0gdmVjMi5hZGQoW10sIHRoaXMuY2VudGVyLCB0cmFuc2xhdGUpO1xuICAgICAgcmV0dXJuIHdvcmxkVG9MbmdMYXQobmV3Q2VudGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TG9jYXRpb25BdFBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvY2F0aW9uQXRQb2ludChfcmVmNSkge1xuICAgICAgdmFyIGxuZ0xhdCA9IF9yZWY1LmxuZ0xhdCxcbiAgICAgICAgICBwb3MgPSBfcmVmNS5wb3M7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uKHtcbiAgICAgICAgbG5nTGF0OiBsbmdMYXQsXG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZml0Qm91bmRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpdEJvdW5kcyhib3VuZHMpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cbiAgICAgIHZhciBfZml0Qm91bmRzMiA9IF9maXRCb3VuZHMoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9LCBvcHRpb25zKSksXG4gICAgICAgICAgbG9uZ2l0dWRlID0gX2ZpdEJvdW5kczIubG9uZ2l0dWRlLFxuICAgICAgICAgIGxhdGl0dWRlID0gX2ZpdEJvdW5kczIubGF0aXR1ZGUsXG4gICAgICAgICAgem9vbSA9IF9maXRCb3VuZHMyLnpvb207XG5cbiAgICAgIHJldHVybiBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgIHpvb206IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRCb3VuZHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Qm91bmRzKG9wdGlvbnMpIHtcbiAgICAgIHZhciBjb3JuZXJzID0gdGhpcy5nZXRCb3VuZGluZ1JlZ2lvbihvcHRpb25zKTtcbiAgICAgIHZhciB3ZXN0ID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGNvcm5lcnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwWzBdO1xuICAgICAgfSkpKTtcbiAgICAgIHZhciBlYXN0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGNvcm5lcnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwWzBdO1xuICAgICAgfSkpKTtcbiAgICAgIHZhciBzb3V0aCA9IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShjb3JuZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgIH0pKSk7XG4gICAgICB2YXIgbm9ydGggPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoY29ybmVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHBbMV07XG4gICAgICB9KSkpO1xuICAgICAgcmV0dXJuIFtbd2VzdCwgc291dGhdLCBbZWFzdCwgbm9ydGhdXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Qm91bmRpbmdSZWdpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Qm91bmRpbmdSZWdpb24oKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gZ2V0Qm91bmRzKHRoaXMsIG9wdGlvbnMueiB8fCAwKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gV2ViTWVyY2F0b3JWaWV3cG9ydDtcbn0oKTtcblxuZXhwb3J0IHsgV2ViTWVyY2F0b3JWaWV3cG9ydCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQgZnJvbSAnLi93ZWItbWVyY2F0b3Itdmlld3BvcnQnO1xuaW1wb3J0IHsgbW9kLCBsb2cyIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbnZhciBNQVhfTEFUSVRVREUgPSA4NS4wNTExMztcbnZhciBNSU5fTEFUSVRVREUgPSAtODUuMDUxMTM7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemVWaWV3cG9ydFByb3BzKF9yZWYpIHtcbiAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgbG9uZ2l0dWRlID0gX3JlZi5sb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICB6b29tID0gX3JlZi56b29tLFxuICAgICAgX3JlZiRwaXRjaCA9IF9yZWYucGl0Y2gsXG4gICAgICBwaXRjaCA9IF9yZWYkcGl0Y2ggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHBpdGNoLFxuICAgICAgX3JlZiRiZWFyaW5nID0gX3JlZi5iZWFyaW5nLFxuICAgICAgYmVhcmluZyA9IF9yZWYkYmVhcmluZyA9PT0gdm9pZCAwID8gMCA6IF9yZWYkYmVhcmluZztcblxuICBpZiAobG9uZ2l0dWRlIDwgLTE4MCB8fCBsb25naXR1ZGUgPiAxODApIHtcbiAgICBsb25naXR1ZGUgPSBtb2QobG9uZ2l0dWRlICsgMTgwLCAzNjApIC0gMTgwO1xuICB9XG5cbiAgaWYgKGJlYXJpbmcgPCAtMTgwIHx8IGJlYXJpbmcgPiAxODApIHtcbiAgICBiZWFyaW5nID0gbW9kKGJlYXJpbmcgKyAxODAsIDM2MCkgLSAxODA7XG4gIH1cblxuICB2YXIgZmxhdFZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoe1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgem9vbTogem9vbVxuICB9KTtcbiAgdmFyIHRvcFkgPSBmbGF0Vmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBNQVhfTEFUSVRVREVdKVsxXTtcbiAgdmFyIGJvdHRvbVkgPSBmbGF0Vmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBNSU5fTEFUSVRVREVdKVsxXTtcbiAgdmFyIHNoaWZ0WSA9IDA7XG5cbiAgaWYgKGJvdHRvbVkgLSB0b3BZIDwgaGVpZ2h0KSB7XG4gICAgem9vbSArPSBsb2cyKGhlaWdodCAvIChib3R0b21ZIC0gdG9wWSkpO1xuICAgIGZsYXRWaWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICB6b29tOiB6b29tXG4gICAgfSk7XG4gICAgdG9wWSA9IGZsYXRWaWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIE1BWF9MQVRJVFVERV0pWzFdO1xuICAgIGJvdHRvbVkgPSBmbGF0Vmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBNSU5fTEFUSVRVREVdKVsxXTtcbiAgfVxuXG4gIGlmICh0b3BZID4gMCkge1xuICAgIHNoaWZ0WSA9IHRvcFk7XG4gIH0gZWxzZSBpZiAoYm90dG9tWSA8IGhlaWdodCkge1xuICAgIHNoaWZ0WSA9IGJvdHRvbVkgLSBoZWlnaHQ7XG4gIH1cblxuICBpZiAoc2hpZnRZKSB7XG4gICAgbGF0aXR1ZGUgPSBmbGF0Vmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCAvIDIsIGhlaWdodCAvIDIgKyBzaGlmdFldKVsxXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICB6b29tOiB6b29tLFxuICAgIHBpdGNoOiBwaXRjaCxcbiAgICBiZWFyaW5nOiBiZWFyaW5nXG4gIH07XG59IiwiZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5pbXBvcnQgeyBsZXJwIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbmltcG9ydCB7IHNjYWxlVG9ab29tLCB6b29tVG9TY2FsZSwgbG5nTGF0VG9Xb3JsZCwgd29ybGRUb0xuZ0xhdCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xudmFyIEVQU0lMT04gPSAwLjAxO1xudmFyIFZJRVdQT1JUX1RSQU5TSVRJT05fUFJPUFMgPSBbJ2xvbmdpdHVkZScsICdsYXRpdHVkZScsICd6b29tJ107XG52YXIgREVGQVVMVF9PUFRTID0ge1xuICBjdXJ2ZTogMS40MTQsXG4gIHNwZWVkOiAxLjJcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmbHlUb1ZpZXdwb3J0KHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgdmFyIHZpZXdwb3J0ID0ge307XG5cbiAgdmFyIF9nZXRGbHlUb1RyYW5zaXRpb25QYSA9IGdldEZseVRvVHJhbnNpdGlvblBhcmFtcyhzdGFydFByb3BzLCBlbmRQcm9wcywgb3B0cyksXG4gICAgICBzdGFydFpvb20gPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEuc3RhcnRab29tLFxuICAgICAgc3RhcnRDZW50ZXJYWSA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5zdGFydENlbnRlclhZLFxuICAgICAgdURlbHRhID0gX2dldEZseVRvVHJhbnNpdGlvblBhLnVEZWx0YSxcbiAgICAgIHcwID0gX2dldEZseVRvVHJhbnNpdGlvblBhLncwLFxuICAgICAgdTEgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEudTEsXG4gICAgICBTID0gX2dldEZseVRvVHJhbnNpdGlvblBhLlMsXG4gICAgICByaG8gPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEucmhvLFxuICAgICAgcmhvMiA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5yaG8yLFxuICAgICAgcjAgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEucjA7XG5cbiAgaWYgKHUxIDwgRVBTSUxPTikge1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0UHJvcHNba2V5XTtcbiAgICAgICAgdmFyIGVuZFZhbHVlID0gZW5kUHJvcHNba2V5XTtcbiAgICAgICAgdmlld3BvcnRba2V5XSA9IGxlcnAoc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnQ7XG4gIH1cblxuICB2YXIgcyA9IHQgKiBTO1xuICB2YXIgdyA9IE1hdGguY29zaChyMCkgLyBNYXRoLmNvc2gocjAgKyByaG8gKiBzKTtcbiAgdmFyIHUgPSB3MCAqICgoTWF0aC5jb3NoKHIwKSAqIE1hdGgudGFuaChyMCArIHJobyAqIHMpIC0gTWF0aC5zaW5oKHIwKSkgLyByaG8yKSAvIHUxO1xuICB2YXIgc2NhbGVJbmNyZW1lbnQgPSAxIC8gdztcbiAgdmFyIG5ld1pvb20gPSBzdGFydFpvb20gKyBzY2FsZVRvWm9vbShzY2FsZUluY3JlbWVudCk7XG4gIHZhciBuZXdDZW50ZXJXb3JsZCA9IHZlYzIuc2NhbGUoW10sIHVEZWx0YSwgdSk7XG4gIHZlYzIuYWRkKG5ld0NlbnRlcldvcmxkLCBuZXdDZW50ZXJXb3JsZCwgc3RhcnRDZW50ZXJYWSk7XG4gIHZhciBuZXdDZW50ZXIgPSB3b3JsZFRvTG5nTGF0KG5ld0NlbnRlcldvcmxkKTtcbiAgdmlld3BvcnQubG9uZ2l0dWRlID0gbmV3Q2VudGVyWzBdO1xuICB2aWV3cG9ydC5sYXRpdHVkZSA9IG5ld0NlbnRlclsxXTtcbiAgdmlld3BvcnQuem9vbSA9IG5ld1pvb207XG4gIHJldHVybiB2aWV3cG9ydDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbHlUb0R1cmF0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUUywgb3B0cyk7XG4gIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICBzY3JlZW5TcGVlZCA9IF9vcHRzLnNjcmVlblNwZWVkLFxuICAgICAgc3BlZWQgPSBfb3B0cy5zcGVlZCxcbiAgICAgIG1heER1cmF0aW9uID0gX29wdHMubWF4RHVyYXRpb247XG5cbiAgdmFyIF9nZXRGbHlUb1RyYW5zaXRpb25QYTIgPSBnZXRGbHlUb1RyYW5zaXRpb25QYXJhbXMoc3RhcnRQcm9wcywgZW5kUHJvcHMsIG9wdHMpLFxuICAgICAgUyA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYTIuUyxcbiAgICAgIHJobyA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYTIucmhvO1xuXG4gIHZhciBsZW5ndGggPSAxMDAwICogUztcbiAgdmFyIGR1cmF0aW9uO1xuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoc2NyZWVuU3BlZWQpKSB7XG4gICAgZHVyYXRpb24gPSBsZW5ndGggLyAoc2NyZWVuU3BlZWQgLyByaG8pO1xuICB9IGVsc2Uge1xuICAgIGR1cmF0aW9uID0gbGVuZ3RoIC8gc3BlZWQ7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG1heER1cmF0aW9uKSAmJiBkdXJhdGlvbiA+IG1heER1cmF0aW9uID8gMCA6IGR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRGbHlUb1RyYW5zaXRpb25QYXJhbXMoc3RhcnRQcm9wcywgZW5kUHJvcHMsIG9wdHMpIHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUUywgb3B0cyk7XG4gIHZhciByaG8gPSBvcHRzLmN1cnZlO1xuICB2YXIgc3RhcnRab29tID0gc3RhcnRQcm9wcy56b29tO1xuICB2YXIgc3RhcnRDZW50ZXIgPSBbc3RhcnRQcm9wcy5sb25naXR1ZGUsIHN0YXJ0UHJvcHMubGF0aXR1ZGVdO1xuICB2YXIgc3RhcnRTY2FsZSA9IHpvb21Ub1NjYWxlKHN0YXJ0Wm9vbSk7XG4gIHZhciBlbmRab29tID0gZW5kUHJvcHMuem9vbTtcbiAgdmFyIGVuZENlbnRlciA9IFtlbmRQcm9wcy5sb25naXR1ZGUsIGVuZFByb3BzLmxhdGl0dWRlXTtcbiAgdmFyIHNjYWxlID0gem9vbVRvU2NhbGUoZW5kWm9vbSAtIHN0YXJ0Wm9vbSk7XG4gIHZhciBzdGFydENlbnRlclhZID0gbG5nTGF0VG9Xb3JsZChzdGFydENlbnRlcik7XG4gIHZhciBlbmRDZW50ZXJYWSA9IGxuZ0xhdFRvV29ybGQoZW5kQ2VudGVyKTtcbiAgdmFyIHVEZWx0YSA9IHZlYzIuc3ViKFtdLCBlbmRDZW50ZXJYWSwgc3RhcnRDZW50ZXJYWSk7XG4gIHZhciB3MCA9IE1hdGgubWF4KHN0YXJ0UHJvcHMud2lkdGgsIHN0YXJ0UHJvcHMuaGVpZ2h0KTtcbiAgdmFyIHcxID0gdzAgLyBzY2FsZTtcbiAgdmFyIHUxID0gdmVjMi5sZW5ndGgodURlbHRhKSAqIHN0YXJ0U2NhbGU7XG5cbiAgdmFyIF91MSA9IE1hdGgubWF4KHUxLCBFUFNJTE9OKTtcblxuICB2YXIgcmhvMiA9IHJobyAqIHJobztcbiAgdmFyIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvMiAqIHJobzIgKiBfdTEgKiBfdTEpIC8gKDIgKiB3MCAqIHJobzIgKiBfdTEpO1xuICB2YXIgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG8yICogcmhvMiAqIF91MSAqIF91MSkgLyAoMiAqIHcxICogcmhvMiAqIF91MSk7XG4gIHZhciByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCk7XG4gIHZhciByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gIHZhciBTID0gKHIxIC0gcjApIC8gcmhvO1xuICByZXR1cm4ge1xuICAgIHN0YXJ0Wm9vbTogc3RhcnRab29tLFxuICAgIHN0YXJ0Q2VudGVyWFk6IHN0YXJ0Q2VudGVyWFksXG4gICAgdURlbHRhOiB1RGVsdGEsXG4gICAgdzA6IHcwLFxuICAgIHUxOiB1MSxcbiAgICBTOiBTLFxuICAgIHJobzogcmhvLFxuICAgIHJobzI6IHJobzIsXG4gICAgcjA6IHIwLFxuICAgIHIxOiByMVxuICB9O1xufSIsImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFdlYk1lcmNhdG9yVmlld3BvcnQgfSBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldEJvdW5kcyB9IGZyb20gJy4vZ2V0LWJvdW5kcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpdEJvdW5kcyB9IGZyb20gJy4vZml0LWJvdW5kcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vcm1hbGl6ZVZpZXdwb3J0UHJvcHMgfSBmcm9tICcuL25vcm1hbGl6ZS12aWV3cG9ydC1wcm9wcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZseVRvVmlld3BvcnQsIGdldEZseVRvRHVyYXRpb24gfSBmcm9tICcuL2ZseS10by12aWV3cG9ydCc7XG5leHBvcnQgeyBsbmdMYXRUb1dvcmxkLCB3b3JsZFRvTG5nTGF0LCB3b3JsZFRvUGl4ZWxzLCBwaXhlbHNUb1dvcmxkLCB6b29tVG9TY2FsZSwgc2NhbGVUb1pvb20sIGdldE1ldGVyWm9vbSwgZ2V0RGlzdGFuY2VTY2FsZXMsIGFkZE1ldGVyc1RvTG5nTGF0LCBnZXRWaWV3TWF0cml4LCBnZXRQcm9qZWN0aW9uTWF0cml4LCBnZXRQcm9qZWN0aW9uUGFyYW1ldGVycyB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJzsiLCJleHBvcnQgeyBXZWJNZXJjYXRvclZpZXdwb3J0IGFzIGRlZmF1bHQgfSBmcm9tICdAbWF0aC5nbC93ZWItbWVyY2F0b3InO1xuZXhwb3J0ICogZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJzsiLCIvKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNoaW1zIHRoYXQgcHJvdmlkZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEVTNiBjb2xsZWN0aW9ucy5cclxuICpcclxuICogVGhlc2UgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgbWVhbnQgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBSZXNpemVPYnNlcnZlclxyXG4gKiBtb2R1bGVzIGFzIHRoZXkgY292ZXIgb25seSBhIGxpbWl0ZWQgcmFuZ2Ugb2YgdXNlIGNhc2VzLlxyXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1qc2RvYywgdmFsaWQtanNkb2MgKi9cbnZhciBNYXBTaGltID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gTWFwO1xuICB9XG4gIC8qKlxyXG4gICAqIFJldHVybnMgaW5kZXggaW4gcHJvdmlkZWQgYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQga2V5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBcnJheTxBcnJheT59IGFyclxyXG4gICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldEluZGV4KGFyciwga2V5KSB7XG4gICAgdmFyIHJlc3VsdCA9IC0xO1xuICAgIGFyci5zb21lKGZ1bmN0aW9uIChlbnRyeSwgaW5kZXgpIHtcbiAgICAgIGlmIChlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJlc3VsdCA9IGluZGV4O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8qKiBAY2xhc3MgKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xuICAgICAgICB0aGlzLl9fZW50cmllc19fID0gW107XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fZW50cmllc19fLmxlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcmV0dXJucyB7Kn1cclxuICAgICAgICovXG5cbiAgICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fX2VudHJpZXNfX1tpbmRleF07XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVsxXTtcbiAgICAgIH07XG4gICAgICAvKipcclxuICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZVxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcblxuICAgICAgICBpZiAofmluZGV4KSB7XG4gICAgICAgICAgdGhpcy5fX2VudHJpZXNfX1tpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuX19lbnRyaWVzX187XG4gICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4KGVudHJpZXMsIGtleSk7XG5cbiAgICAgICAgaWYgKH5pbmRleCkge1xuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gISF+Z2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcbiAgICAgIH07XG4gICAgICAvKipcclxuICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAqL1xuXG5cbiAgICAgIGNsYXNzXzEucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9fZW50cmllc19fLnNwbGljZSgwKTtcbiAgICAgIH07XG4gICAgICAvKipcclxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcclxuICAgICAgICogQHBhcmFtIHsqfSBbY3R4PW51bGxdXHJcbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgKi9cblxuXG4gICAgICBjbGFzc18xLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjdHgpIHtcbiAgICAgICAgaWYgKGN0eCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY3R4ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLl9fZW50cmllc19fOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBlbnRyeSA9IF9hW19pXTtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKGN0eCwgZW50cnlbMV0sIGVudHJ5WzBdKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGNsYXNzXzE7XG4gICAgfSgpXG4gICk7XG59KCk7XG4vKipcclxuICogRGV0ZWN0cyB3aGV0aGVyIHdpbmRvdyBhbmQgZG9jdW1lbnQgb2JqZWN0cyBhcmUgYXZhaWxhYmxlIGluIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcbiAqL1xuXG5cbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCA9PT0gZG9jdW1lbnQ7IC8vIFJldHVybnMgZ2xvYmFsIG9iamVjdCBvZiBhIGN1cnJlbnQgZW52aXJvbm1lbnQuXG5cbnZhciBnbG9iYWwkMSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5NYXRoID09PSBNYXRoKSB7XG4gICAgcmV0dXJuIGdsb2JhbDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09PSBNYXRoKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT09IE1hdGgpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuXG5cbiAgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG59KCk7XG4vKipcclxuICogQSBzaGltIGZvciB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdoaWNoIGZhbGxzIGJhY2sgdG8gdGhlIHNldFRpbWVvdXQgaWZcclxuICogZmlyc3Qgb25lIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJlcXVlc3RzJyBpZGVudGlmaWVyLlxyXG4gKi9cblxuXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSXQncyByZXF1aXJlZCB0byB1c2UgYSBib3VuZGVkIGZ1bmN0aW9uIGJlY2F1c2UgSUUgc29tZXRpbWVzIHRocm93c1xuICAgIC8vIGFuIFwiSW52YWxpZCBjYWxsaW5nIG9iamVjdFwiIGVycm9yIGlmIHJBRiBpcyBpbnZva2VkIHdpdGhvdXQgdGhlIGdsb2JhbFxuICAgIC8vIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUuXG4gICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbCQxKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soRGF0ZS5ub3coKSk7XG4gICAgfSwgMTAwMCAvIDYwKTtcbiAgfTtcbn0oKTsgLy8gRGVmaW5lcyBtaW5pbXVtIHRpbWVvdXQgYmVmb3JlIGFkZGluZyBhIHRyYWlsaW5nIGNhbGwuXG5cblxudmFyIHRyYWlsaW5nVGltZW91dCA9IDI7XG4vKipcclxuICogQ3JlYXRlcyBhIHdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggZW5zdXJlcyB0aGF0IHByb3ZpZGVkIGNhbGxiYWNrIHdpbGwgYmVcclxuICogaW52b2tlZCBvbmx5IG9uY2UgZHVyaW5nIHRoZSBzcGVjaWZpZWQgZGVsYXkgcGVyaW9kLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGRlbGF5IHBlcmlvZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gRGVsYXkgYWZ0ZXIgd2hpY2ggdG8gaW52b2tlIGNhbGxiYWNrLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgZGVsYXkpIHtcbiAgdmFyIGxlYWRpbmdDYWxsID0gZmFsc2UsXG4gICAgICB0cmFpbGluZ0NhbGwgPSBmYWxzZSxcbiAgICAgIGxhc3RDYWxsVGltZSA9IDA7XG4gIC8qKlxyXG4gICAqIEludm9rZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBzY2hlZHVsZXMgbmV3IGludm9jYXRpb24gaWZcclxuICAgKiB0aGUgXCJwcm94eVwiIHdhcyBjYWxsZWQgZHVyaW5nIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVQZW5kaW5nKCkge1xuICAgIGlmIChsZWFkaW5nQ2FsbCkge1xuICAgICAgbGVhZGluZ0NhbGwgPSBmYWxzZTtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgaWYgKHRyYWlsaW5nQ2FsbCkge1xuICAgICAgcHJveHkoKTtcbiAgICB9XG4gIH1cbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LiBJdCB3aWxsIGZ1cnRoZXIgcG9zdHBvbmVcclxuICAgKiBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBkZWxlZ2F0aW5nIGl0IHRvIHRoZVxyXG4gICAqIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gdGltZW91dENhbGxiYWNrKCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSQxKHJlc29sdmVQZW5kaW5nKTtcbiAgfVxuICAvKipcclxuICAgKiBTY2hlZHVsZXMgaW52b2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHByb3h5KCkge1xuICAgIHZhciB0aW1lU3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGxlYWRpbmdDYWxsKSB7XG4gICAgICAvLyBSZWplY3QgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzLlxuICAgICAgaWYgKHRpbWVTdGFtcCAtIGxhc3RDYWxsVGltZSA8IHRyYWlsaW5nVGltZW91dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFNjaGVkdWxlIG5ldyBjYWxsIHRvIGJlIGluIGludm9rZWQgd2hlbiB0aGUgcGVuZGluZyBvbmUgaXMgcmVzb2x2ZWQuXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgXCJ0cmFuc2l0aW9uc1wiIHdoaWNoIG5ldmVyIGFjdHVhbGx5IHN0YXJ0XG4gICAgICAvLyBpbW1lZGlhdGVseSBzbyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHdlIG1pZ2h0IG1pc3Mgb25lIGlmIGNoYW5nZVxuICAgICAgLy8gaGFwcGVucyBhbWlkcyB0aGUgcGVuZGluZyBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRyYWlsaW5nQ2FsbCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlYWRpbmdDYWxsID0gdHJ1ZTtcbiAgICAgIHRyYWlsaW5nQ2FsbCA9IGZhbHNlO1xuICAgICAgc2V0VGltZW91dCh0aW1lb3V0Q2FsbGJhY2ssIGRlbGF5KTtcbiAgICB9XG5cbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lU3RhbXA7XG4gIH1cblxuICByZXR1cm4gcHJveHk7XG59IC8vIE1pbmltdW0gZGVsYXkgYmVmb3JlIGludm9raW5nIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2ZXJzLlxuXG5cbnZhciBSRUZSRVNIX0RFTEFZID0gMjA7IC8vIEEgbGlzdCBvZiBzdWJzdHJpbmdzIG9mIENTUyBwcm9wZXJ0aWVzIHVzZWQgdG8gZmluZCB0cmFuc2l0aW9uIGV2ZW50cyB0aGF0XG4vLyBtaWdodCBhZmZlY3QgZGltZW5zaW9ucyBvZiBvYnNlcnZlZCBlbGVtZW50cy5cblxudmFyIHRyYW5zaXRpb25LZXlzID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ3NpemUnLCAnd2VpZ2h0J107IC8vIENoZWNrIGlmIE11dGF0aW9uT2JzZXJ2ZXIgaXMgYXZhaWxhYmxlLlxuXG52YXIgbXV0YXRpb25PYnNlcnZlclN1cHBvcnRlZCA9IHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcbi8qKlxyXG4gKiBTaW5nbGV0b24gY29udHJvbGxlciBjbGFzcyB3aGljaCBoYW5kbGVzIHVwZGF0ZXMgb2YgUmVzaXplT2JzZXJ2ZXIgaW5zdGFuY2VzLlxyXG4gKi9cblxudmFyIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCkge1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgRE9NIGxpc3RlbmVycyBoYXZlIGJlZW4gYWRkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICB0aGlzLmNvbm5lY3RlZF8gPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIFRlbGxzIHRoYXQgY29udHJvbGxlciBoYXMgc3Vic2NyaWJlZCBmb3IgTXV0YXRpb24gRXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBLZWVwcyByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIG9mIE11dGF0aW9uT2JzZXJ2ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge011dGF0aW9uT2JzZXJ2ZXJ9XHJcbiAgICAgKi9cblxuICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtBcnJheTxSZXNpemVPYnNlcnZlclNQST59XHJcbiAgICAgKi9cblxuICAgIHRoaXMub2JzZXJ2ZXJzXyA9IFtdO1xuICAgIHRoaXMub25UcmFuc2l0aW9uRW5kXyA9IHRoaXMub25UcmFuc2l0aW9uRW5kXy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVmcmVzaCA9IHRocm90dGxlKHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpLCBSRUZSRVNIX0RFTEFZKTtcbiAgfVxuICAvKipcclxuICAgKiBBZGRzIG9ic2VydmVyIHRvIG9ic2VydmVycyBsaXN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSBhZGRlZC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuYWRkT2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICBpZiAoIX50aGlzLm9ic2VydmVyc18uaW5kZXhPZihvYnNlcnZlcikpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzXy5wdXNoKG9ic2VydmVyKTtcbiAgICB9IC8vIEFkZCBsaXN0ZW5lcnMgaWYgdGhleSBoYXZlbid0IGJlZW4gYWRkZWQgeWV0LlxuXG5cbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkXykge1xuICAgICAgdGhpcy5jb25uZWN0XygpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBvYnNlcnZlciBmcm9tIG9ic2VydmVycyBsaXN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSByZW1vdmVkLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc187XG4gICAgdmFyIGluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpOyAvLyBSZW1vdmUgb2JzZXJ2ZXIgaWYgaXQncyBwcmVzZW50IGluIHJlZ2lzdHJ5LlxuXG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSAvLyBSZW1vdmUgbGlzdGVuZXJzIGlmIGNvbnRyb2xsZXIgaGFzIG5vIGNvbm5lY3RlZCBvYnNlcnZlcnMuXG5cblxuICAgIGlmICghb2JzZXJ2ZXJzLmxlbmd0aCAmJiB0aGlzLmNvbm5lY3RlZF8pIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdF8oKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEludm9rZXMgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuIEl0IHdpbGwgY29udGludWUgcnVubmluZyB1cGRhdGVzIGluc29mYXJcclxuICAgKiBpdCBkZXRlY3RzIGNoYW5nZXMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2hhbmdlc0RldGVjdGVkID0gdGhpcy51cGRhdGVPYnNlcnZlcnNfKCk7IC8vIENvbnRpbnVlIHJ1bm5pbmcgdXBkYXRlcyBpZiBjaGFuZ2VzIGhhdmUgYmVlbiBkZXRlY3RlZCBhcyB0aGVyZSBtaWdodFxuICAgIC8vIGJlIGZ1dHVyZSBvbmVzIGNhdXNlZCBieSBDU1MgdHJhbnNpdGlvbnMuXG5cbiAgICBpZiAoY2hhbmdlc0RldGVjdGVkKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgZXZlcnkgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdCBhbmQgbm90aWZpZXMgdGhlbSBvZiBxdWV1ZWRcclxuICAgKiBlbnRyaWVzLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBcInRydWVcIiBpZiBhbnkgb2JzZXJ2ZXIgaGFzIGRldGVjdGVkIGNoYW5nZXMgaW5cclxuICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgaXQncyBlbGVtZW50cy5cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUudXBkYXRlT2JzZXJ2ZXJzXyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBDb2xsZWN0IG9ic2VydmVycyB0aGF0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cbiAgICB2YXIgYWN0aXZlT2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnNfLmZpbHRlcihmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBvYnNlcnZlci5nYXRoZXJBY3RpdmUoKSwgb2JzZXJ2ZXIuaGFzQWN0aXZlKCk7XG4gICAgfSk7IC8vIERlbGl2ZXIgbm90aWZpY2F0aW9ucyBpbiBhIHNlcGFyYXRlIGN5Y2xlIGluIG9yZGVyIHRvIGF2b2lkIGFueVxuICAgIC8vIGNvbGxpc2lvbnMgYmV0d2VlbiBvYnNlcnZlcnMsIGUuZy4gd2hlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2ZcbiAgICAvLyBSZXNpemVPYnNlcnZlciBhcmUgdHJhY2tpbmcgdGhlIHNhbWUgZWxlbWVudCBhbmQgdGhlIGNhbGxiYWNrIG9mIG9uZVxuICAgIC8vIG9mIHRoZW0gY2hhbmdlcyBjb250ZW50IGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIHRhcmdldC4gU29tZXRpbWVzXG4gICAgLy8gdGhpcyBtYXkgcmVzdWx0IGluIG5vdGlmaWNhdGlvbnMgYmVpbmcgYmxvY2tlZCBmb3IgdGhlIHJlc3Qgb2Ygb2JzZXJ2ZXJzLlxuXG4gICAgYWN0aXZlT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2ZXIuYnJvYWRjYXN0QWN0aXZlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZU9ic2VydmVycy5sZW5ndGggPiAwO1xuICB9O1xuICAvKipcclxuICAgKiBJbml0aWFsaXplcyBET00gbGlzdGVuZXJzLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuY29ubmVjdF8gPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBydW5uaW5nIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgb3IgaWYgbGlzdGVuZXJzXG4gICAgLy8gaGF2ZSBiZWVuIGFscmVhZHkgYWRkZWQuXG4gICAgaWYgKCFpc0Jyb3dzZXIgfHwgdGhpcy5jb25uZWN0ZWRfKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTdWJzY3JpcHRpb24gdG8gdGhlIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvclxuICAgIC8vIGRlbGF5ZWQgdHJhbnNpdGlvbnMuIFRoaXMgd2F5IGl0J3MgcG9zc2libGUgdG8gY2FwdHVyZSBhdCBsZWFzdCB0aGVcbiAgICAvLyBmaW5hbCBzdGF0ZSBvZiBhbiBlbGVtZW50LlxuXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5vblRyYW5zaXRpb25FbmRfKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZWZyZXNoKTtcblxuICAgIGlmIChtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMucmVmcmVzaCk7XG4gICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5vYnNlcnZlKGRvY3VtZW50LCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTVN1YnRyZWVNb2RpZmllZCcsIHRoaXMucmVmcmVzaCk7XG4gICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3RlZF8gPSB0cnVlO1xuICB9O1xuICAvKipcclxuICAgKiBSZW1vdmVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5kaXNjb25uZWN0XyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIHJ1bm5pbmcgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBpZiBsaXN0ZW5lcnNcbiAgICAvLyBoYXZlIGJlZW4gYWxyZWFkeSByZW1vdmVkLlxuICAgIGlmICghaXNCcm93c2VyIHx8ICF0aGlzLmNvbm5lY3RlZF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5vblRyYW5zaXRpb25FbmRfKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZWZyZXNoKTtcblxuICAgIGlmICh0aGlzLm11dGF0aW9uc09ic2VydmVyXykge1xuICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdET01TdWJ0cmVlTW9kaWZpZWQnLCB0aGlzLnJlZnJlc2gpO1xuICAgIH1cblxuICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcbiAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGhhbmRsZXIuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSB7VHJhbnNpdGlvbkV2ZW50fSBldmVudFxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5vblRyYW5zaXRpb25FbmRfID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2EucHJvcGVydHlOYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWUgPSBfYiA9PT0gdm9pZCAwID8gJycgOiBfYjsgLy8gRGV0ZWN0IHdoZXRoZXIgdHJhbnNpdGlvbiBtYXkgYWZmZWN0IGRpbWVuc2lvbnMgb2YgYW4gZWxlbWVudC5cblxuICAgIHZhciBpc1JlZmxvd1Byb3BlcnR5ID0gdHJhbnNpdGlvbktleXMuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gISF+cHJvcGVydHlOYW1lLmluZGV4T2Yoa2V5KTtcbiAgICB9KTtcblxuICAgIGlmIChpc1JlZmxvd1Byb3BlcnR5KSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgaW5zdGFuY2Ugb2YgdGhlIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlXykge1xuICAgICAgdGhpcy5pbnN0YW5jZV8gPSBuZXcgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VfO1xuICB9O1xuICAvKipcclxuICAgKiBIb2xkcyByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2xsZXIncyBpbnN0YW5jZS5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuaW5zdGFuY2VfID0gbnVsbDtcbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcjtcbn0oKTtcbi8qKlxyXG4gKiBEZWZpbmVzIG5vbi13cml0YWJsZS9lbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIHRhcmdldCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBPYmplY3QgZm9yIHdoaWNoIHRvIGRlZmluZSBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBQcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRhcmdldCBvYmplY3QuXHJcbiAqL1xuXG5cbnZhciBkZWZpbmVDb25maWd1cmFibGUgPSBmdW5jdGlvbiBkZWZpbmVDb25maWd1cmFibGUodGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrZXkgPSBfYVtfaV07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICB2YWx1ZTogcHJvcHNba2V5XSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlZCBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XHJcbiAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAqL1xuXG5cbnZhciBnZXRXaW5kb3dPZiA9IGZ1bmN0aW9uIGdldFdpbmRvd09mKHRhcmdldCkge1xuICAvLyBBc3N1bWUgdGhhdCB0aGUgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiBOb2RlLCB3aGljaCBtZWFucyB0aGF0IGl0XG4gIC8vIGhhcyB0aGUgXCJvd25lckRvY3VtZW50XCIgcHJvcGVydHkgZnJvbSB3aGljaCB3ZSBjYW4gcmV0cmlldmUgYVxuICAvLyBjb3JyZXNwb25kaW5nIGdsb2JhbCBvYmplY3QuXG4gIHZhciBvd25lckdsb2JhbCA9IHRhcmdldCAmJiB0YXJnZXQub3duZXJEb2N1bWVudCAmJiB0YXJnZXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsgLy8gUmV0dXJuIHRoZSBsb2NhbCBnbG9iYWwgb2JqZWN0IGlmIGl0J3Mgbm90IHBvc3NpYmxlIGV4dHJhY3Qgb25lIGZyb21cbiAgLy8gcHJvdmlkZWQgZWxlbWVudC5cblxuICByZXR1cm4gb3duZXJHbG9iYWwgfHwgZ2xvYmFsJDE7XG59OyAvLyBQbGFjZWhvbGRlciBvZiBhbiBlbXB0eSBjb250ZW50IHJlY3RhbmdsZS5cblxuXG52YXIgZW1wdHlSZWN0ID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XG4vKipcclxuICogQ29udmVydHMgcHJvdmlkZWQgc3RyaW5nIHRvIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xuXG5mdW5jdGlvbiB0b0Zsb2F0KHZhbHVlKSB7XG4gIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwO1xufVxuLyoqXHJcbiAqIEV4dHJhY3RzIGJvcmRlcnMgc2l6ZSBmcm9tIHByb3ZpZGVkIHN0eWxlcy5cclxuICpcclxuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IHBvc2l0aW9ucyAtIEJvcmRlcnMgcG9zaXRpb25zICh0b3AsIHJpZ2h0LCAuLi4pXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJvcmRlcnNTaXplKHN0eWxlcykge1xuICB2YXIgcG9zaXRpb25zID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBwb3NpdGlvbnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICByZXR1cm4gcG9zaXRpb25zLnJlZHVjZShmdW5jdGlvbiAoc2l6ZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ2JvcmRlci0nICsgcG9zaXRpb24gKyAnLXdpZHRoJ107XG4gICAgcmV0dXJuIHNpemUgKyB0b0Zsb2F0KHZhbHVlKTtcbiAgfSwgMCk7XG59XG4vKipcclxuICogRXh0cmFjdHMgcGFkZGluZ3Mgc2l6ZXMgZnJvbSBwcm92aWRlZCBzdHlsZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFBhZGRpbmdzIGJveC5cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0UGFkZGluZ3Moc3R5bGVzKSB7XG4gIHZhciBwb3NpdGlvbnMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xuICB2YXIgcGFkZGluZ3MgPSB7fTtcblxuICBmb3IgKHZhciBfaSA9IDAsIHBvc2l0aW9uc18xID0gcG9zaXRpb25zOyBfaSA8IHBvc2l0aW9uc18xLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBwb3NpdGlvbiA9IHBvc2l0aW9uc18xW19pXTtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ3BhZGRpbmctJyArIHBvc2l0aW9uXTtcbiAgICBwYWRkaW5nc1twb3NpdGlvbl0gPSB0b0Zsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBwYWRkaW5ncztcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHByb3ZpZGVkIFNWRyBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1NWR0dyYXBoaWNzRWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCBjb250ZW50IHJlY3RhbmdsZSBvZiB3aGljaCBuZWVkc1xyXG4gKiAgICAgIHRvIGJlIGNhbGN1bGF0ZWQuXHJcbiAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KSB7XG4gIHZhciBiYm94ID0gdGFyZ2V0LmdldEJCb3goKTtcbiAgcmV0dXJuIGNyZWF0ZVJlY3RJbml0KDAsIDAsIGJib3gud2lkdGgsIGJib3guaGVpZ2h0KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHByb3ZpZGVkIEhUTUxFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KSB7XG4gIC8vIENsaWVudCB3aWR0aCAmIGhlaWdodCBwcm9wZXJ0aWVzIGNhbid0IGJlXG4gIC8vIHVzZWQgZXhjbHVzaXZlbHkgYXMgdGhleSBwcm92aWRlIHJvdW5kZWQgdmFsdWVzLlxuICB2YXIgY2xpZW50V2lkdGggPSB0YXJnZXQuY2xpZW50V2lkdGgsXG4gICAgICBjbGllbnRIZWlnaHQgPSB0YXJnZXQuY2xpZW50SGVpZ2h0OyAvLyBCeSB0aGlzIGNvbmRpdGlvbiB3ZSBjYW4gY2F0Y2ggYWxsIG5vbi1yZXBsYWNlZCBpbmxpbmUsIGhpZGRlbiBhbmRcbiAgLy8gZGV0YWNoZWQgZWxlbWVudHMuIFRob3VnaCBlbGVtZW50cyB3aXRoIHdpZHRoICYgaGVpZ2h0IHByb3BlcnRpZXMgbGVzc1xuICAvLyB0aGFuIDAuNSB3aWxsIGJlIGRpc2NhcmRlZCBhcyB3ZWxsLlxuICAvL1xuICAvLyBXaXRob3V0IGl0IHdlIHdvdWxkIG5lZWQgdG8gaW1wbGVtZW50IHNlcGFyYXRlIG1ldGhvZHMgZm9yIGVhY2ggb2ZcbiAgLy8gdGhvc2UgY2FzZXMgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHBlcmZvcm0gYSBwcmVjaXNlIGFuZCBwZXJmb3JtYW5jZVxuICAvLyBlZmZlY3RpdmUgdGVzdCBmb3IgaGlkZGVuIGVsZW1lbnRzLiBFLmcuIGV2ZW4galF1ZXJ5J3MgJzp2aXNpYmxlJyBmaWx0ZXJcbiAgLy8gZ2l2ZXMgd3JvbmcgcmVzdWx0cyBmb3IgZWxlbWVudHMgd2l0aCB3aWR0aCAmIGhlaWdodCBsZXNzIHRoYW4gMC41LlxuXG4gIGlmICghY2xpZW50V2lkdGggJiYgIWNsaWVudEhlaWdodCkge1xuICAgIHJldHVybiBlbXB0eVJlY3Q7XG4gIH1cblxuICB2YXIgc3R5bGVzID0gZ2V0V2luZG93T2YodGFyZ2V0KS5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gIHZhciBwYWRkaW5ncyA9IGdldFBhZGRpbmdzKHN0eWxlcyk7XG4gIHZhciBob3JpelBhZCA9IHBhZGRpbmdzLmxlZnQgKyBwYWRkaW5ncy5yaWdodDtcbiAgdmFyIHZlcnRQYWQgPSBwYWRkaW5ncy50b3AgKyBwYWRkaW5ncy5ib3R0b207IC8vIENvbXB1dGVkIHN0eWxlcyBvZiB3aWR0aCAmIGhlaWdodCBhcmUgYmVpbmcgdXNlZCBiZWNhdXNlIHRoZXkgYXJlIHRoZVxuICAvLyBvbmx5IGRpbWVuc2lvbnMgYXZhaWxhYmxlIHRvIEpTIHRoYXQgY29udGFpbiBub24tcm91bmRlZCB2YWx1ZXMuIEl0IGNvdWxkXG4gIC8vIGJlIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpZiBvbmx5IGl0J3MgZGF0YSB3YXNuJ3RcbiAgLy8gYWZmZWN0ZWQgYnkgQ1NTIHRyYW5zZm9ybWF0aW9ucyBsZXQgYWxvbmUgcGFkZGluZ3MsIGJvcmRlcnMgYW5kIHNjcm9sbCBiYXJzLlxuXG4gIHZhciB3aWR0aCA9IHRvRmxvYXQoc3R5bGVzLndpZHRoKSxcbiAgICAgIGhlaWdodCA9IHRvRmxvYXQoc3R5bGVzLmhlaWdodCk7IC8vIFdpZHRoICYgaGVpZ2h0IGluY2x1ZGUgcGFkZGluZ3MgYW5kIGJvcmRlcnMgd2hlbiB0aGUgJ2JvcmRlci1ib3gnIGJveFxuICAvLyBtb2RlbCBpcyBhcHBsaWVkIChleGNlcHQgZm9yIElFKS5cblxuICBpZiAoc3R5bGVzLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgLy8gRm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGhhbmRsZSBJbnRlcm5ldCBFeHBsb3JlciB3aGljaFxuICAgIC8vIGRvZXNuJ3QgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB0byBjb21wdXRlZCBDU1MgZGltZW5zaW9ucy5cbiAgICAvL1xuICAgIC8vIFdlIGNhbiBzYXkgdGhhdCBpZiBDU1MgZGltZW5zaW9ucyArIHBhZGRpbmdzIGFyZSBlcXVhbCB0byB0aGUgXCJjbGllbnRcIlxuICAgIC8vIHByb3BlcnRpZXMgdGhlbiBpdCdzIGVpdGhlciBJRSwgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBzdWJ0cmFjdFxuICAgIC8vIGFueXRoaW5nLCBvciBhbiBlbGVtZW50IG1lcmVseSBkb2Vzbid0IGhhdmUgcGFkZGluZ3MvYm9yZGVycyBzdHlsZXMuXG4gICAgaWYgKE1hdGgucm91bmQod2lkdGggKyBob3JpelBhZCkgIT09IGNsaWVudFdpZHRoKSB7XG4gICAgICB3aWR0aCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICdsZWZ0JywgJ3JpZ2h0JykgKyBob3JpelBhZDtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5yb3VuZChoZWlnaHQgKyB2ZXJ0UGFkKSAhPT0gY2xpZW50SGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAndG9wJywgJ2JvdHRvbScpICsgdmVydFBhZDtcbiAgICB9XG4gIH0gLy8gRm9sbG93aW5nIHN0ZXBzIGNhbid0IGJlIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50J3Mgcm9vdCBlbGVtZW50IGFzIGl0c1xuICAvLyBjbGllbnRbV2lkdGgvSGVpZ2h0XSBwcm9wZXJ0aWVzIHJlcHJlc2VudCB2aWV3cG9ydCBhcmVhIG9mIHRoZSB3aW5kb3cuXG4gIC8vIEJlc2lkZXMsIGl0J3MgYXMgd2VsbCBub3QgbmVjZXNzYXJ5IGFzIHRoZSA8aHRtbD4gaXRzZWxmIG5laXRoZXIgaGFzXG4gIC8vIHJlbmRlcmVkIHNjcm9sbCBiYXJzIG5vciBpdCBjYW4gYmUgY2xpcHBlZC5cblxuXG4gIGlmICghaXNEb2N1bWVudEVsZW1lbnQodGFyZ2V0KSkge1xuICAgIC8vIEluIHNvbWUgYnJvd3NlcnMgKG9ubHkgaW4gRmlyZWZveCwgYWN0dWFsbHkpIENTUyB3aWR0aCAmIGhlaWdodFxuICAgIC8vIGluY2x1ZGUgc2Nyb2xsIGJhcnMgc2l6ZSB3aGljaCBjYW4gYmUgcmVtb3ZlZCBhdCB0aGlzIHN0ZXAgYXMgc2Nyb2xsXG4gICAgLy8gYmFycyBhcmUgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHJvdW5kZWQgZGltZW5zaW9ucyArIHBhZGRpbmdzXG4gICAgLy8gYW5kIFwiY2xpZW50XCIgcHJvcGVydGllcywgdGhvdWdoIHRoYXQgaXMgbm90IGFsd2F5cyB0cnVlIGluIENocm9tZS5cbiAgICB2YXIgdmVydFNjcm9sbGJhciA9IE1hdGgucm91bmQod2lkdGggKyBob3JpelBhZCkgLSBjbGllbnRXaWR0aDtcbiAgICB2YXIgaG9yaXpTY3JvbGxiYXIgPSBNYXRoLnJvdW5kKGhlaWdodCArIHZlcnRQYWQpIC0gY2xpZW50SGVpZ2h0OyAvLyBDaHJvbWUgaGFzIGEgcmF0aGVyIHdlaXJkIHJvdW5kaW5nIG9mIFwiY2xpZW50XCIgcHJvcGVydGllcy5cbiAgICAvLyBFLmcuIGZvciBhbiBlbGVtZW50IHdpdGggY29udGVudCB3aWR0aCBvZiAzMTQuMnB4IGl0IHNvbWV0aW1lcyBnaXZlc1xuICAgIC8vIHRoZSBjbGllbnQgd2lkdGggb2YgMzE1cHggYW5kIGZvciB0aGUgd2lkdGggb2YgMzE0LjdweCBpdCBtYXkgZ2l2ZVxuICAgIC8vIDMxNHB4LiBBbmQgaXQgZG9lc24ndCBoYXBwZW4gYWxsIHRoZSB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGlzIGRlbHRhXG4gICAgLy8gYXMgYSBub24tcmVsZXZhbnQuXG5cbiAgICBpZiAoTWF0aC5hYnModmVydFNjcm9sbGJhcikgIT09IDEpIHtcbiAgICAgIHdpZHRoIC09IHZlcnRTY3JvbGxiYXI7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGhvcml6U2Nyb2xsYmFyKSAhPT0gMSkge1xuICAgICAgaGVpZ2h0IC09IGhvcml6U2Nyb2xsYmFyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSZWN0SW5pdChwYWRkaW5ncy5sZWZ0LCBwYWRkaW5ncy50b3AsIHdpZHRoLCBoZWlnaHQpO1xufVxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNWR0dyYXBoaWNzRWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIGNoZWNrZWQuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cblxuXG52YXIgaXNTVkdHcmFwaGljc0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFNvbWUgYnJvd3NlcnMsIG5hbWVseSBJRSBhbmQgRWRnZSwgZG9uJ3QgaGF2ZSB0aGUgU1ZHR3JhcGhpY3NFbGVtZW50XG4gIC8vIGludGVyZmFjZS5cbiAgaWYgKHR5cGVvZiBTVkdHcmFwaGljc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICB9O1xuICB9IC8vIElmIGl0J3Mgc28sIHRoZW4gY2hlY2sgdGhhdCBlbGVtZW50IGlzIGF0IGxlYXN0IGFuIGluc3RhbmNlIG9mIHRoZVxuICAvLyBTVkdFbGVtZW50IGFuZCB0aGF0IGl0IGhhcyB0aGUgXCJnZXRCQm94XCIgbWV0aG9kLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0VsZW1lbnQgJiYgdHlwZW9mIHRhcmdldC5nZXRCQm94ID09PSAnZnVuY3Rpb24nO1xuICB9O1xufSgpO1xuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYSBkb2N1bWVudCBlbGVtZW50ICg8aHRtbD4pLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRG9jdW1lbnRFbGVtZW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0ID09PSBnZXRXaW5kb3dPZih0YXJnZXQpLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFuIGFwcHJvcHJpYXRlIGNvbnRlbnQgcmVjdGFuZ2xlIGZvciBwcm92aWRlZCBodG1sIG9yIHN2ZyBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHMgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb250ZW50UmVjdCh0YXJnZXQpIHtcbiAgaWYgKCFpc0Jyb3dzZXIpIHtcbiAgICByZXR1cm4gZW1wdHlSZWN0O1xuICB9XG5cbiAgaWYgKGlzU1ZHR3JhcGhpY3NFbGVtZW50KHRhcmdldCkpIHtcbiAgICByZXR1cm4gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KTtcbiAgfVxuXG4gIHJldHVybiBnZXRIVE1MRWxlbWVudENvbnRlbnRSZWN0KHRhcmdldCk7XG59XG4vKipcclxuICogQ3JlYXRlcyByZWN0YW5nbGUgd2l0aCBhbiBpbnRlcmZhY2Ugb2YgdGhlIERPTVJlY3RSZWFkT25seS5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RvbXJlY3RyZWFkb25seVxyXG4gKlxyXG4gKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIE9iamVjdCB3aXRoIHJlY3RhbmdsZSdzIHgveSBjb29yZGluYXRlcyBhbmQgZGltZW5zaW9ucy5cclxuICogQHJldHVybnMge0RPTVJlY3RSZWFkT25seX1cclxuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlUmVhZE9ubHlSZWN0KF9hKSB7XG4gIHZhciB4ID0gX2EueCxcbiAgICAgIHkgPSBfYS55LFxuICAgICAgd2lkdGggPSBfYS53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9hLmhlaWdodDsgLy8gSWYgRE9NUmVjdFJlYWRPbmx5IGlzIGF2YWlsYWJsZSB1c2UgaXQgYXMgYSBwcm90b3R5cGUgZm9yIHRoZSByZWN0YW5nbGUuXG5cbiAgdmFyIENvbnN0ciA9IHR5cGVvZiBET01SZWN0UmVhZE9ubHkgIT09ICd1bmRlZmluZWQnID8gRE9NUmVjdFJlYWRPbmx5IDogT2JqZWN0O1xuICB2YXIgcmVjdCA9IE9iamVjdC5jcmVhdGUoQ29uc3RyLnByb3RvdHlwZSk7IC8vIFJlY3RhbmdsZSdzIHByb3BlcnRpZXMgYXJlIG5vdCB3cml0YWJsZSBhbmQgbm9uLWVudW1lcmFibGUuXG5cbiAgZGVmaW5lQ29uZmlndXJhYmxlKHJlY3QsIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogaGVpZ2h0ICsgeSxcbiAgICBsZWZ0OiB4XG4gIH0pO1xuICByZXR1cm4gcmVjdDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIERPTVJlY3RJbml0IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGltZW5zaW9ucyBhbmQgdGhlIHgveSBjb29yZGluYXRlcy5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RpY3RkZWYtZG9tcmVjdGluaXRcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBYIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gWSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBSZWN0YW5nbGUncyB3aWR0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFJlY3RhbmdsZSdzIGhlaWdodC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cblxuXG5mdW5jdGlvbiBjcmVhdGVSZWN0SW5pdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuLyoqXHJcbiAqIENsYXNzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGF0aW9ucyBvZiB0aGUgY29udGVudCByZWN0YW5nbGUgb2ZcclxuICogcHJvdmlkZWQgRE9NIGVsZW1lbnQgYW5kIGZvciBrZWVwaW5nIHRyYWNrIG9mIGl0J3MgY2hhbmdlcy5cclxuICovXG5cblxudmFyIFJlc2l6ZU9ic2VydmF0aW9uID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBvYnNlcnZlZC5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2YXRpb24odGFyZ2V0KSB7XG4gICAgLyoqXHJcbiAgICAgKiBCcm9hZGNhc3RlZCB3aWR0aCBvZiBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG4gICAgdGhpcy5icm9hZGNhc3RXaWR0aCA9IDA7XG4gICAgLyoqXHJcbiAgICAgKiBCcm9hZGNhc3RlZCBoZWlnaHQgb2YgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5icm9hZGNhc3RIZWlnaHQgPSAwO1xuICAgIC8qKlxyXG4gICAgICogUmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtET01SZWN0SW5pdH1cclxuICAgICAqL1xuXG4gICAgdGhpcy5jb250ZW50UmVjdF8gPSBjcmVhdGVSZWN0SW5pdCgwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgfVxuICAvKipcclxuICAgKiBVcGRhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIGFuZCB0ZWxscyB3aGV0aGVyIGl0J3Mgd2lkdGggb3IgaGVpZ2h0IHByb3BlcnRpZXNcclxuICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYnJvYWRjYXN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDb250ZW50UmVjdCh0aGlzLnRhcmdldCk7XG4gICAgdGhpcy5jb250ZW50UmVjdF8gPSByZWN0O1xuICAgIHJldHVybiByZWN0LndpZHRoICE9PSB0aGlzLmJyb2FkY2FzdFdpZHRoIHx8IHJlY3QuaGVpZ2h0ICE9PSB0aGlzLmJyb2FkY2FzdEhlaWdodDtcbiAgfTtcbiAgLyoqXHJcbiAgICogVXBkYXRlcyAnYnJvYWRjYXN0V2lkdGgnIGFuZCAnYnJvYWRjYXN0SGVpZ2h0JyBwcm9wZXJ0aWVzIHdpdGggYSBkYXRhXHJcbiAgICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9mIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge0RPTVJlY3RJbml0fSBMYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmJyb2FkY2FzdFJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlY3QgPSB0aGlzLmNvbnRlbnRSZWN0XztcbiAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gcmVjdC53aWR0aDtcbiAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIHJldHVybiByZWN0O1xuICB9O1xuXG4gIHJldHVybiBSZXNpemVPYnNlcnZhdGlvbjtcbn0oKTtcblxudmFyIFJlc2l6ZU9ic2VydmVyRW50cnkgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlc2l6ZU9ic2VydmVyRW50cnkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdGhhdCBpcyBiZWluZyBvYnNlcnZlZC5cclxuICAgKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIERhdGEgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJFbnRyeSh0YXJnZXQsIHJlY3RJbml0KSB7XG4gICAgdmFyIGNvbnRlbnRSZWN0ID0gY3JlYXRlUmVhZE9ubHlSZWN0KHJlY3RJbml0KTsgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGVcbiAgICAvLyBhbmQgYXJlIGFsc28gbm90IGVudW1lcmFibGUgaW4gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAvL1xuICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycyBhcmUgbm90IGJlaW5nIHVzZWQgYXMgdGhleSdkIHJlcXVpcmUgdG8gZGVmaW5lIGFcbiAgICAvLyBwcml2YXRlIFdlYWtNYXAgc3RvcmFnZSB3aGljaCBtYXkgY2F1c2UgbWVtb3J5IGxlYWtzIGluIGJyb3dzZXJzIHRoYXRcbiAgICAvLyBkb24ndCBzdXBwb3J0IHRoaXMgdHlwZSBvZiBjb2xsZWN0aW9ucy5cblxuICAgIGRlZmluZUNvbmZpZ3VyYWJsZSh0aGlzLCB7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIGNvbnRlbnRSZWN0OiBjb250ZW50UmVjdFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyRW50cnk7XG59KCk7XG5cbnZhciBSZXNpemVPYnNlcnZlclNQSSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkXHJcbiAgICogICAgICB3aGVuIG9uZSBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlcyBpdCdzIGNvbnRlbnQgZGltZW5zaW9ucy5cclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcn0gY29udHJvbGxlciAtIENvbnRyb2xsZXIgaW5zdGFuY2Ugd2hpY2hcclxuICAgKiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgdXBkYXRlcyBvZiBvYnNlcnZlci5cclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyfSBjYWxsYmFja0N0eCAtIFJlZmVyZW5jZSB0byB0aGUgcHVibGljXHJcbiAgICogICAgICBSZXNpemVPYnNlcnZlciBpbnN0YW5jZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBjYWxsYmFjayBmdW5jdGlvbi5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIGNhbGxiYWNrQ3R4KSB7XG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0aW9uIG9mIHJlc2l6ZSBvYnNlcnZhdGlvbnMgdGhhdCBoYXZlIGRldGVjdGVkIGNoYW5nZXMgaW4gZGltZW5zaW9uc1xyXG4gICAgICogb2YgZWxlbWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAqL1xuICAgIHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXyA9IFtdO1xuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cnkgb2YgdGhlIFJlc2l6ZU9ic2VydmF0aW9uIGluc3RhbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7TWFwPEVsZW1lbnQsIFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5vYnNlcnZhdGlvbnNfID0gbmV3IE1hcFNoaW0oKTtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjYWxsYmFjayBwcm92aWRlZCBhcyBwYXJhbWV0ZXIgMSBpcyBub3QgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxiYWNrXyA9IGNhbGxiYWNrO1xuICAgIHRoaXMuY29udHJvbGxlcl8gPSBjb250cm9sbGVyO1xuICAgIHRoaXMuY2FsbGJhY2tDdHhfID0gY2FsbGJhY2tDdHg7XG4gIH1cbiAgLyoqXHJcbiAgICogU3RhcnRzIG9ic2VydmluZyBwcm92aWRlZCBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XG4gICAgfSAvLyBEbyBub3RoaW5nIGlmIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndCBoYXZlIHRoZSBFbGVtZW50IGludGVyZmFjZS5cblxuXG4gICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XG4gICAgfVxuXG4gICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXzsgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQuXG5cbiAgICBpZiAob2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2JzZXJ2YXRpb25zLnNldCh0YXJnZXQsIG5ldyBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpKTtcbiAgICB0aGlzLmNvbnRyb2xsZXJfLmFkZE9ic2VydmVyKHRoaXMpOyAvLyBGb3JjZSB0aGUgdXBkYXRlIG9mIG9ic2VydmF0aW9ucy5cblxuICAgIHRoaXMuY29udHJvbGxlcl8ucmVmcmVzaCgpO1xuICB9O1xuICAvKipcclxuICAgKiBTdG9wcyBvYnNlcnZpbmcgcHJvdmlkZWQgZWxlbWVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBzdG9wIG9ic2VydmluZy5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XG4gICAgfSAvLyBEbyBub3RoaW5nIGlmIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndCBoYXZlIHRoZSBFbGVtZW50IGludGVyZmFjZS5cblxuXG4gICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XG4gICAgfVxuXG4gICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXzsgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIG5vdCBiZWluZyBvYnNlcnZlZC5cblxuICAgIGlmICghb2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2JzZXJ2YXRpb25zLmRlbGV0ZSh0YXJnZXQpO1xuXG4gICAgaWYgKCFvYnNlcnZhdGlvbnMuc2l6ZSkge1xuICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFN0b3BzIG9ic2VydmluZyBhbGwgZWxlbWVudHMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICB0aGlzLm9ic2VydmF0aW9uc18uY2xlYXIoKTtcbiAgICB0aGlzLmNvbnRyb2xsZXJfLnJlbW92ZU9ic2VydmVyKHRoaXMpO1xuICB9O1xuICAvKipcclxuICAgKiBDb2xsZWN0cyBvYnNlcnZhdGlvbiBpbnN0YW5jZXMgdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBvZiB3aGljaCBoYXMgY2hhbmdlZFxyXG4gICAqIGl0J3MgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5nYXRoZXJBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICB0aGlzLm9ic2VydmF0aW9uc18uZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcbiAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIF90aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ucHVzaChvYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIEludm9rZXMgaW5pdGlhbCBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGEgbGlzdCBvZiBSZXNpemVPYnNlcnZlckVudHJ5XHJcbiAgICogaW5zdGFuY2VzIGNvbGxlY3RlZCBmcm9tIGFjdGl2ZSByZXNpemUgb2JzZXJ2YXRpb25zLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuYnJvYWRjYXN0QWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIERvIG5vdGhpbmcgaWYgb2JzZXJ2ZXIgZG9lc24ndCBoYXZlIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXG4gICAgaWYgKCF0aGlzLmhhc0FjdGl2ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGN0eCA9IHRoaXMuY2FsbGJhY2tDdHhfOyAvLyBDcmVhdGUgUmVzaXplT2JzZXJ2ZXJFbnRyeSBpbnN0YW5jZSBmb3IgZXZlcnkgYWN0aXZlIG9ic2VydmF0aW9uLlxuXG4gICAgdmFyIGVudHJpZXMgPSB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubWFwKGZ1bmN0aW9uIChvYnNlcnZhdGlvbikge1xuICAgICAgcmV0dXJuIG5ldyBSZXNpemVPYnNlcnZlckVudHJ5KG9ic2VydmF0aW9uLnRhcmdldCwgb2JzZXJ2YXRpb24uYnJvYWRjYXN0UmVjdCgpKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhbGxiYWNrXy5jYWxsKGN0eCwgZW50cmllcywgY3R4KTtcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENsZWFycyB0aGUgY29sbGVjdGlvbiBvZiBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuY2xlYXJBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLnNwbGljZSgwKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogVGVsbHMgd2hldGhlciBvYnNlcnZlciBoYXMgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmhhc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLmxlbmd0aCA+IDA7XG4gIH07XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyU1BJO1xufSgpOyAvLyBSZWdpc3RyeSBvZiBpbnRlcm5hbCBvYnNlcnZlcnMuIElmIFdlYWtNYXAgaXMgbm90IGF2YWlsYWJsZSB1c2UgY3VycmVudCBzaGltXG4vLyBmb3IgdGhlIE1hcCBjb2xsZWN0aW9uIGFzIGl0IGhhcyBhbGwgcmVxdWlyZWQgbWV0aG9kcyBhbmQgYmVjYXVzZSBXZWFrTWFwXG4vLyBjYW4ndCBiZSBmdWxseSBwb2x5ZmlsbGVkIGFueXdheS5cblxuXG52YXIgb2JzZXJ2ZXJzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnID8gbmV3IFdlYWtNYXAoKSA6IG5ldyBNYXBTaGltKCk7XG4vKipcclxuICogUmVzaXplT2JzZXJ2ZXIgQVBJLiBFbmNhcHN1bGF0ZXMgdGhlIFJlc2l6ZU9ic2VydmVyIFNQSSBpbXBsZW1lbnRhdGlvblxyXG4gKiBleHBvc2luZyBvbmx5IHRob3NlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc3BlYy5cclxuICovXG5cbnZhciBSZXNpemVPYnNlcnZlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW5cclxuICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIGVsZW1lbnRzIGNoYW5nZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRyb2xsZXIgPSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIG9ic2VydmVycy5zZXQodGhpcywgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xufSgpOyAvLyBFeHBvc2UgcHVibGljIG1ldGhvZHMgb2YgUmVzaXplT2JzZXJ2ZXIuXG5cblxuWydvYnNlcnZlJywgJ3Vub2JzZXJ2ZScsICdkaXNjb25uZWN0J10uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIFJlc2l6ZU9ic2VydmVyLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHJldHVybiAoX2EgPSBvYnNlcnZlcnMuZ2V0KHRoaXMpKVttZXRob2RdLmFwcGx5KF9hLCBhcmd1bWVudHMpO1xuICB9O1xufSk7XG5cbnZhciBpbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRXhwb3J0IGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZS5cbiAgaWYgKHR5cGVvZiBnbG9iYWwkMS5SZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsJDEuUmVzaXplT2JzZXJ2ZXI7XG4gIH1cblxuICByZXR1cm4gUmVzaXplT2JzZXJ2ZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGluZGV4OyIsInZhciB3aW5kb3dfID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWw7XG52YXIgZ2xvYmFsXyA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93O1xudmFyIGRvY3VtZW50XyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHt9O1xuZXhwb3J0IHsgd2luZG93XyBhcyB3aW5kb3csIGdsb2JhbF8gYXMgZ2xvYmFsLCBkb2N1bWVudF8gYXMgZG9jdW1lbnQgfTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChpdCkgbyA9IGl0O1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBvW2krK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiBlKF9lKSB7XG4gICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgICAgZGlkRXJyID0gZmFsc2UsXG4gICAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gcygpIHtcbiAgICAgIGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiBlKF9lMikge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IF9lMjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uIGYoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG52YXIgcmVmUHJvcHMgPSBbJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsICdtaW56b29tJywgJ21heHpvb20nLCAnZmlsdGVyJywgJ2xheW91dCddO1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlKHN0eWxlKSB7XG4gIGlmICghc3R5bGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG5cbiAgaWYgKHN0eWxlLnRvSlMpIHtcbiAgICBzdHlsZSA9IHN0eWxlLnRvSlMoKTtcbiAgfVxuXG4gIHZhciBsYXllckluZGV4ID0ge307XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN0eWxlLmxheWVycyksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgbGF5ZXIgPSBfc3RlcC52YWx1ZTtcbiAgICAgIGxheWVySW5kZXhbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICB2YXIgbGF5ZXJzID0gc3R5bGUubGF5ZXJzLm1hcChmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICB2YXIgbGF5ZXJSZWYgPSBsYXllckluZGV4W2xheWVyLnJlZl07XG4gICAgdmFyIG5vcm1hbGl6ZWRMYXllciA9IG51bGw7XG5cbiAgICBpZiAoJ2ludGVyYWN0aXZlJyBpbiBsYXllcikge1xuICAgICAgbm9ybWFsaXplZExheWVyID0gX29iamVjdFNwcmVhZCh7fSwgbGF5ZXIpO1xuICAgICAgZGVsZXRlIG5vcm1hbGl6ZWRMYXllci5pbnRlcmFjdGl2ZTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJSZWYpIHtcbiAgICAgIG5vcm1hbGl6ZWRMYXllciA9IG5vcm1hbGl6ZWRMYXllciB8fCBfb2JqZWN0U3ByZWFkKHt9LCBsYXllcik7XG4gICAgICBkZWxldGUgbm9ybWFsaXplZExheWVyLnJlZjtcblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyZWZQcm9wcyksXG4gICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBwcm9wTmFtZSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgIGlmIChwcm9wTmFtZSBpbiBsYXllclJlZikge1xuICAgICAgICAgICAgbm9ybWFsaXplZExheWVyW3Byb3BOYW1lXSA9IGxheWVyUmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkTGF5ZXIgfHwgbGF5ZXI7XG4gIH0pO1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgbGF5ZXJzOiBsYXllcnNcbiAgfSk7XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVN0eWxlIH0gZnJvbSAnLi4vdXRpbHMvc3R5bGUtdXRpbHMnO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IoZXZlbnQpIHtcbiAgaWYgKGV2ZW50KSB7XG4gICAgY29uc29sZS5lcnJvcihldmVudC5lcnJvcik7XG4gIH1cbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29udGFpbmVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICBnbDogUHJvcFR5cGVzLm9iamVjdCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IFByb3BUeXBlcy5zdHJpbmcsXG4gIG1hcGJveEFwaVVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgYXR0cmlidXRpb25Db250cm9sOiBQcm9wVHlwZXMuYm9vbCxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgcmV1c2VNYXBzOiBQcm9wVHlwZXMuYm9vbCxcbiAgdHJhbnNmb3JtUmVxdWVzdDogUHJvcFR5cGVzLmZ1bmMsXG4gIG1hcE9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG1hcFN0eWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIHByZXZlbnRTdHlsZURpZmZpbmc6IFByb3BUeXBlcy5ib29sLFxuICB2aXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgYXN5bmNSZW5kZXI6IFByb3BUeXBlcy5ib29sLFxuICBvbkxvYWQ6IFByb3BUeXBlcy5mdW5jLFxuICBvbkVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlcixcbiAgdmlld1N0YXRlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIsXG4gIGxhdGl0dWRlOiBQcm9wVHlwZXMubnVtYmVyLFxuICB6b29tOiBQcm9wVHlwZXMubnVtYmVyLFxuICBiZWFyaW5nOiBQcm9wVHlwZXMubnVtYmVyLFxuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcbiAgYWx0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXJcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb250YWluZXI6IGRvY3VtZW50LmJvZHksXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBnZXRBY2Nlc3NUb2tlbigpLFxuICBtYXBib3hBcGlVcmw6ICdodHRwczovL2FwaS5tYXBib3guY29tJyxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuICByZXVzZU1hcHM6IGZhbHNlLFxuICBtYXBPcHRpb25zOiB7fSxcbiAgbWFwU3R5bGU6ICdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY4JyxcbiAgcHJldmVudFN0eWxlRGlmZmluZzogZmFsc2UsXG4gIHZpc2libGU6IHRydWUsXG4gIGFzeW5jUmVuZGVyOiBmYWxzZSxcbiAgb25Mb2FkOiBub29wLFxuICBvbkVycm9yOiBkZWZhdWx0T25FcnJvcixcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgbG9uZ2l0dWRlOiAwLFxuICBsYXRpdHVkZTogMCxcbiAgem9vbTogMCxcbiAgYmVhcmluZzogMCxcbiAgcGl0Y2g6IDAsXG4gIGFsdGl0dWRlOiAxLjVcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oKSB7XG4gIHZhciBhY2Nlc3NUb2tlbiA9IG51bGw7XG5cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhdGlvbikge1xuICAgIHZhciBtYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXFwvXSopLyk7XG4gICAgYWNjZXNzVG9rZW4gPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgfVxuXG4gIGlmICghYWNjZXNzVG9rZW4gJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbiB8fCBwcm9jZXNzLmVudi5NYXBib3hBY2Nlc3NUb2tlbiB8fCBwcm9jZXNzLmVudi5SRUFDVF9BUFBfTUFQQk9YX0FDQ0VTU19UT0tFTjtcbiAgfVxuXG4gIHJldHVybiBhY2Nlc3NUb2tlbiB8fCAnbm8tdG9rZW4nO1xufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyhwcm9wcykge1xuICB2YXIgY29tcG9uZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnY29tcG9uZW50JztcblxuICBpZiAocHJvcHMuZGVidWcpIHtcbiAgICBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBwcm9wcywgJ3Byb3AnLCBjb21wb25lbnQpO1xuICB9XG59XG5cbnZhciBNYXBib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcGJveChwcm9wcykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFwYm94KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInByb3BzXCIsIGRlZmF1bHRQcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ3aWR0aFwiLCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhlaWdodFwiLCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9maXJlTG9hZEV2ZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnByb3BzLm9uTG9hZCh7XG4gICAgICAgIHR5cGU6ICdsb2FkJyxcbiAgICAgICAgdGFyZ2V0OiBfdGhpcy5fbWFwXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICghcHJvcHMubWFwYm94Z2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWFwYm94IG5vdCBhdmFpbGFibGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcGJveGdsID0gcHJvcHMubWFwYm94Z2w7XG5cbiAgICBpZiAoIU1hcGJveC5pbml0aWFsaXplZCkge1xuICAgICAgTWFwYm94LmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fY2hlY2tTdHlsZVNoZWV0KHRoaXMubWFwYm94Z2wudmVyc2lvbik7XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZShwcm9wcyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWFwYm94LCBbe1xuICAgIGtleTogXCJmaW5hbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5hbGl6ZSgpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3koKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFByb3BzKHByb3BzKSB7XG4gICAgICB0aGlzLl91cGRhdGUodGhpcy5wcm9wcywgcHJvcHMpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVkcmF3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgIGlmIChtYXAuc3R5bGUpIHtcbiAgICAgICAgaWYgKG1hcC5fZnJhbWUpIHtcbiAgICAgICAgICBtYXAuX2ZyYW1lLmNhbmNlbCgpO1xuXG4gICAgICAgICAgbWFwLl9mcmFtZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuX3JlbmRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWFwKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3JldXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXVzZShwcm9wcykge1xuICAgICAgdGhpcy5fbWFwID0gTWFwYm94LnNhdmVkTWFwO1xuXG4gICAgICB2YXIgb2xkQ29udGFpbmVyID0gdGhpcy5fbWFwLmdldENvbnRhaW5lcigpO1xuXG4gICAgICB2YXIgbmV3Q29udGFpbmVyID0gcHJvcHMuY29udGFpbmVyO1xuICAgICAgbmV3Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLW1hcCcpO1xuXG4gICAgICB3aGlsZSAob2xkQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdDb250YWluZXIuYXBwZW5kQ2hpbGQob2xkQ29udGFpbmVyLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tYXAuX2NvbnRhaW5lciA9IG5ld0NvbnRhaW5lcjtcbiAgICAgIE1hcGJveC5zYXZlZE1hcCA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wcy5tYXBTdHlsZSkge1xuICAgICAgICB0aGlzLl9tYXAuc2V0U3R5bGUobm9ybWFsaXplU3R5bGUocHJvcHMubWFwU3R5bGUpLCB7XG4gICAgICAgICAgZGlmZjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9tYXAuaXNTdHlsZUxvYWRlZCgpKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVMb2FkRXZlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX21hcC5vbmNlKCdzdHlsZWRhdGEnLCB0aGlzLl9maXJlTG9hZEV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY3JlYXRlKHByb3BzKSB7XG4gICAgICBpZiAocHJvcHMucmV1c2VNYXBzICYmIE1hcGJveC5zYXZlZE1hcCkge1xuICAgICAgICB0aGlzLl9yZXVzZShwcm9wcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvcHMuZ2wpIHtcbiAgICAgICAgICB2YXIgZ2V0Q29udGV4dCA9IEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS5nZXRDb250ZXh0O1xuXG4gICAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBIVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29udGV4dCA9IGdldENvbnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZ2w7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXBPcHRpb25zID0ge1xuICAgICAgICAgIGNvbnRhaW5lcjogcHJvcHMuY29udGFpbmVyLFxuICAgICAgICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAgICAgIHpvb206IDgsXG4gICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgYmVhcmluZzogMCxcbiAgICAgICAgICBtYXhab29tOiAyNCxcbiAgICAgICAgICBzdHlsZTogbm9ybWFsaXplU3R5bGUocHJvcHMubWFwU3R5bGUpLFxuICAgICAgICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICB0cmFja1Jlc2l6ZTogZmFsc2UsXG4gICAgICAgICAgYXR0cmlidXRpb25Db250cm9sOiBwcm9wcy5hdHRyaWJ1dGlvbkNvbnRyb2wsXG4gICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBwcm9wcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocHJvcHMudHJhbnNmb3JtUmVxdWVzdCkge1xuICAgICAgICAgIG1hcE9wdGlvbnMudHJhbnNmb3JtUmVxdWVzdCA9IHByb3BzLnRyYW5zZm9ybVJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgdGhpcy5tYXBib3hnbC5NYXAoT2JqZWN0LmFzc2lnbih7fSwgbWFwT3B0aW9ucywgcHJvcHMubWFwT3B0aW9ucykpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbmNlKCdsb2FkJywgcHJvcHMub25Mb2FkKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ2Vycm9yJywgcHJvcHMub25FcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVzdHJveSgpIHtcbiAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFNYXBib3guc2F2ZWRNYXApIHtcbiAgICAgICAgTWFwYm94LnNhdmVkTWFwID0gdGhpcy5fbWFwO1xuXG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ2xvYWQnLCB0aGlzLnByb3BzLm9uTG9hZCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignZXJyb3InLCB0aGlzLnByb3BzLm9uRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3N0eWxlZGF0YScsIHRoaXMuX2ZpcmVMb2FkRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdGlhbGl6ZShwcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFByb3BzLCBwcm9wcyk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wcywgJ01hcGJveCcpO1xuICAgICAgdGhpcy5tYXBib3hnbC5hY2Nlc3NUb2tlbiA9IHByb3BzLm1hcGJveEFwaUFjY2Vzc1Rva2VuIHx8IGRlZmF1bHRQcm9wcy5tYXBib3hBcGlBY2Nlc3NUb2tlbjtcbiAgICAgIHRoaXMubWFwYm94Z2wuYmFzZUFwaVVybCA9IHByb3BzLm1hcGJveEFwaVVybDtcblxuICAgICAgdGhpcy5fY3JlYXRlKHByb3BzKTtcblxuICAgICAgdmFyIF9wcm9wcyA9IHByb3BzLFxuICAgICAgICAgIGNvbnRhaW5lciA9IF9wcm9wcy5jb250YWluZXI7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAnb2Zmc2V0V2lkdGgnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIud2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgJ2NsaWVudFdpZHRoJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLndpZHRoO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICdvZmZzZXRIZWlnaHQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICdjbGllbnRIZWlnaHQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX21hcC5nZXRDYW52YXMoKTtcblxuICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICBjYW52YXMuc3R5bGUub3V0bGluZSA9ICdub25lJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlTWFwVmlld3BvcnQoe30sIHByb3BzKTtcblxuICAgICAgdGhpcy5fdXBkYXRlTWFwU2l6ZSh7fSwgcHJvcHMpO1xuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV3UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCBuZXdQcm9wcyk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhuZXdQcm9wcywgJ01hcGJveCcpO1xuXG4gICAgICB2YXIgdmlld3BvcnRDaGFuZ2VkID0gdGhpcy5fdXBkYXRlTWFwVmlld3BvcnQob2xkUHJvcHMsIG5ld1Byb3BzKTtcblxuICAgICAgdmFyIHNpemVDaGFuZ2VkID0gdGhpcy5fdXBkYXRlTWFwU2l6ZShvbGRQcm9wcywgbmV3UHJvcHMpO1xuXG4gICAgICB0aGlzLl91cGRhdGVNYXBTdHlsZShvbGRQcm9wcywgbmV3UHJvcHMpO1xuXG4gICAgICBpZiAoIW5ld1Byb3BzLmFzeW5jUmVuZGVyICYmICh2aWV3cG9ydENoYW5nZWQgfHwgc2l6ZUNoYW5nZWQpKSB7XG4gICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvcHMgPSBuZXdQcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZU1hcFN0eWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVNYXBTdHlsZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBzdHlsZUNoYW5nZWQgPSBvbGRQcm9wcy5tYXBTdHlsZSAhPT0gbmV3UHJvcHMubWFwU3R5bGU7XG5cbiAgICAgIGlmIChzdHlsZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5fbWFwLnNldFN0eWxlKG5vcm1hbGl6ZVN0eWxlKG5ld1Byb3BzLm1hcFN0eWxlKSwge1xuICAgICAgICAgIGRpZmY6ICFuZXdQcm9wcy5wcmV2ZW50U3R5bGVEaWZmaW5nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlTWFwU2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWFwU2l6ZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBzaXplQ2hhbmdlZCA9IG9sZFByb3BzLndpZHRoICE9PSBuZXdQcm9wcy53aWR0aCB8fCBvbGRQcm9wcy5oZWlnaHQgIT09IG5ld1Byb3BzLmhlaWdodDtcblxuICAgICAgaWYgKHNpemVDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSBuZXdQcm9wcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBuZXdQcm9wcy5oZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5fbWFwLnJlc2l6ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2l6ZUNoYW5nZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVNYXBWaWV3cG9ydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWFwVmlld3BvcnQob2xkUHJvcHMsIG5ld1Byb3BzKSB7XG4gICAgICB2YXIgb2xkVmlld1N0YXRlID0gdGhpcy5fZ2V0Vmlld1N0YXRlKG9sZFByb3BzKTtcblxuICAgICAgdmFyIG5ld1ZpZXdTdGF0ZSA9IHRoaXMuX2dldFZpZXdTdGF0ZShuZXdQcm9wcyk7XG5cbiAgICAgIHZhciB2aWV3cG9ydENoYW5nZWQgPSBuZXdWaWV3U3RhdGUubGF0aXR1ZGUgIT09IG9sZFZpZXdTdGF0ZS5sYXRpdHVkZSB8fCBuZXdWaWV3U3RhdGUubG9uZ2l0dWRlICE9PSBvbGRWaWV3U3RhdGUubG9uZ2l0dWRlIHx8IG5ld1ZpZXdTdGF0ZS56b29tICE9PSBvbGRWaWV3U3RhdGUuem9vbSB8fCBuZXdWaWV3U3RhdGUucGl0Y2ggIT09IG9sZFZpZXdTdGF0ZS5waXRjaCB8fCBuZXdWaWV3U3RhdGUuYmVhcmluZyAhPT0gb2xkVmlld1N0YXRlLmJlYXJpbmcgfHwgbmV3Vmlld1N0YXRlLmFsdGl0dWRlICE9PSBvbGRWaWV3U3RhdGUuYWx0aXR1ZGU7XG5cbiAgICAgIGlmICh2aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh0aGlzLl92aWV3U3RhdGVUb01hcGJveFByb3BzKG5ld1ZpZXdTdGF0ZSkpO1xuXG4gICAgICAgIGlmIChuZXdWaWV3U3RhdGUuYWx0aXR1ZGUgIT09IG9sZFZpZXdTdGF0ZS5hbHRpdHVkZSkge1xuICAgICAgICAgIHRoaXMuX21hcC50cmFuc2Zvcm0uYWx0aXR1ZGUgPSBuZXdWaWV3U3RhdGUuYWx0aXR1ZGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0Q2hhbmdlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFZpZXdTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0Vmlld1N0YXRlKHByb3BzKSB7XG4gICAgICB2YXIgX3JlZiA9IHByb3BzLnZpZXdTdGF0ZSB8fCBwcm9wcyxcbiAgICAgICAgICBsb25naXR1ZGUgPSBfcmVmLmxvbmdpdHVkZSxcbiAgICAgICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICAgICAgem9vbSA9IF9yZWYuem9vbSxcbiAgICAgICAgICBfcmVmJHBpdGNoID0gX3JlZi5waXRjaCxcbiAgICAgICAgICBwaXRjaCA9IF9yZWYkcGl0Y2ggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHBpdGNoLFxuICAgICAgICAgIF9yZWYkYmVhcmluZyA9IF9yZWYuYmVhcmluZyxcbiAgICAgICAgICBiZWFyaW5nID0gX3JlZiRiZWFyaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRiZWFyaW5nLFxuICAgICAgICAgIF9yZWYkYWx0aXR1ZGUgPSBfcmVmLmFsdGl0dWRlLFxuICAgICAgICAgIGFsdGl0dWRlID0gX3JlZiRhbHRpdHVkZSA9PT0gdm9pZCAwID8gMS41IDogX3JlZiRhbHRpdHVkZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICBiZWFyaW5nOiBiZWFyaW5nLFxuICAgICAgICBhbHRpdHVkZTogYWx0aXR1ZGVcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jaGVja1N0eWxlU2hlZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NoZWNrU3R5bGVTaGVldCgpIHtcbiAgICAgIHZhciBtYXBib3hWZXJzaW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnMC40Ny4wJztcblxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVzdEVsZW1lbnQuY2xhc3NOYW1lID0gJ21hcGJveGdsLW1hcCc7XG4gICAgICAgIHRlc3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdEVsZW1lbnQpO1xuICAgICAgICB2YXIgaXNDc3NMb2FkZWQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZXN0RWxlbWVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnO1xuXG4gICAgICAgIGlmICghaXNDc3NMb2FkZWQpIHtcbiAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgXCJodHRwczovL2FwaS50aWxlcy5tYXBib3guY29tL21hcGJveC1nbC1qcy92XCIuY29uY2F0KG1hcGJveFZlcnNpb24sIFwiL21hcGJveC1nbC5jc3NcIikpO1xuICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdmlld1N0YXRlVG9NYXBib3hQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdmlld1N0YXRlVG9NYXBib3hQcm9wcyh2aWV3U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNlbnRlcjogW3ZpZXdTdGF0ZS5sb25naXR1ZGUsIHZpZXdTdGF0ZS5sYXRpdHVkZV0sXG4gICAgICAgIHpvb206IHZpZXdTdGF0ZS56b29tLFxuICAgICAgICBiZWFyaW5nOiB2aWV3U3RhdGUuYmVhcmluZyxcbiAgICAgICAgcGl0Y2g6IHZpZXdTdGF0ZS5waXRjaFxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFwYm94O1xufSgpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWFwYm94LCBcImluaXRpYWxpemVkXCIsIGZhbHNlKTtcblxuX2RlZmluZVByb3BlcnR5KE1hcGJveCwgXCJwcm9wVHlwZXNcIiwgcHJvcFR5cGVzKTtcblxuX2RlZmluZVByb3BlcnR5KE1hcGJveCwgXCJkZWZhdWx0UHJvcHNcIiwgZGVmYXVsdFByb3BzKTtcblxuX2RlZmluZVByb3BlcnR5KE1hcGJveCwgXCJzYXZlZE1hcFwiLCBudWxsKTtcblxuZXhwb3J0IHsgTWFwYm94IGFzIGRlZmF1bHQgfTsiLCJ2YXIgRVBTSUxPTiA9IDFlLTc7XG5cbmZ1bmN0aW9uIGlzQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICghZXF1YWxzKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gRVBTSUxPTjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAoYSwgYiwgdCkge1xuICBpZiAoaXNBcnJheShhKSkge1xuICAgIHJldHVybiBhLm1hcChmdW5jdGlvbiAoYWksIGkpIHtcbiAgICAgIHJldHVybiBsZXJwKGFpLCBiW2ldLCB0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0ICogYiArICgxIC0gdCkgKiBhO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCAncmVhY3QtbWFwLWdsOiBhc3NlcnRpb24gZmFpbGVkLicpO1xuICB9XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQsIHsgbm9ybWFsaXplVmlld3BvcnRQcm9wcyB9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuL2Fzc2VydCc7XG5leHBvcnQgdmFyIE1BUEJPWF9MSU1JVFMgPSB7XG4gIG1pblpvb206IDAsXG4gIG1heFpvb206IDI0LFxuICBtaW5QaXRjaDogMCxcbiAgbWF4UGl0Y2g6IDg1XG59O1xudmFyIERFRkFVTFRfU1RBVEUgPSB7XG4gIHBpdGNoOiAwLFxuICBiZWFyaW5nOiAwLFxuICBhbHRpdHVkZTogMS41XG59O1xudmFyIFBJVENIX01PVVNFX1RIUkVTSE9MRCA9IDU7XG52YXIgUElUQ0hfQUNDRUwgPSAxLjI7XG5cbnZhciBNYXBTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFwU3RhdGUoX3JlZikge1xuICAgIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGUsXG4gICAgICAgIGxvbmdpdHVkZSA9IF9yZWYubG9uZ2l0dWRlLFxuICAgICAgICB6b29tID0gX3JlZi56b29tLFxuICAgICAgICBfcmVmJGJlYXJpbmcgPSBfcmVmLmJlYXJpbmcsXG4gICAgICAgIGJlYXJpbmcgPSBfcmVmJGJlYXJpbmcgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RBVEUuYmVhcmluZyA6IF9yZWYkYmVhcmluZyxcbiAgICAgICAgX3JlZiRwaXRjaCA9IF9yZWYucGl0Y2gsXG4gICAgICAgIHBpdGNoID0gX3JlZiRwaXRjaCA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEFURS5waXRjaCA6IF9yZWYkcGl0Y2gsXG4gICAgICAgIF9yZWYkYWx0aXR1ZGUgPSBfcmVmLmFsdGl0dWRlLFxuICAgICAgICBhbHRpdHVkZSA9IF9yZWYkYWx0aXR1ZGUgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RBVEUuYWx0aXR1ZGUgOiBfcmVmJGFsdGl0dWRlLFxuICAgICAgICBfcmVmJG1heFpvb20gPSBfcmVmLm1heFpvb20sXG4gICAgICAgIG1heFpvb20gPSBfcmVmJG1heFpvb20gPT09IHZvaWQgMCA/IE1BUEJPWF9MSU1JVFMubWF4Wm9vbSA6IF9yZWYkbWF4Wm9vbSxcbiAgICAgICAgX3JlZiRtaW5ab29tID0gX3JlZi5taW5ab29tLFxuICAgICAgICBtaW5ab29tID0gX3JlZiRtaW5ab29tID09PSB2b2lkIDAgPyBNQVBCT1hfTElNSVRTLm1pblpvb20gOiBfcmVmJG1pblpvb20sXG4gICAgICAgIF9yZWYkbWF4UGl0Y2ggPSBfcmVmLm1heFBpdGNoLFxuICAgICAgICBtYXhQaXRjaCA9IF9yZWYkbWF4UGl0Y2ggPT09IHZvaWQgMCA/IE1BUEJPWF9MSU1JVFMubWF4UGl0Y2ggOiBfcmVmJG1heFBpdGNoLFxuICAgICAgICBfcmVmJG1pblBpdGNoID0gX3JlZi5taW5QaXRjaCxcbiAgICAgICAgbWluUGl0Y2ggPSBfcmVmJG1pblBpdGNoID09PSB2b2lkIDAgPyBNQVBCT1hfTElNSVRTLm1pblBpdGNoIDogX3JlZiRtaW5QaXRjaCxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gX3JlZi50cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgIHRyYW5zaXRpb25FYXNpbmcgPSBfcmVmLnRyYW5zaXRpb25FYXNpbmcsXG4gICAgICAgIHRyYW5zaXRpb25JbnRlcnBvbGF0b3IgPSBfcmVmLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IsXG4gICAgICAgIHRyYW5zaXRpb25JbnRlcnJ1cHRpb24gPSBfcmVmLnRyYW5zaXRpb25JbnRlcnJ1cHRpb24sXG4gICAgICAgIHN0YXJ0UGFuTG5nTGF0ID0gX3JlZi5zdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgc3RhcnRab29tTG5nTGF0ID0gX3JlZi5zdGFydFpvb21MbmdMYXQsXG4gICAgICAgIHN0YXJ0Um90YXRlUG9zID0gX3JlZi5zdGFydFJvdGF0ZVBvcyxcbiAgICAgICAgc3RhcnRCZWFyaW5nID0gX3JlZi5zdGFydEJlYXJpbmcsXG4gICAgICAgIHN0YXJ0UGl0Y2ggPSBfcmVmLnN0YXJ0UGl0Y2gsXG4gICAgICAgIHN0YXJ0Wm9vbSA9IF9yZWYuc3RhcnRab29tO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcFN0YXRlKTtcblxuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUod2lkdGgpLCAnYHdpZHRoYCBtdXN0IGJlIHN1cHBsaWVkJyk7XG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShoZWlnaHQpLCAnYGhlaWdodGAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUobG9uZ2l0dWRlKSwgJ2Bsb25naXR1ZGVgIG11c3QgYmUgc3VwcGxpZWQnKTtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxhdGl0dWRlKSwgJ2BsYXRpdHVkZWAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoem9vbSksICdgem9vbWAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIHRoaXMuX3ZpZXdwb3J0UHJvcHMgPSB0aGlzLl9hcHBseUNvbnN0cmFpbnRzKHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICB6b29tOiB6b29tLFxuICAgICAgYmVhcmluZzogYmVhcmluZyxcbiAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgIGFsdGl0dWRlOiBhbHRpdHVkZSxcbiAgICAgIG1heFpvb206IG1heFpvb20sXG4gICAgICBtaW5ab29tOiBtaW5ab29tLFxuICAgICAgbWF4UGl0Y2g6IG1heFBpdGNoLFxuICAgICAgbWluUGl0Y2g6IG1pblBpdGNoLFxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICB0cmFuc2l0aW9uRWFzaW5nOiB0cmFuc2l0aW9uRWFzaW5nLFxuICAgICAgdHJhbnNpdGlvbkludGVycG9sYXRvcjogdHJhbnNpdGlvbkludGVycG9sYXRvcixcbiAgICAgIHRyYW5zaXRpb25JbnRlcnJ1cHRpb246IHRyYW5zaXRpb25JbnRlcnJ1cHRpb25cbiAgICB9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHtcbiAgICAgIHN0YXJ0UGFuTG5nTGF0OiBzdGFydFBhbkxuZ0xhdCxcbiAgICAgIHN0YXJ0Wm9vbUxuZ0xhdDogc3RhcnRab29tTG5nTGF0LFxuICAgICAgc3RhcnRSb3RhdGVQb3M6IHN0YXJ0Um90YXRlUG9zLFxuICAgICAgc3RhcnRCZWFyaW5nOiBzdGFydEJlYXJpbmcsXG4gICAgICBzdGFydFBpdGNoOiBzdGFydFBpdGNoLFxuICAgICAgc3RhcnRab29tOiBzdGFydFpvb21cbiAgICB9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcFN0YXRlLCBbe1xuICAgIGtleTogXCJnZXRWaWV3cG9ydFByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZpZXdwb3J0UHJvcHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRQcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhblN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhblN0YXJ0KF9yZWYyKSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjIucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0UGFuTG5nTGF0OiB0aGlzLl91bnByb2plY3QocG9zKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYW4oX3JlZjMpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmMy5wb3MsXG4gICAgICAgICAgc3RhcnRQb3MgPSBfcmVmMy5zdGFydFBvcztcblxuICAgICAgdmFyIHN0YXJ0UGFuTG5nTGF0ID0gdGhpcy5fc3RhdGUuc3RhcnRQYW5MbmdMYXQgfHwgdGhpcy5fdW5wcm9qZWN0KHN0YXJ0UG9zKTtcblxuICAgICAgaWYgKCFzdGFydFBhbkxuZ0xhdCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJF9jYWxjdWxhdGVOZXdMbiA9IHRoaXMuX2NhbGN1bGF0ZU5ld0xuZ0xhdCh7XG4gICAgICAgIHN0YXJ0UGFuTG5nTGF0OiBzdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pLFxuICAgICAgICAgIF90aGlzJF9jYWxjdWxhdGVOZXdMbjIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRfY2FsY3VsYXRlTmV3TG4sIDIpLFxuICAgICAgICAgIGxvbmdpdHVkZSA9IF90aGlzJF9jYWxjdWxhdGVOZXdMbjJbMF0sXG4gICAgICAgICAgbGF0aXR1ZGUgPSBfdGhpcyRfY2FsY3VsYXRlTmV3TG4yWzFdO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhbkVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYW5FbmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgc3RhcnRQYW5MbmdMYXQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyb3RhdGVTdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByb3RhdGVTdGFydChfcmVmNCkge1xuICAgICAgdmFyIHBvcyA9IF9yZWY0LnBvcztcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydFJvdGF0ZVBvczogcG9zLFxuICAgICAgICBzdGFydEJlYXJpbmc6IHRoaXMuX3ZpZXdwb3J0UHJvcHMuYmVhcmluZyxcbiAgICAgICAgc3RhcnRQaXRjaDogdGhpcy5fdmlld3BvcnRQcm9wcy5waXRjaFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJvdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByb3RhdGUoX3JlZjUpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmNS5wb3MsXG4gICAgICAgICAgX3JlZjUkZGVsdGFBbmdsZVggPSBfcmVmNS5kZWx0YUFuZ2xlWCxcbiAgICAgICAgICBkZWx0YUFuZ2xlWCA9IF9yZWY1JGRlbHRhQW5nbGVYID09PSB2b2lkIDAgPyAwIDogX3JlZjUkZGVsdGFBbmdsZVgsXG4gICAgICAgICAgX3JlZjUkZGVsdGFBbmdsZVkgPSBfcmVmNS5kZWx0YUFuZ2xlWSxcbiAgICAgICAgICBkZWx0YUFuZ2xlWSA9IF9yZWY1JGRlbHRhQW5nbGVZID09PSB2b2lkIDAgPyAwIDogX3JlZjUkZGVsdGFBbmdsZVk7XG4gICAgICB2YXIgX3RoaXMkX3N0YXRlID0gdGhpcy5fc3RhdGUsXG4gICAgICAgICAgc3RhcnRSb3RhdGVQb3MgPSBfdGhpcyRfc3RhdGUuc3RhcnRSb3RhdGVQb3MsXG4gICAgICAgICAgc3RhcnRCZWFyaW5nID0gX3RoaXMkX3N0YXRlLnN0YXJ0QmVhcmluZyxcbiAgICAgICAgICBzdGFydFBpdGNoID0gX3RoaXMkX3N0YXRlLnN0YXJ0UGl0Y2g7XG5cbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHN0YXJ0QmVhcmluZykgfHwgIU51bWJlci5pc0Zpbml0ZShzdGFydFBpdGNoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld1JvdGF0aW9uO1xuXG4gICAgICBpZiAocG9zKSB7XG4gICAgICAgIG5ld1JvdGF0aW9uID0gdGhpcy5fY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5fZ2V0Um90YXRpb25QYXJhbXMocG9zLCBzdGFydFJvdGF0ZVBvcykpLCB7fSwge1xuICAgICAgICAgIHN0YXJ0QmVhcmluZzogc3RhcnRCZWFyaW5nLFxuICAgICAgICAgIHN0YXJ0UGl0Y2g6IHN0YXJ0UGl0Y2hcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Um90YXRpb24gPSB7XG4gICAgICAgICAgYmVhcmluZzogc3RhcnRCZWFyaW5nICsgZGVsdGFBbmdsZVgsXG4gICAgICAgICAgcGl0Y2g6IHN0YXJ0UGl0Y2ggKyBkZWx0YUFuZ2xlWVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKG5ld1JvdGF0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicm90YXRlRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJvdGF0ZUVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydEJlYXJpbmc6IG51bGwsXG4gICAgICAgIHN0YXJ0UGl0Y2g6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ6b29tU3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gem9vbVN0YXJ0KF9yZWY2KSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjYucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0Wm9vbUxuZ0xhdDogdGhpcy5fdW5wcm9qZWN0KHBvcyksXG4gICAgICAgIHN0YXJ0Wm9vbTogdGhpcy5fdmlld3BvcnRQcm9wcy56b29tXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiem9vbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB6b29tKF9yZWY3KSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjcucG9zLFxuICAgICAgICAgIHN0YXJ0UG9zID0gX3JlZjcuc3RhcnRQb3MsXG4gICAgICAgICAgc2NhbGUgPSBfcmVmNy5zY2FsZTtcbiAgICAgIGFzc2VydChzY2FsZSA+IDAsICdgc2NhbGVgIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgICAgIHZhciBfdGhpcyRfc3RhdGUyID0gdGhpcy5fc3RhdGUsXG4gICAgICAgICAgc3RhcnRab29tID0gX3RoaXMkX3N0YXRlMi5zdGFydFpvb20sXG4gICAgICAgICAgc3RhcnRab29tTG5nTGF0ID0gX3RoaXMkX3N0YXRlMi5zdGFydFpvb21MbmdMYXQ7XG5cbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHN0YXJ0Wm9vbSkpIHtcbiAgICAgICAgc3RhcnRab29tID0gdGhpcy5fdmlld3BvcnRQcm9wcy56b29tO1xuICAgICAgICBzdGFydFpvb21MbmdMYXQgPSB0aGlzLl91bnByb2plY3Qoc3RhcnRQb3MpIHx8IHRoaXMuX3VucHJvamVjdChwb3MpO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQoc3RhcnRab29tTG5nTGF0LCAnYHN0YXJ0Wm9vbUxuZ0xhdGAgcHJvcCBpcyByZXF1aXJlZCAnICsgJ2ZvciB6b29tIGJlaGF2aW9yIHRvIGNhbGN1bGF0ZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUgbWFwLicpO1xuXG4gICAgICB2YXIgem9vbSA9IHRoaXMuX2NhbGN1bGF0ZU5ld1pvb20oe1xuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIHN0YXJ0Wm9vbTogc3RhcnRab29tIHx8IDBcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgem9vbWVkVmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChPYmplY3QuYXNzaWduKHt9LCB0aGlzLl92aWV3cG9ydFByb3BzLCB7XG4gICAgICAgIHpvb206IHpvb21cbiAgICAgIH0pKTtcblxuICAgICAgdmFyIF96b29tZWRWaWV3cG9ydCRnZXRNYSA9IHpvb21lZFZpZXdwb3J0LmdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oe1xuICAgICAgICBsbmdMYXQ6IHN0YXJ0Wm9vbUxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pLFxuICAgICAgICAgIF96b29tZWRWaWV3cG9ydCRnZXRNYTIgPSBfc2xpY2VkVG9BcnJheShfem9vbWVkVmlld3BvcnQkZ2V0TWEsIDIpLFxuICAgICAgICAgIGxvbmdpdHVkZSA9IF96b29tZWRWaWV3cG9ydCRnZXRNYTJbMF0sXG4gICAgICAgICAgbGF0aXR1ZGUgPSBfem9vbWVkVmlld3BvcnQkZ2V0TWEyWzFdO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInpvb21FbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gem9vbUVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydFpvb21MbmdMYXQ6IG51bGwsXG4gICAgICAgIHN0YXJ0Wm9vbTogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRVcGRhdGVkTWFwU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFVwZGF0ZWRNYXBTdGF0ZShuZXdQcm9wcykge1xuICAgICAgcmV0dXJuIG5ldyBNYXBTdGF0ZShPYmplY3QuYXNzaWduKHt9LCB0aGlzLl92aWV3cG9ydFByb3BzLCB0aGlzLl9zdGF0ZSwgbmV3UHJvcHMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2FwcGx5Q29uc3RyYWludHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FwcGx5Q29uc3RyYWludHMocHJvcHMpIHtcbiAgICAgIHZhciBtYXhab29tID0gcHJvcHMubWF4Wm9vbSxcbiAgICAgICAgICBtaW5ab29tID0gcHJvcHMubWluWm9vbSxcbiAgICAgICAgICB6b29tID0gcHJvcHMuem9vbTtcbiAgICAgIHByb3BzLnpvb20gPSBjbGFtcCh6b29tLCBtaW5ab29tLCBtYXhab29tKTtcbiAgICAgIHZhciBtYXhQaXRjaCA9IHByb3BzLm1heFBpdGNoLFxuICAgICAgICAgIG1pblBpdGNoID0gcHJvcHMubWluUGl0Y2gsXG4gICAgICAgICAgcGl0Y2ggPSBwcm9wcy5waXRjaDtcbiAgICAgIHByb3BzLnBpdGNoID0gY2xhbXAocGl0Y2gsIG1pblBpdGNoLCBtYXhQaXRjaCk7XG4gICAgICBPYmplY3QuYXNzaWduKHByb3BzLCBub3JtYWxpemVWaWV3cG9ydFByb3BzKHByb3BzKSk7XG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91bnByb2plY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VucHJvamVjdChwb3MpIHtcbiAgICAgIHZhciB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHRoaXMuX3ZpZXdwb3J0UHJvcHMpO1xuICAgICAgcmV0dXJuIHBvcyAmJiB2aWV3cG9ydC51bnByb2plY3QocG9zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NhbGN1bGF0ZU5ld0xuZ0xhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3TG5nTGF0KF9yZWY4KSB7XG4gICAgICB2YXIgc3RhcnRQYW5MbmdMYXQgPSBfcmVmOC5zdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgICBwb3MgPSBfcmVmOC5wb3M7XG4gICAgICB2YXIgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh0aGlzLl92aWV3cG9ydFByb3BzKTtcbiAgICAgIHJldHVybiB2aWV3cG9ydC5nZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uKHtcbiAgICAgICAgbG5nTGF0OiBzdGFydFBhbkxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2FsY3VsYXRlTmV3Wm9vbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3Wm9vbShfcmVmOSkge1xuICAgICAgdmFyIHNjYWxlID0gX3JlZjkuc2NhbGUsXG4gICAgICAgICAgc3RhcnRab29tID0gX3JlZjkuc3RhcnRab29tO1xuICAgICAgdmFyIF90aGlzJF92aWV3cG9ydFByb3BzID0gdGhpcy5fdmlld3BvcnRQcm9wcyxcbiAgICAgICAgICBtYXhab29tID0gX3RoaXMkX3ZpZXdwb3J0UHJvcHMubWF4Wm9vbSxcbiAgICAgICAgICBtaW5ab29tID0gX3RoaXMkX3ZpZXdwb3J0UHJvcHMubWluWm9vbTtcbiAgICAgIHZhciB6b29tID0gc3RhcnRab29tICsgTWF0aC5sb2cyKHNjYWxlKTtcbiAgICAgIHJldHVybiBjbGFtcCh6b29tLCBtaW5ab29tLCBtYXhab29tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NhbGN1bGF0ZU5ld1BpdGNoQW5kQmVhcmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nKF9yZWYxMCkge1xuICAgICAgdmFyIGRlbHRhU2NhbGVYID0gX3JlZjEwLmRlbHRhU2NhbGVYLFxuICAgICAgICAgIGRlbHRhU2NhbGVZID0gX3JlZjEwLmRlbHRhU2NhbGVZLFxuICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IF9yZWYxMC5zdGFydEJlYXJpbmcsXG4gICAgICAgICAgc3RhcnRQaXRjaCA9IF9yZWYxMC5zdGFydFBpdGNoO1xuICAgICAgZGVsdGFTY2FsZVkgPSBjbGFtcChkZWx0YVNjYWxlWSwgLTEsIDEpO1xuICAgICAgdmFyIF90aGlzJF92aWV3cG9ydFByb3BzMiA9IHRoaXMuX3ZpZXdwb3J0UHJvcHMsXG4gICAgICAgICAgbWluUGl0Y2ggPSBfdGhpcyRfdmlld3BvcnRQcm9wczIubWluUGl0Y2gsXG4gICAgICAgICAgbWF4UGl0Y2ggPSBfdGhpcyRfdmlld3BvcnRQcm9wczIubWF4UGl0Y2g7XG4gICAgICB2YXIgYmVhcmluZyA9IHN0YXJ0QmVhcmluZyArIDE4MCAqIGRlbHRhU2NhbGVYO1xuICAgICAgdmFyIHBpdGNoID0gc3RhcnRQaXRjaDtcblxuICAgICAgaWYgKGRlbHRhU2NhbGVZID4gMCkge1xuICAgICAgICBwaXRjaCA9IHN0YXJ0UGl0Y2ggKyBkZWx0YVNjYWxlWSAqIChtYXhQaXRjaCAtIHN0YXJ0UGl0Y2gpO1xuICAgICAgfSBlbHNlIGlmIChkZWx0YVNjYWxlWSA8IDApIHtcbiAgICAgICAgcGl0Y2ggPSBzdGFydFBpdGNoIC0gZGVsdGFTY2FsZVkgKiAobWluUGl0Y2ggLSBzdGFydFBpdGNoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Um90YXRpb25QYXJhbXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFJvdGF0aW9uUGFyYW1zKHBvcywgc3RhcnRQb3MpIHtcbiAgICAgIHZhciBkZWx0YVggPSBwb3NbMF0gLSBzdGFydFBvc1swXTtcbiAgICAgIHZhciBkZWx0YVkgPSBwb3NbMV0gLSBzdGFydFBvc1sxXTtcbiAgICAgIHZhciBjZW50ZXJZID0gcG9zWzFdO1xuICAgICAgdmFyIHN0YXJ0WSA9IHN0YXJ0UG9zWzFdO1xuICAgICAgdmFyIF90aGlzJF92aWV3cG9ydFByb3BzMyA9IHRoaXMuX3ZpZXdwb3J0UHJvcHMsXG4gICAgICAgICAgd2lkdGggPSBfdGhpcyRfdmlld3BvcnRQcm9wczMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkX3ZpZXdwb3J0UHJvcHMzLmhlaWdodDtcbiAgICAgIHZhciBkZWx0YVNjYWxlWCA9IGRlbHRhWCAvIHdpZHRoO1xuICAgICAgdmFyIGRlbHRhU2NhbGVZID0gMDtcblxuICAgICAgaWYgKGRlbHRhWSA+IDApIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGhlaWdodCAtIHN0YXJ0WSkgPiBQSVRDSF9NT1VTRV9USFJFU0hPTEQpIHtcbiAgICAgICAgICBkZWx0YVNjYWxlWSA9IGRlbHRhWSAvIChzdGFydFkgLSBoZWlnaHQpICogUElUQ0hfQUNDRUw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgMCkge1xuICAgICAgICBpZiAoc3RhcnRZID4gUElUQ0hfTU9VU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgZGVsdGFTY2FsZVkgPSAxIC0gY2VudGVyWSAvIHN0YXJ0WTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZWx0YVNjYWxlWSA9IE1hdGgubWluKDEsIE1hdGgubWF4KC0xLCBkZWx0YVNjYWxlWSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVsdGFTY2FsZVg6IGRlbHRhU2NhbGVYLFxuICAgICAgICBkZWx0YVNjYWxlWTogZGVsdGFTY2FsZVlcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hcFN0YXRlO1xufSgpO1xuXG5leHBvcnQgeyBNYXBTdGF0ZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHsgTUFQQk9YX0xJTUlUUyB9IGZyb20gJy4vbWFwLXN0YXRlJztcblxuZnVuY3Rpb24gZGVjYXBpdGFsaXplKHMpIHtcbiAgcmV0dXJuIHNbMF0udG9Mb3dlckNhc2UoKSArIHMuc2xpY2UoMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Zpc2liaWxpdHlDb25zdHJhaW50cyhwcm9wcykge1xuICB2YXIgY29uc3RyYWludHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE1BUEJPWF9MSU1JVFM7XG5cbiAgZm9yICh2YXIgY29uc3RyYWludE5hbWUgaW4gY29uc3RyYWludHMpIHtcbiAgICB2YXIgdHlwZSA9IGNvbnN0cmFpbnROYW1lLnNsaWNlKDAsIDMpO1xuICAgIHZhciBwcm9wTmFtZSA9IGRlY2FwaXRhbGl6ZShjb25zdHJhaW50TmFtZS5zbGljZSgzKSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ21pbicgJiYgcHJvcHNbcHJvcE5hbWVdIDwgY29uc3RyYWludHNbY29uc3RyYWludE5hbWVdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdtYXgnICYmIHByb3BzW3Byb3BOYW1lXSA+IGNvbnN0cmFpbnRzW2NvbnN0cmFpbnROYW1lXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VTdGF0ZSwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbnZhciBNYXBDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gIHZpZXdwb3J0OiBudWxsLFxuICBtYXA6IG51bGwsXG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgb25WaWV3cG9ydENoYW5nZTogbnVsbCxcbiAgb25WaWV3U3RhdGVDaGFuZ2U6IG51bGwsXG4gIGV2ZW50TWFuYWdlcjogbnVsbFxufSk7XG5leHBvcnQgdmFyIE1hcENvbnRleHRQcm92aWRlciA9IE1hcENvbnRleHQuUHJvdmlkZXI7XG5cbmZ1bmN0aW9uIFdyYXBwZWRQcm92aWRlcihfcmVmKSB7XG4gIHZhciB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBtYXAgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0TWFwID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHZhbHVlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBzZXRNYXA6IHNldE1hcFxuICB9LCBjb250ZXh0KSwge30sIHtcbiAgICBtYXA6IGNvbnRleHQgJiYgY29udGV4dC5tYXAgfHwgbWFwXG4gIH0sIHZhbHVlKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFwQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuTWFwQ29udGV4dC5Qcm92aWRlciA9IFdyYXBwZWRQcm92aWRlcjtcbmV4cG9ydCBkZWZhdWx0IE1hcENvbnRleHQ7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuZXhwb3J0IGRlZmF1bHQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdDsiLCJleHBvcnQgZnVuY3Rpb24gZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIF9yZWYpIHtcbiAgdmFyIGxvbmdpdHVkZSA9IF9yZWYubG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGUgPSBfcmVmLmxhdGl0dWRlO1xuXG4gIGlmIChtYXAgJiYgbWFwLnF1ZXJ5VGVycmFpbkVsZXZhdGlvbikge1xuICAgIHJldHVybiBtYXAucXVlcnlUZXJyYWluRWxldmF0aW9uKFtsb25naXR1ZGUsIGxhdGl0dWRlXSkgfHwgMDtcbiAgfVxuXG4gIHJldHVybiAwO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBXZWJNZXJjYXRvclZpZXdwb3J0IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG5pbXBvcnQgTWFwYm94IGZyb20gJy4uL21hcGJveC9tYXBib3gnO1xuaW1wb3J0IG1hcGJveGdsIGZyb20gJy4uL3V0aWxzL21hcGJveGdsJztcbmltcG9ydCB7IGNoZWNrVmlzaWJpbGl0eUNvbnN0cmFpbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFwLWNvbnN0cmFpbnRzJztcbmltcG9ydCB7IE1BUEJPWF9MSU1JVFMgfSBmcm9tICcuLi91dGlscy9tYXAtc3RhdGUnO1xuaW1wb3J0IE1hcENvbnRleHQsIHsgTWFwQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9tYXAtY29udGV4dCc7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tICcuLi91dGlscy91c2UtaXNvbW9ycGhpYy1sYXlvdXQtZWZmZWN0JztcbmltcG9ydCB7IGdldFRlcnJhaW5FbGV2YXRpb24gfSBmcm9tICcuLi91dGlscy90ZXJyYWluJztcbnZhciBUT0tFTl9ET0NfVVJMID0gJ2h0dHBzOi8vdmlzZ2wuZ2l0aHViLmlvL3JlYWN0LW1hcC1nbC9kb2NzL2dldC1zdGFydGVkL21hcGJveC10b2tlbnMnO1xudmFyIE5PX1RPS0VOX1dBUk5JTkcgPSAnQSB2YWxpZCBBUEkgYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkIHRvIHVzZSBNYXBib3ggZGF0YSc7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnQoX3JlZikge1xuICB2YXIgbWFwID0gX3JlZi5tYXAsXG4gICAgICBwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICB2YXIgdmlld3BvcnRQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHByb3BzLnZpZXdTdGF0ZSksIHt9LCB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pO1xuXG4gIHZpZXdwb3J0UHJvcHMucG9zaXRpb24gPSBbMCwgMCwgZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIHZpZXdwb3J0UHJvcHMpXTtcbiAgcmV0dXJuIG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHZpZXdwb3J0UHJvcHMpO1xufVxudmFyIFVOQVVUSE9SSVpFRF9FUlJPUl9DT0RFID0gNDAxO1xudmFyIENPTlRBSU5FUl9TVFlMRSA9IHtcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gIHdpZHRoOiAnMTAwJScsXG4gIGhlaWdodDogJzEwMCUnLFxuICBvdmVyZmxvdzogJ2hpZGRlbidcbn07XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgTWFwYm94LmRlZmF1bHRQcm9wcywge1xuICBkaXNhYmxlVG9rZW5XYXJuaW5nOiBmYWxzZSxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgb25SZXNpemU6IG5vb3AsXG4gIGNsYXNzTmFtZTogJycsXG4gIHN0eWxlOiBudWxsLFxuICB2aXNpYmlsaXR5Q29uc3RyYWludHM6IE1BUEJPWF9MSU1JVFNcbn0pO1xuXG5mdW5jdGlvbiBOb1Rva2VuV2FybmluZygpIHtcbiAgdmFyIHN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwXG4gIH07XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwid2FybmluZ1wiLFxuICAgIGlkOiBcIm5vLXRva2VuLXdhcm5pbmdcIixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBrZXk6IFwiaGVhZGVyXCJcbiAgfSwgTk9fVE9LRU5fV0FSTklORyksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJ0ZXh0XCJcbiAgfSwgXCJGb3IgaW5mb3JtYXRpb24gb24gc2V0dGluZyB1cCB5b3VyIGJhc2VtYXAsIHJlYWRcIiksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBrZXk6IFwibGlua1wiLFxuICAgIGhyZWY6IFRPS0VOX0RPQ19VUkxcbiAgfSwgXCJOb3RlIG9uIE1hcCBUb2tlbnNcIikpO1xufVxuXG5mdW5jdGlvbiBnZXRSZWZIYW5kbGVzKG1hcGJveFJlZikge1xuICByZXR1cm4ge1xuICAgIGdldE1hcDogZnVuY3Rpb24gZ2V0TWFwKCkge1xuICAgICAgcmV0dXJuIG1hcGJveFJlZi5jdXJyZW50ICYmIG1hcGJveFJlZi5jdXJyZW50LmdldE1hcCgpO1xuICAgIH0sXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzOiBmdW5jdGlvbiBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnkpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBtYXAgPSBtYXBib3hSZWYuY3VycmVudCAmJiBtYXBib3hSZWYuY3VycmVudC5nZXRNYXAoKTtcbiAgICAgIHJldHVybiBtYXAgJiYgbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeSwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU3RhdGljTWFwID0gZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUodHJ1ZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGFjY2Vzc1Rva2VuVmFsaWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0VG9rZW5TdGF0ZSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSh7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH0pLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgc2l6ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRTaXplID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgbWFwYm94UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgbWFwRGl2UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgb3ZlcmxheVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIVN0YXRpY01hcC5zdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgbWFwYm94ID0gbmV3IE1hcGJveChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBzaXplKSwge30sIHtcbiAgICAgIG1hcGJveGdsOiBtYXBib3hnbCxcbiAgICAgIGNvbnRhaW5lcjogbWFwRGl2UmVmLmN1cnJlbnQsXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGV2dCkge1xuICAgICAgICB2YXIgc3RhdHVzQ29kZSA9IGV2dC5lcnJvciAmJiBldnQuZXJyb3Iuc3RhdHVzIHx8IGV2dC5zdGF0dXM7XG5cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IFVOQVVUSE9SSVpFRF9FUlJPUl9DT0RFICYmIGFjY2Vzc1Rva2VuVmFsaWQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKE5PX1RPS0VOX1dBUk5JTkcpO1xuICAgICAgICAgIHNldFRva2VuU3RhdGUoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvcHMub25FcnJvcihldnQpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBtYXBib3hSZWYuY3VycmVudCA9IG1hcGJveDtcblxuICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuc2V0TWFwKSB7XG4gICAgICBjb250ZXh0LnNldE1hcChtYXBib3guZ2V0TWFwKCkpO1xuICAgIH1cblxuICAgIHZhciByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgaWYgKGVudHJpZXNbMF0uY29udGVudFJlY3QpIHtcbiAgICAgICAgdmFyIF9lbnRyaWVzJDAkY29udGVudFJlYyA9IGVudHJpZXNbMF0uY29udGVudFJlY3QsXG4gICAgICAgICAgICBfd2lkdGggPSBfZW50cmllcyQwJGNvbnRlbnRSZWMud2lkdGgsXG4gICAgICAgICAgICBfaGVpZ2h0ID0gX2VudHJpZXMkMCRjb250ZW50UmVjLmhlaWdodDtcbiAgICAgICAgc2V0U2l6ZSh7XG4gICAgICAgICAgd2lkdGg6IF93aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IF9oZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIHByb3BzLm9uUmVzaXplKHtcbiAgICAgICAgICB3aWR0aDogX3dpZHRoLFxuICAgICAgICAgIGhlaWdodDogX2hlaWdodFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbWFwYm94LmZpbmFsaXplKCk7XG4gICAgICBtYXBib3hSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWFwYm94UmVmLmN1cnJlbnQpIHtcbiAgICAgIG1hcGJveFJlZi5jdXJyZW50LnNldFByb3BzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBzaXplKSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIG1hcCA9IG1hcGJveFJlZi5jdXJyZW50ICYmIG1hcGJveFJlZi5jdXJyZW50LmdldE1hcCgpO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRSZWZIYW5kbGVzKG1hcGJveFJlZik7XG4gIH0sIFtdKTtcbiAgdmFyIHByZXZlbnRTY3JvbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0O1xuXG4gICAgaWYgKHRhcmdldCA9PT0gb3ZlcmxheVJlZi5jdXJyZW50KSB7XG4gICAgICB0YXJnZXQuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHZhciBvdmVybGF5cyA9IG1hcCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KE1hcENvbnRleHRQcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbnRleHQpLCB7fSwge1xuICAgICAgdmlld3BvcnQ6IGNvbnRleHQudmlld3BvcnQgfHwgZ2V0Vmlld3BvcnQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIG1hcDogbWFwLFxuICAgICAgICBwcm9wczogcHJvcHNcbiAgICAgIH0sIHNpemUpKSxcbiAgICAgIG1hcDogbWFwLFxuICAgICAgY29udGFpbmVyOiBjb250ZXh0LmNvbnRhaW5lciB8fCBjb250YWluZXJSZWYuY3VycmVudFxuICAgIH0pXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJtYXAtb3ZlcmxheXNcIixcbiAgICBjbGFzc05hbWU6IFwib3ZlcmxheXNcIixcbiAgICByZWY6IG92ZXJsYXlSZWYsXG4gICAgc3R5bGU6IENPTlRBSU5FUl9TVFlMRSxcbiAgICBvblNjcm9sbDogcHJldmVudFNjcm9sbFxuICB9LCBwcm9wcy5jaGlsZHJlbikpO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICB2aXNpYmlsaXR5Q29uc3RyYWludHMgPSBwcm9wcy52aXNpYmlsaXR5Q29uc3RyYWludHM7XG4gIHZhciBtYXBDb250YWluZXJTdHlsZSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gIH0sIHN0eWxlLCB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pO1xuICB2YXIgdmlzaWJsZSA9IHByb3BzLnZpc2libGUgJiYgY2hlY2tWaXNpYmlsaXR5Q29uc3RyYWludHMocHJvcHMudmlld1N0YXRlIHx8IHByb3BzLCB2aXNpYmlsaXR5Q29uc3RyYWludHMpO1xuICB2YXIgbWFwU3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCBDT05UQUlORVJfU1RZTEUsIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlID8gJ2luaGVyaXQnIDogJ2hpZGRlbidcbiAgfSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwibWFwLWNvbnRhaW5lclwiLFxuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIHN0eWxlOiBtYXBDb250YWluZXJTdHlsZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwibWFwLW1hcGJveFwiLFxuICAgIHJlZjogbWFwRGl2UmVmLFxuICAgIHN0eWxlOiBtYXBTdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgb3ZlcmxheXMsICFhY2Nlc3NUb2tlblZhbGlkICYmICFwcm9wcy5kaXNhYmxlVG9rZW5XYXJuaW5nICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTm9Ub2tlbldhcm5pbmcsIG51bGwpKTtcbn0pO1xuXG5TdGF0aWNNYXAuc3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFwYm94Z2wgJiYgbWFwYm94Z2wuc3VwcG9ydGVkKCk7XG59O1xuXG5TdGF0aWNNYXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgU3RhdGljTWFwOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHtcbiAgdmFyIGl0O1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHZhciBGID0gZnVuY3Rpb24gRigpIHt9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgICAgIGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG9baSsrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIGUoX2UpIHtcbiAgICAgICAgICB0aHJvdyBfZTtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cblxuICB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsXG4gICAgICBkaWRFcnIgPSBmYWxzZSxcbiAgICAgIGVycjtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiBzKCkge1xuICAgICAgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0Lm5leHQoKTtcbiAgICAgIG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIGUoX2UyKSB7XG4gICAgICBkaWRFcnIgPSB0cnVlO1xuICAgICAgZXJyID0gX2UyO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24gZigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGRpZEVycikgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmltcG9ydCB7IGVxdWFscyB9IGZyb20gJy4uL21hdGgtdXRpbHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuLi9hc3NlcnQnO1xuXG52YXIgVHJhbnNpdGlvbkludGVycG9sYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHJhbnNpdGlvbkludGVycG9sYXRvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNpdGlvbkludGVycG9sYXRvcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJwcm9wTmFtZXNcIiwgW10pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zaXRpb25JbnRlcnBvbGF0b3IsIFt7XG4gICAga2V5OiBcImFyZVByb3BzRXF1YWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXJlUHJvcHNFcXVhbChjdXJyZW50UHJvcHMsIG5leHRQcm9wcykge1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMucHJvcE5hbWVzIHx8IFtdKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIWVxdWFscyhjdXJyZW50UHJvcHNba2V5XSwgbmV4dFByb3BzW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnRQcm9wcyxcbiAgICAgICAgZW5kOiBlbmRQcm9wc1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJwb2xhdGVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnBvbGF0ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdpbnRlcnBvbGF0ZVByb3BzIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcykge1xuICAgICAgcmV0dXJuIGVuZFByb3BzLnRyYW5zaXRpb25EdXJhdGlvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNpdGlvbkludGVycG9sYXRvcjtcbn0oKTtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbkludGVycG9sYXRvciBhcyBkZWZhdWx0IH07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn0iLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJ2YXIgV1JBUFBFRF9BTkdVTEFSX1BST1BTID0ge1xuICBsb25naXR1ZGU6IDEsXG4gIGJlYXJpbmc6IDFcbn07XG5leHBvcnQgZnVuY3Rpb24gbW9kKHZhbHVlLCBkaXZpc29yKSB7XG4gIHZhciBtb2R1bHVzID0gdmFsdWUgJSBkaXZpc29yO1xuICByZXR1cm4gbW9kdWx1cyA8IDAgPyBkaXZpc29yICsgbW9kdWx1cyA6IG1vZHVsdXM7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZChwcm9wKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHJvcCkgfHwgQXJyYXkuaXNBcnJheShwcm9wKTtcbn1cblxuZnVuY3Rpb24gaXNXcmFwcGVkQW5ndWxhclByb3AocHJvcE5hbWUpIHtcbiAgcmV0dXJuIHByb3BOYW1lIGluIFdSQVBQRURfQU5HVUxBUl9QUk9QUztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGgocHJvcE5hbWUsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKSB7XG4gIGlmIChpc1dyYXBwZWRBbmd1bGFyUHJvcChwcm9wTmFtZSkgJiYgTWF0aC5hYnMoZW5kVmFsdWUgLSBzdGFydFZhbHVlKSA+IDE4MCkge1xuICAgIGVuZFZhbHVlID0gZW5kVmFsdWUgPCAwID8gZW5kVmFsdWUgKyAzNjAgOiBlbmRWYWx1ZSAtIDM2MDtcbiAgfVxuXG4gIHJldHVybiBlbmRWYWx1ZTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkge1xuICB2YXIgaXQ7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoaXQpIG8gPSBpdDtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHM6IEYsXG4gICAgICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gZShfZSkge1xuICAgICAgICAgIHRocm93IF9lO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSxcbiAgICAgIGRpZEVyciA9IGZhbHNlLFxuICAgICAgZXJyO1xuICByZXR1cm4ge1xuICAgIHM6IGZ1bmN0aW9uIHMoKSB7XG4gICAgICBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgIHZhciBzdGVwID0gaXQubmV4dCgpO1xuICAgICAgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTtcbiAgICAgIHJldHVybiBzdGVwO1xuICAgIH0sXG4gICAgZTogZnVuY3Rpb24gZShfZTIpIHtcbiAgICAgIGRpZEVyciA9IHRydWU7XG4gICAgICBlcnIgPSBfZTI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiBmKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHtcbiAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkge1xuICAgIHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHtcbiAgICAgIHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7XG5cbiAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW1wb3J0IGFzc2VydCBmcm9tICcuLi9hc3NlcnQnO1xuaW1wb3J0IFRyYW5zaXRpb25JbnRlcnBvbGF0b3IgZnJvbSAnLi90cmFuc2l0aW9uLWludGVycG9sYXRvcic7XG5pbXBvcnQgeyBmbHlUb1ZpZXdwb3J0LCBnZXRGbHlUb0R1cmF0aW9uIH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQgeyBpc1ZhbGlkLCBnZXRFbmRWYWx1ZUJ5U2hvcnRlc3RQYXRoIH0gZnJvbSAnLi90cmFuc2l0aW9uLXV0aWxzJztcbmltcG9ydCB7IGxlcnAgfSBmcm9tICcuLi9tYXRoLXV0aWxzJztcbnZhciBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTID0gWydsb25naXR1ZGUnLCAnbGF0aXR1ZGUnLCAnem9vbScsICdiZWFyaW5nJywgJ3BpdGNoJ107XG52YXIgUkVRVUlSRURfUFJPUFMgPSBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZScsICd6b29tJywgJ3dpZHRoJywgJ2hlaWdodCddO1xudmFyIExJTkVBUkxZX0lOVEVSUE9MQVRFRF9QUk9QUyA9IFsnYmVhcmluZycsICdwaXRjaCddO1xudmFyIERFRkFVTFRfT1BUUyA9IHtcbiAgc3BlZWQ6IDEuMixcbiAgY3VydmU6IDEuNDE0XG59O1xuXG52YXIgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciA9IGZ1bmN0aW9uIChfVHJhbnNpdGlvbkludGVycG9sYXQpIHtcbiAgX2luaGVyaXRzKFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IsIF9UcmFuc2l0aW9uSW50ZXJwb2xhdCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yKTtcblxuICBmdW5jdGlvbiBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInByb3BOYW1lc1wiLCBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTKTtcblxuICAgIF90aGlzLnByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRTLCBwcm9wcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IsIFt7XG4gICAga2V5OiBcImluaXRpYWxpemVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgICAgIHZhciBzdGFydFZpZXdwb3J0UHJvcHMgPSB7fTtcbiAgICAgIHZhciBlbmRWaWV3cG9ydFByb3BzID0ge307XG5cbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihSRVFVSVJFRF9QUk9QUyksXG4gICAgICAgICAgX3N0ZXA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIHZhciBzdGFydFZhbHVlID0gc3RhcnRQcm9wc1trZXldO1xuICAgICAgICAgIHZhciBlbmRWYWx1ZSA9IGVuZFByb3BzW2tleV07XG4gICAgICAgICAgYXNzZXJ0KGlzVmFsaWQoc3RhcnRWYWx1ZSkgJiYgaXNWYWxpZChlbmRWYWx1ZSksIFwiXCIuY29uY2F0KGtleSwgXCIgbXVzdCBiZSBzdXBwbGllZCBmb3IgdHJhbnNpdGlvblwiKSk7XG4gICAgICAgICAgc3RhcnRWaWV3cG9ydFByb3BzW2tleV0gPSBzdGFydFZhbHVlO1xuICAgICAgICAgIGVuZFZpZXdwb3J0UHJvcHNba2V5XSA9IGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGgoa2V5LCBzdGFydFZhbHVlLCBlbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihMSU5FQVJMWV9JTlRFUlBPTEFURURfUFJPUFMpLFxuICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX2tleSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgIHZhciBfc3RhcnRWYWx1ZSA9IHN0YXJ0UHJvcHNbX2tleV0gfHwgMDtcblxuICAgICAgICAgIHZhciBfZW5kVmFsdWUgPSBlbmRQcm9wc1tfa2V5XSB8fCAwO1xuXG4gICAgICAgICAgc3RhcnRWaWV3cG9ydFByb3BzW19rZXldID0gX3N0YXJ0VmFsdWU7XG4gICAgICAgICAgZW5kVmlld3BvcnRQcm9wc1tfa2V5XSA9IGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGgoX2tleSwgX3N0YXJ0VmFsdWUsIF9lbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnRWaWV3cG9ydFByb3BzLFxuICAgICAgICBlbmQ6IGVuZFZpZXdwb3J0UHJvcHNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVycG9sYXRlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJwb2xhdGVQcm9wcyhzdGFydFByb3BzLCBlbmRQcm9wcywgdCkge1xuICAgICAgdmFyIHZpZXdwb3J0ID0gZmx5VG9WaWV3cG9ydChzdGFydFByb3BzLCBlbmRQcm9wcywgdCwgdGhpcy5wcm9wcyk7XG5cbiAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoTElORUFSTFlfSU5URVJQT0xBVEVEX1BST1BTKSxcbiAgICAgICAgICBfc3RlcDM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgICB2aWV3cG9ydFtrZXldID0gbGVycChzdGFydFByb3BzW2tleV0sIGVuZFByb3BzW2tleV0sIHQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IzLmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcykge1xuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IGVuZFByb3BzLnRyYW5zaXRpb25EdXJhdGlvbjtcblxuICAgICAgaWYgKHRyYW5zaXRpb25EdXJhdGlvbiA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbiA9IGdldEZseVRvRHVyYXRpb24oc3RhcnRQcm9wcywgZW5kUHJvcHMsIHRoaXMucHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yO1xufShUcmFuc2l0aW9uSW50ZXJwb2xhdG9yKTtcblxuZXhwb3J0IHsgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChpdCkgbyA9IGl0O1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBvW2krK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiBlKF9lKSB7XG4gICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgICAgZGlkRXJyID0gZmFsc2UsXG4gICAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gcygpIHtcbiAgICAgIGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiBlKF9lMikge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IF9lMjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uIGYoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkge1xuICB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtcblxuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vYXNzZXJ0JztcbmltcG9ydCBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yIGZyb20gJy4vdHJhbnNpdGlvbi1pbnRlcnBvbGF0b3InO1xuaW1wb3J0IHsgaXNWYWxpZCwgZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aCB9IGZyb20gJy4vdHJhbnNpdGlvbi11dGlscyc7XG5pbXBvcnQgeyBsZXJwIH0gZnJvbSAnLi4vbWF0aC11dGlscyc7XG52YXIgVklFV1BPUlRfVFJBTlNJVElPTl9QUk9QUyA9IFsnbG9uZ2l0dWRlJywgJ2xhdGl0dWRlJywgJ3pvb20nLCAnYmVhcmluZycsICdwaXRjaCddO1xuXG52YXIgTGluZWFySW50ZXJwb2xhdG9yID0gZnVuY3Rpb24gKF9UcmFuc2l0aW9uSW50ZXJwb2xhdCkge1xuICBfaW5oZXJpdHMoTGluZWFySW50ZXJwb2xhdG9yLCBfVHJhbnNpdGlvbkludGVycG9sYXQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTGluZWFySW50ZXJwb2xhdG9yKTtcblxuICBmdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGF0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpbmVhckludGVycG9sYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cykpIHtcbiAgICAgIG9wdHMgPSB7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wczogb3B0c1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBfdGhpcy5wcm9wTmFtZXMgPSBvcHRzLnRyYW5zaXRpb25Qcm9wcyB8fCBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTO1xuXG4gICAgaWYgKG9wdHMuYXJvdW5kKSB7XG4gICAgICBfdGhpcy5hcm91bmQgPSBvcHRzLmFyb3VuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGluZWFySW50ZXJwb2xhdG9yLCBbe1xuICAgIGtleTogXCJpbml0aWFsaXplUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gICAgICB2YXIgc3RhcnRWaWV3cG9ydFByb3BzID0ge307XG4gICAgICB2YXIgZW5kVmlld3BvcnRQcm9wcyA9IHt9O1xuXG4gICAgICBpZiAodGhpcy5hcm91bmQpIHtcbiAgICAgICAgc3RhcnRWaWV3cG9ydFByb3BzLmFyb3VuZCA9IHRoaXMuYXJvdW5kO1xuICAgICAgICB2YXIgYXJvdW5kTG5nTGF0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoc3RhcnRQcm9wcykudW5wcm9qZWN0KHRoaXMuYXJvdW5kKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbmRWaWV3cG9ydFByb3BzLCBlbmRQcm9wcywge1xuICAgICAgICAgIGFyb3VuZDogbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoZW5kUHJvcHMpLnByb2plY3QoYXJvdW5kTG5nTGF0KSxcbiAgICAgICAgICBhcm91bmRMbmdMYXQ6IGFyb3VuZExuZ0xhdFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMucHJvcE5hbWVzKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFByb3BzW2tleV07XG4gICAgICAgICAgdmFyIGVuZFZhbHVlID0gZW5kUHJvcHNba2V5XTtcbiAgICAgICAgICBhc3NlcnQoaXNWYWxpZChzdGFydFZhbHVlKSAmJiBpc1ZhbGlkKGVuZFZhbHVlKSwgXCJcIi5jb25jYXQoa2V5LCBcIiBtdXN0IGJlIHN1cHBsaWVkIGZvciB0cmFuc2l0aW9uXCIpKTtcbiAgICAgICAgICBzdGFydFZpZXdwb3J0UHJvcHNba2V5XSA9IHN0YXJ0VmFsdWU7XG4gICAgICAgICAgZW5kVmlld3BvcnRQcm9wc1trZXldID0gZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aChrZXksIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnRWaWV3cG9ydFByb3BzLFxuICAgICAgICBlbmQ6IGVuZFZpZXdwb3J0UHJvcHNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVycG9sYXRlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJwb2xhdGVQcm9wcyhzdGFydFByb3BzLCBlbmRQcm9wcywgdCkge1xuICAgICAgdmFyIHZpZXdwb3J0ID0ge307XG5cbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5wcm9wTmFtZXMpLFxuICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIHZpZXdwb3J0W2tleV0gPSBsZXJwKHN0YXJ0UHJvcHNba2V5XSwgZW5kUHJvcHNba2V5XSwgdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5kUHJvcHMuYXJvdW5kKSB7XG4gICAgICAgIHZhciBfV2ViTWVyY2F0b3JWaWV3cG9ydCQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChPYmplY3QuYXNzaWduKHt9LCBlbmRQcm9wcywgdmlld3BvcnQpKS5nZXRNYXBDZW50ZXJCeUxuZ0xhdFBvc2l0aW9uKHtcbiAgICAgICAgICBsbmdMYXQ6IGVuZFByb3BzLmFyb3VuZExuZ0xhdCxcbiAgICAgICAgICBwb3M6IGxlcnAoc3RhcnRQcm9wcy5hcm91bmQsIGVuZFByb3BzLmFyb3VuZCwgdClcbiAgICAgICAgfSksXG4gICAgICAgICAgICBfV2ViTWVyY2F0b3JWaWV3cG9ydCQyID0gX3NsaWNlZFRvQXJyYXkoX1dlYk1lcmNhdG9yVmlld3BvcnQkLCAyKSxcbiAgICAgICAgICAgIGxvbmdpdHVkZSA9IF9XZWJNZXJjYXRvclZpZXdwb3J0JDJbMF0sXG4gICAgICAgICAgICBsYXRpdHVkZSA9IF9XZWJNZXJjYXRvclZpZXdwb3J0JDJbMV07XG5cbiAgICAgICAgdmlld3BvcnQubG9uZ2l0dWRlID0gbG9uZ2l0dWRlO1xuICAgICAgICB2aWV3cG9ydC5sYXRpdHVkZSA9IGxhdGl0dWRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmlld3BvcnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmVhckludGVycG9sYXRvcjtcbn0oVHJhbnNpdGlvbkludGVycG9sYXRvcik7XG5cbmV4cG9ydCB7IExpbmVhckludGVycG9sYXRvciBhcyBkZWZhdWx0IH07IiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yIH0gZnJvbSAnLi90cmFuc2l0aW9uLWludGVycG9sYXRvcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IgfSBmcm9tICcuL3ZpZXdwb3J0LWZseS10by1pbnRlcnBvbGF0b3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaW5lYXJJbnRlcnBvbGF0b3IgfSBmcm9tICcuL2xpbmVhci1pbnRlcnBvbGF0b3InOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi9hc3NlcnQnO1xuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhdG9yIH0gZnJvbSAnLi90cmFuc2l0aW9uJztcbmltcG9ydCBNYXBTdGF0ZSBmcm9tICcuL21hcC1zdGF0ZSc7XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JvcEVhc2luZ0Z1bmN0aW9uKGVhc2luZywgeDApIHtcbiAgdmFyIHkwID0gZWFzaW5nKHgwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIDEgLyAoMSAtIHkwKSAqIChlYXNpbmcodCAqICgxIC0geDApICsgeDApIC0geTApO1xuICB9O1xufVxuZXhwb3J0IHZhciBUUkFOU0lUSU9OX0VWRU5UUyA9IHtcbiAgQlJFQUs6IDEsXG4gIFNOQVBfVE9fRU5EOiAyLFxuICBJR05PUkU6IDMsXG4gIFVQREFURTogNFxufTtcbnZhciBERUZBVUxUX1BST1BTID0ge1xuICB0cmFuc2l0aW9uRHVyYXRpb246IDAsXG4gIHRyYW5zaXRpb25FYXNpbmc6IGZ1bmN0aW9uIHRyYW5zaXRpb25FYXNpbmcodCkge1xuICAgIHJldHVybiB0O1xuICB9LFxuICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKCksXG4gIHRyYW5zaXRpb25JbnRlcnJ1cHRpb246IFRSQU5TSVRJT05fRVZFTlRTLkJSRUFLLFxuICBvblRyYW5zaXRpb25TdGFydDogbm9vcCxcbiAgb25UcmFuc2l0aW9uSW50ZXJydXB0OiBub29wLFxuICBvblRyYW5zaXRpb25FbmQ6IG5vb3Bcbn07XG5cbnZhciBUcmFuc2l0aW9uTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHJhbnNpdGlvbk1hbmFnZXIoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2l0aW9uTWFuYWdlcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfYW5pbWF0aW9uRnJhbWVcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfb25UcmFuc2l0aW9uRnJhbWVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX2FuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLl9vblRyYW5zaXRpb25GcmFtZSk7XG5cbiAgICAgIF90aGlzLl91cGRhdGVWaWV3cG9ydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9wcyA9IG51bGw7XG4gICAgdGhpcy5vblZpZXdwb3J0Q2hhbmdlID0gb3B0cy5vblZpZXdwb3J0Q2hhbmdlIHx8IG5vb3A7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gb3B0cy5vblN0YXRlQ2hhbmdlIHx8IG5vb3A7XG4gICAgdGhpcy50aW1lID0gb3B0cy5nZXRUaW1lIHx8IERhdGUubm93O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zaXRpb25NYW5hZ2VyLCBbe1xuICAgIGtleTogXCJnZXRWaWV3cG9ydEluVHJhbnNpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWV3cG9ydEluVHJhbnNpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hbmltYXRpb25GcmFtZSA/IHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9jZXNzVmlld3BvcnRDaGFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2Vzc1ZpZXdwb3J0Q2hhbmdlKG5leHRQcm9wcykge1xuICAgICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLnByb3BzID0gbmV4dFByb3BzO1xuXG4gICAgICBpZiAoIWN1cnJlbnRQcm9wcyB8fCB0aGlzLl9zaG91bGRJZ25vcmVWaWV3cG9ydENoYW5nZShjdXJyZW50UHJvcHMsIG5leHRQcm9wcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uRW5hYmxlZChuZXh0UHJvcHMpKSB7XG4gICAgICAgIHZhciBzdGFydFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudFByb3BzKTtcbiAgICAgICAgdmFyIGVuZFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbmV4dFByb3BzKTtcblxuICAgICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uSW5Qcm9ncmVzcygpKSB7XG4gICAgICAgICAgY3VycmVudFByb3BzLm9uVHJhbnNpdGlvbkludGVycnVwdCgpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaW50ZXJydXB0aW9uID09PSBUUkFOU0lUSU9OX0VWRU5UUy5TTkFQX1RPX0VORCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGFydFByb3BzLCB0aGlzLnN0YXRlLmVuZFByb3BzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGFydFByb3BzLCB0aGlzLnN0YXRlLnByb3BzSW5UcmFuc2l0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5pbnRlcnJ1cHRpb24gPT09IFRSQU5TSVRJT05fRVZFTlRTLlVQREFURSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gdGhpcy50aW1lKCk7XG4gICAgICAgICAgICB2YXIgeDAgPSAoY3VycmVudFRpbWUgLSB0aGlzLnN0YXRlLnN0YXJ0VGltZSkgLyB0aGlzLnN0YXRlLmR1cmF0aW9uO1xuICAgICAgICAgICAgZW5kUHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpcy5zdGF0ZS5kdXJhdGlvbiAtIChjdXJyZW50VGltZSAtIHRoaXMuc3RhdGUuc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIGVuZFByb3BzLnRyYW5zaXRpb25FYXNpbmcgPSBjcm9wRWFzaW5nRnVuY3Rpb24odGhpcy5zdGF0ZS5lYXNpbmcsIHgwKTtcbiAgICAgICAgICAgIGVuZFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IgPSBzdGFydFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZW5kUHJvcHMub25UcmFuc2l0aW9uU3RhcnQoKTtcblxuICAgICAgICB0aGlzLl90cmlnZ2VyVHJhbnNpdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25JblByb2dyZXNzKCkpIHtcbiAgICAgICAgY3VycmVudFByb3BzLm9uVHJhbnNpdGlvbkludGVycnVwdCgpO1xuXG4gICAgICAgIHRoaXMuX2VuZFRyYW5zaXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaXNUcmFuc2l0aW9uSW5Qcm9ncmVzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaXNUcmFuc2l0aW9uSW5Qcm9ncmVzcygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2FuaW1hdGlvbkZyYW1lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2lzVHJhbnNpdGlvbkVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2lzVHJhbnNpdGlvbkVuYWJsZWQocHJvcHMpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBwcm9wcy50cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgICAgdHJhbnNpdGlvbkludGVycG9sYXRvciA9IHByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3I7XG4gICAgICByZXR1cm4gKHRyYW5zaXRpb25EdXJhdGlvbiA+IDAgfHwgdHJhbnNpdGlvbkR1cmF0aW9uID09PSAnYXV0bycpICYmIEJvb2xlYW4odHJhbnNpdGlvbkludGVycG9sYXRvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1VwZGF0ZUR1ZVRvQ3VycmVudFRyYW5zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2lzVXBkYXRlRHVlVG9DdXJyZW50VHJhbnNpdGlvbihwcm9wcykge1xuICAgICAgaWYgKHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaW50ZXJwb2xhdG9yLmFyZVByb3BzRXF1YWwocHJvcHMsIHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zaG91bGRJZ25vcmVWaWV3cG9ydENoYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc2hvdWxkSWdub3JlVmlld3BvcnRDaGFuZ2UoY3VycmVudFByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghY3VycmVudFByb3BzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uSW5Qcm9ncmVzcygpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmludGVycnVwdGlvbiA9PT0gVFJBTlNJVElPTl9FVkVOVFMuSUdOT1JFIHx8IHRoaXMuX2lzVXBkYXRlRHVlVG9DdXJyZW50VHJhbnNpdGlvbihuZXh0UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uRW5hYmxlZChuZXh0UHJvcHMpKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvci5hcmVQcm9wc0VxdWFsKGN1cnJlbnRQcm9wcywgbmV4dFByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl90cmlnZ2VyVHJhbnNpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdHJpZ2dlclRyYW5zaXRpb24oc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgICAgIGFzc2VydCh0aGlzLl9pc1RyYW5zaXRpb25FbmFibGVkKGVuZFByb3BzKSk7XG5cbiAgICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yID0gZW5kUHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvcjtcbiAgICAgIHZhciBkdXJhdGlvbiA9IHRyYW5zaXRpb25JbnRlcnBvbGF0b3IuZ2V0RHVyYXRpb24gPyB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yLmdldER1cmF0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSA6IGVuZFByb3BzLnRyYW5zaXRpb25EdXJhdGlvbjtcblxuICAgICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGluaXRpYWxQcm9wcyA9IGVuZFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IuaW5pdGlhbGl6ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzKTtcbiAgICAgIHZhciBpbnRlcmFjdGlvblN0YXRlID0ge1xuICAgICAgICBpblRyYW5zaXRpb246IHRydWUsXG4gICAgICAgIGlzWm9vbWluZzogc3RhcnRQcm9wcy56b29tICE9PSBlbmRQcm9wcy56b29tLFxuICAgICAgICBpc1Bhbm5pbmc6IHN0YXJ0UHJvcHMubG9uZ2l0dWRlICE9PSBlbmRQcm9wcy5sb25naXR1ZGUgfHwgc3RhcnRQcm9wcy5sYXRpdHVkZSAhPT0gZW5kUHJvcHMubGF0aXR1ZGUsXG4gICAgICAgIGlzUm90YXRpbmc6IHN0YXJ0UHJvcHMuYmVhcmluZyAhPT0gZW5kUHJvcHMuYmVhcmluZyB8fCBzdGFydFByb3BzLnBpdGNoICE9PSBlbmRQcm9wcy5waXRjaFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZWFzaW5nOiBlbmRQcm9wcy50cmFuc2l0aW9uRWFzaW5nLFxuICAgICAgICBpbnRlcnBvbGF0b3I6IGVuZFByb3BzLnRyYW5zaXRpb25JbnRlcnBvbGF0b3IsXG4gICAgICAgIGludGVycnVwdGlvbjogZW5kUHJvcHMudHJhbnNpdGlvbkludGVycnVwdGlvbixcbiAgICAgICAgc3RhcnRUaW1lOiB0aGlzLnRpbWUoKSxcbiAgICAgICAgc3RhcnRQcm9wczogaW5pdGlhbFByb3BzLnN0YXJ0LFxuICAgICAgICBlbmRQcm9wczogaW5pdGlhbFByb3BzLmVuZCxcbiAgICAgICAgYW5pbWF0aW9uOiBudWxsLFxuICAgICAgICBwcm9wc0luVHJhbnNpdGlvbjoge31cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX29uVHJhbnNpdGlvbkZyYW1lKCk7XG5cbiAgICAgIHRoaXMub25TdGF0ZUNoYW5nZShpbnRlcmFjdGlvblN0YXRlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2VuZFRyYW5zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2VuZFRyYW5zaXRpb24oKSB7XG4gICAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSh7XG4gICAgICAgIGluVHJhbnNpdGlvbjogZmFsc2UsXG4gICAgICAgIGlzWm9vbWluZzogZmFsc2UsXG4gICAgICAgIGlzUGFubmluZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZVZpZXdwb3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVWaWV3cG9ydCgpIHtcbiAgICAgIHZhciBjdXJyZW50VGltZSA9IHRoaXMudGltZSgpO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBzdGFydFRpbWUgPSBfdGhpcyRzdGF0ZS5zdGFydFRpbWUsXG4gICAgICAgICAgZHVyYXRpb24gPSBfdGhpcyRzdGF0ZS5kdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmcgPSBfdGhpcyRzdGF0ZS5lYXNpbmcsXG4gICAgICAgICAgaW50ZXJwb2xhdG9yID0gX3RoaXMkc3RhdGUuaW50ZXJwb2xhdG9yLFxuICAgICAgICAgIHN0YXJ0UHJvcHMgPSBfdGhpcyRzdGF0ZS5zdGFydFByb3BzLFxuICAgICAgICAgIGVuZFByb3BzID0gX3RoaXMkc3RhdGUuZW5kUHJvcHM7XG4gICAgICB2YXIgc2hvdWxkRW5kID0gZmFsc2U7XG4gICAgICB2YXIgdCA9IChjdXJyZW50VGltZSAtIHN0YXJ0VGltZSkgLyBkdXJhdGlvbjtcblxuICAgICAgaWYgKHQgPj0gMSkge1xuICAgICAgICB0ID0gMTtcbiAgICAgICAgc2hvdWxkRW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdCA9IGVhc2luZyh0KTtcbiAgICAgIHZhciB2aWV3cG9ydCA9IGludGVycG9sYXRvci5pbnRlcnBvbGF0ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KTtcbiAgICAgIHZhciBtYXBTdGF0ZSA9IG5ldyBNYXBTdGF0ZShPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCB2aWV3cG9ydCkpO1xuICAgICAgdGhpcy5zdGF0ZS5wcm9wc0luVHJhbnNpdGlvbiA9IG1hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKTtcbiAgICAgIHRoaXMub25WaWV3cG9ydENoYW5nZSh0aGlzLnN0YXRlLnByb3BzSW5UcmFuc2l0aW9uLCB0aGlzLnByb3BzKTtcblxuICAgICAgaWYgKHNob3VsZEVuZCkge1xuICAgICAgICB0aGlzLl9lbmRUcmFuc2l0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vblRyYW5zaXRpb25FbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNpdGlvbk1hbmFnZXI7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShUcmFuc2l0aW9uTWFuYWdlciwgXCJkZWZhdWx0UHJvcHNcIiwgREVGQVVMVF9QUk9QUyk7XG5cbmV4cG9ydCB7IFRyYW5zaXRpb25NYW5hZ2VyIGFzIGRlZmF1bHQgfTsiLCJ2YXIgSU5QVVRfU1RBUlQgPSAxO1xudmFyIElOUFVUX01PVkUgPSAyO1xudmFyIElOUFVUX0VORCA9IDQ7XG52YXIgTU9VU0VfSU5QVVRfTUFQID0ge1xuICBtb3VzZWRvd246IElOUFVUX1NUQVJULFxuICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gIG1vdXNldXA6IElOUFVUX0VORFxufTtcblxuZnVuY3Rpb24gc29tZShhcnJheSwgcHJlZGljdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHByZWRpY3QoYXJyYXlbaV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmhhbmNlUG9pbnRlckV2ZW50SW5wdXQoUG9pbnRlckV2ZW50SW5wdXQpIHtcbiAgdmFyIG9sZEhhbmRsZXIgPSBQb2ludGVyRXZlbnRJbnB1dC5wcm90b3R5cGUuaGFuZGxlcjtcblxuICBQb2ludGVyRXZlbnRJbnB1dC5wcm90b3R5cGUuaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoZXYpIHtcbiAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuXG4gICAgaWYgKGV2LmJ1dHRvbiA+IDAgJiYgZXYudHlwZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuICAgICAgaWYgKCFzb21lKHN0b3JlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5wb2ludGVySWQgPT09IGV2LnBvaW50ZXJJZDtcbiAgICAgIH0pKSB7XG4gICAgICAgIHN0b3JlLnB1c2goZXYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9sZEhhbmRsZXIuY2FsbCh0aGlzLCBldik7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZW5oYW5jZU1vdXNlSW5wdXQoTW91c2VJbnB1dCkge1xuICBNb3VzZUlucHV0LnByb3RvdHlwZS5oYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihldikge1xuICAgIHZhciBldmVudFR5cGUgPSBNT1VTRV9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgZXYuYnV0dG9uID49IDApIHtcbiAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggPT09IDApIHtcbiAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgIHBvaW50ZXJzOiBbZXZdLFxuICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICBzcmNFdmVudDogZXZcbiAgICB9KTtcbiAgfTtcbn0iLCJpbXBvcnQgaGFtbWVyanMgZnJvbSAnaGFtbWVyanMnO1xuaW1wb3J0IHsgZW5oYW5jZVBvaW50ZXJFdmVudElucHV0LCBlbmhhbmNlTW91c2VJbnB1dCB9IGZyb20gJy4vaGFtbWVyLW92ZXJyaWRlcyc7XG5lbmhhbmNlUG9pbnRlckV2ZW50SW5wdXQoaGFtbWVyanMuUG9pbnRlckV2ZW50SW5wdXQpO1xuZW5oYW5jZU1vdXNlSW5wdXQoaGFtbWVyanMuTW91c2VJbnB1dCk7XG5leHBvcnQgdmFyIE1hbmFnZXIgPSBoYW1tZXJqcy5NYW5hZ2VyO1xuZXhwb3J0IGRlZmF1bHQgaGFtbWVyanM7IiwiaW1wb3J0IEhhbW1lciBmcm9tICcuL3V0aWxzL2hhbW1lcic7XG5leHBvcnQgdmFyIFJFQ09HTklaRVJTID0gSGFtbWVyID8gW1tIYW1tZXIuUGFuLCB7XG4gIGV2ZW50OiAndHJpcGFuJyxcbiAgcG9pbnRlcnM6IDMsXG4gIHRocmVzaG9sZDogMCxcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuUm90YXRlLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlBpbmNoLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlN3aXBlLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlBhbiwge1xuICB0aHJlc2hvbGQ6IDAsXG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlByZXNzLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlRhcCwge1xuICBldmVudDogJ2RvdWJsZXRhcCcsXG4gIHRhcHM6IDIsXG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlRhcCwge1xuICBldmVudDogJ2FueXRhcCcsXG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbSGFtbWVyLlRhcCwge1xuICBlbmFibGU6IGZhbHNlXG59XV0gOiBudWxsO1xuZXhwb3J0IHZhciBSRUNPR05JWkVSX0NPTVBBVElCTEVfTUFQID0ge1xuICB0cmlwYW46IFsncm90YXRlJywgJ3BpbmNoJywgJ3BhbiddLFxuICByb3RhdGU6IFsncGluY2gnXSxcbiAgcGluY2g6IFsncGFuJ10sXG4gIHBhbjogWydwcmVzcycsICdkb3VibGV0YXAnLCAnYW55dGFwJywgJ3RhcCddLFxuICBkb3VibGV0YXA6IFsnYW55dGFwJ10sXG4gIGFueXRhcDogWyd0YXAnXVxufTtcbmV4cG9ydCB2YXIgUkVDT0dOSVpFUl9GQUxMQkFDS19NQVAgPSB7XG4gIGRvdWJsZXRhcDogWyd0YXAnXVxufTtcbmV4cG9ydCB2YXIgQkFTSUNfRVZFTlRfQUxJQVNFUyA9IHtcbiAgcG9pbnRlcmRvd246ICdwb2ludGVyZG93bicsXG4gIHBvaW50ZXJtb3ZlOiAncG9pbnRlcm1vdmUnLFxuICBwb2ludGVydXA6ICdwb2ludGVydXAnLFxuICB0b3VjaHN0YXJ0OiAncG9pbnRlcmRvd24nLFxuICB0b3VjaG1vdmU6ICdwb2ludGVybW92ZScsXG4gIHRvdWNoZW5kOiAncG9pbnRlcnVwJyxcbiAgbW91c2Vkb3duOiAncG9pbnRlcmRvd24nLFxuICBtb3VzZW1vdmU6ICdwb2ludGVybW92ZScsXG4gIG1vdXNldXA6ICdwb2ludGVydXAnXG59O1xuZXhwb3J0IHZhciBJTlBVVF9FVkVOVF9UWVBFUyA9IHtcbiAgS0VZX0VWRU5UUzogWydrZXlkb3duJywgJ2tleXVwJ10sXG4gIE1PVVNFX0VWRU5UUzogWydtb3VzZWRvd24nLCAnbW91c2Vtb3ZlJywgJ21vdXNldXAnLCAnbW91c2VvdmVyJywgJ21vdXNlb3V0JywgJ21vdXNlbGVhdmUnXSxcbiAgV0hFRUxfRVZFTlRTOiBbJ3doZWVsJywgJ21vdXNld2hlZWwnXVxufTtcbmV4cG9ydCB2YXIgRVZFTlRfUkVDT0dOSVpFUl9NQVAgPSB7XG4gIHRhcDogJ3RhcCcsXG4gIGFueXRhcDogJ2FueXRhcCcsXG4gIGRvdWJsZXRhcDogJ2RvdWJsZXRhcCcsXG4gIHByZXNzOiAncHJlc3MnLFxuICBwaW5jaDogJ3BpbmNoJyxcbiAgcGluY2hpbjogJ3BpbmNoJyxcbiAgcGluY2hvdXQ6ICdwaW5jaCcsXG4gIHBpbmNoc3RhcnQ6ICdwaW5jaCcsXG4gIHBpbmNobW92ZTogJ3BpbmNoJyxcbiAgcGluY2hlbmQ6ICdwaW5jaCcsXG4gIHBpbmNoY2FuY2VsOiAncGluY2gnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByb3RhdGVzdGFydDogJ3JvdGF0ZScsXG4gIHJvdGF0ZW1vdmU6ICdyb3RhdGUnLFxuICByb3RhdGVlbmQ6ICdyb3RhdGUnLFxuICByb3RhdGVjYW5jZWw6ICdyb3RhdGUnLFxuICB0cmlwYW46ICd0cmlwYW4nLFxuICB0cmlwYW5zdGFydDogJ3RyaXBhbicsXG4gIHRyaXBhbm1vdmU6ICd0cmlwYW4nLFxuICB0cmlwYW51cDogJ3RyaXBhbicsXG4gIHRyaXBhbmRvd246ICd0cmlwYW4nLFxuICB0cmlwYW5sZWZ0OiAndHJpcGFuJyxcbiAgdHJpcGFucmlnaHQ6ICd0cmlwYW4nLFxuICB0cmlwYW5lbmQ6ICd0cmlwYW4nLFxuICB0cmlwYW5jYW5jZWw6ICd0cmlwYW4nLFxuICBwYW46ICdwYW4nLFxuICBwYW5zdGFydDogJ3BhbicsXG4gIHBhbm1vdmU6ICdwYW4nLFxuICBwYW51cDogJ3BhbicsXG4gIHBhbmRvd246ICdwYW4nLFxuICBwYW5sZWZ0OiAncGFuJyxcbiAgcGFucmlnaHQ6ICdwYW4nLFxuICBwYW5lbmQ6ICdwYW4nLFxuICBwYW5jYW5jZWw6ICdwYW4nLFxuICBzd2lwZTogJ3N3aXBlJyxcbiAgc3dpcGVsZWZ0OiAnc3dpcGUnLFxuICBzd2lwZXJpZ2h0OiAnc3dpcGUnLFxuICBzd2lwZXVwOiAnc3dpcGUnLFxuICBzd2lwZWRvd246ICdzd2lwZSdcbn07XG5leHBvcnQgdmFyIEdFU1RVUkVfRVZFTlRfQUxJQVNFUyA9IHtcbiAgY2xpY2s6ICd0YXAnLFxuICBhbnljbGljazogJ2FueXRhcCcsXG4gIGRibGNsaWNrOiAnZG91YmxldGFwJyxcbiAgbW91c2Vkb3duOiAncG9pbnRlcmRvd24nLFxuICBtb3VzZW1vdmU6ICdwb2ludGVybW92ZScsXG4gIG1vdXNldXA6ICdwb2ludGVydXAnLFxuICBtb3VzZW92ZXI6ICdwb2ludGVyb3ZlcicsXG4gIG1vdXNlb3V0OiAncG9pbnRlcm91dCcsXG4gIG1vdXNlbGVhdmU6ICdwb2ludGVybGVhdmUnXG59OyIsImV4cG9ydCB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCA/IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSA6ICcnO1xudmFyIHdpbmRvd18gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbnZhciBnbG9iYWxfID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3c7XG52YXIgZG9jdW1lbnRfID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDoge307XG5leHBvcnQgeyB3aW5kb3dfIGFzIHdpbmRvdywgZ2xvYmFsXyBhcyBnbG9iYWwsIGRvY3VtZW50XyBhcyBkb2N1bWVudCB9O1xudmFyIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgZ2V0IHBhc3NpdmUoKSB7XG4gICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICB9O1xuICB3aW5kb3dfLmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgd2luZG93Xy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG59IGNhdGNoIChlcnIpIHt9XG5cbmV4cG9ydCB7IHBhc3NpdmVTdXBwb3J0ZWQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBJTlBVVF9FVkVOVF9UWVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB3aW5kb3csIHVzZXJBZ2VudCwgcGFzc2l2ZVN1cHBvcnRlZCB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xudmFyIGZpcmVmb3ggPSB1c2VyQWdlbnQuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMTtcbnZhciBXSEVFTF9FVkVOVFMgPSBJTlBVVF9FVkVOVF9UWVBFUy5XSEVFTF9FVkVOVFM7XG52YXIgRVZFTlRfVFlQRSA9ICd3aGVlbCc7XG52YXIgV0hFRUxfREVMVEFfTUFHSUNfU0NBTEVSID0gNC4wMDAyNDQxNDA2MjU7XG52YXIgV0hFRUxfREVMVEFfUEVSX0xJTkUgPSA0MDtcbnZhciBTSElGVF9NVUxUSVBMSUVSID0gMC4yNTtcblxudmFyIFdoZWVsSW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBXaGVlbElucHV0KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXaGVlbElucHV0KTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZW5hYmxlOiB0cnVlXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdGhpcy5ldmVudHMgPSBXSEVFTF9FVkVOVFMuY29uY2F0KG9wdGlvbnMuZXZlbnRzIHx8IFtdKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpcy5oYW5kbGVFdmVudCwgcGFzc2l2ZVN1cHBvcnRlZCA/IHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0gOiBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2hlZWxJbnB1dCwgW3tcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpczIuaGFuZGxlRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZUV2ZW50VHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudFR5cGUoZXZlbnRUeXBlLCBlbmFibGVkKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBFVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBlbmFibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gZXZlbnQuZGVsdGFZO1xuXG4gICAgICBpZiAod2luZG93LldoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKGZpcmVmb3ggJiYgZXZlbnQuZGVsdGFNb2RlID09PSB3aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUwpIHtcbiAgICAgICAgICB2YWx1ZSAvPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWx0YU1vZGUgPT09IHdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FKSB7XG4gICAgICAgICAgdmFsdWUgKj0gV0hFRUxfREVMVEFfUEVSX0xJTkU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHdoZWVsUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgIH07XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiB2YWx1ZSAlIFdIRUVMX0RFTFRBX01BR0lDX1NDQUxFUiA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUgLyBXSEVFTF9ERUxUQV9NQUdJQ19TQ0FMRVIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIFNISUZUX01VTFRJUExJRVI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uV2hlZWwoZXZlbnQsIC12YWx1ZSwgd2hlZWxQb3NpdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vbldoZWVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbldoZWVsKHNyY0V2ZW50LCBkZWx0YSwgcG9zaXRpb24pIHtcbiAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICB0eXBlOiBFVkVOVF9UWVBFLFxuICAgICAgICBjZW50ZXI6IHBvc2l0aW9uLFxuICAgICAgICBkZWx0YTogZGVsdGEsXG4gICAgICAgIHNyY0V2ZW50OiBzcmNFdmVudCxcbiAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgIHRhcmdldDogc3JjRXZlbnQudGFyZ2V0XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gV2hlZWxJbnB1dDtcbn0oKTtcblxuZXhwb3J0IHsgV2hlZWxJbnB1dCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgSU5QVVRfRVZFTlRfVFlQRVMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xudmFyIE1PVVNFX0VWRU5UUyA9IElOUFVUX0VWRU5UX1RZUEVTLk1PVVNFX0VWRU5UUztcbnZhciBNT1ZFX0VWRU5UX1RZUEUgPSAncG9pbnRlcm1vdmUnO1xudmFyIE9WRVJfRVZFTlRfVFlQRSA9ICdwb2ludGVyb3Zlcic7XG52YXIgT1VUX0VWRU5UX1RZUEUgPSAncG9pbnRlcm91dCc7XG52YXIgTEVBVkVfRVZFTlRfVFlQRSA9ICdwb2ludGVybGVhdmUnO1xuXG52YXIgTW92ZUlucHV0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTW92ZUlucHV0KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb3ZlSW5wdXQpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmVuYWJsZU1vdmVFdmVudCA9IHRoaXMub3B0aW9ucy5lbmFibGU7XG4gICAgdGhpcy5lbmFibGVMZWF2ZUV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmVuYWJsZU91dEV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmVuYWJsZU92ZXJFdmVudCA9IHRoaXMub3B0aW9ucy5lbmFibGU7XG4gICAgdGhpcy5ldmVudHMgPSBNT1VTRV9FVkVOVFMuY29uY2F0KG9wdGlvbnMuZXZlbnRzIHx8IFtdKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTW92ZUlucHV0LCBbe1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIF90aGlzMi5oYW5kbGVFdmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5hYmxlRXZlbnRUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50VHlwZShldmVudFR5cGUsIGVuYWJsZWQpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09IE1PVkVfRVZFTlRfVFlQRSkge1xuICAgICAgICB0aGlzLmVuYWJsZU1vdmVFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFR5cGUgPT09IE9WRVJfRVZFTlRfVFlQRSkge1xuICAgICAgICB0aGlzLmVuYWJsZU92ZXJFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFR5cGUgPT09IE9VVF9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlT3V0RXZlbnQgPSBlbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBMRUFWRV9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlTGVhdmVFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZU92ZXJFdmVudChldmVudCk7XG4gICAgICB0aGlzLmhhbmRsZU91dEV2ZW50KGV2ZW50KTtcbiAgICAgIHRoaXMuaGFuZGxlTGVhdmVFdmVudChldmVudCk7XG4gICAgICB0aGlzLmhhbmRsZU1vdmVFdmVudChldmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZU92ZXJFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVPdmVyRXZlbnQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZU92ZXJFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlb3ZlcicpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHR5cGU6IE9WRVJfRVZFTlRfVFlQRSxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVPdXRFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVPdXRFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlT3V0RXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHR5cGU6IE9VVF9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUxlYXZlRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlTGVhdmVFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlTGVhdmVFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgICB0eXBlOiBMRUFWRV9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZU1vdmVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVNb3ZlRXZlbnQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZU1vdmVFdmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA+PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICAgICAgICAgIGlmIChldmVudC53aGljaCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgdHlwZTogTU9WRV9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICBwb2ludGVyVHlwZTogJ21vdXNlJyxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1vdmVJbnB1dDtcbn0oKTtcblxuZXhwb3J0IHsgTW92ZUlucHV0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBJTlBVVF9FVkVOVF9UWVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG52YXIgS0VZX0VWRU5UUyA9IElOUFVUX0VWRU5UX1RZUEVTLktFWV9FVkVOVFM7XG52YXIgRE9XTl9FVkVOVF9UWVBFID0gJ2tleWRvd24nO1xudmFyIFVQX0VWRU5UX1RZUEUgPSAna2V5dXAnO1xuXG52YXIgS2V5SW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBLZXlJbnB1dChlbGVtZW50LCBjYWxsYmFjaykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgS2V5SW5wdXQpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmVuYWJsZURvd25FdmVudCA9IHRoaXMub3B0aW9ucy5lbmFibGU7XG4gICAgdGhpcy5lbmFibGVVcEV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmV2ZW50cyA9IEtFWV9FVkVOVFMuY29uY2F0KG9wdGlvbnMuZXZlbnRzIHx8IFtdKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIGVsZW1lbnQudGFiSW5kZXggPSBvcHRpb25zLnRhYkluZGV4IHx8IDA7XG4gICAgZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoS2V5SW5wdXQsIFt7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgX3RoaXMyLmhhbmRsZUV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmFibGVFdmVudFR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlRXZlbnRUeXBlKGV2ZW50VHlwZSwgZW5hYmxlZCkge1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gRE9XTl9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlRG93bkV2ZW50ID0gZW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gVVBfRVZFTlRfVFlQRSkge1xuICAgICAgICB0aGlzLmVuYWJsZVVwRXZlbnQgPSBlbmFibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgdmFyIHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcblxuICAgICAgaWYgKHRhcmdldEVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiB0YXJnZXRFbGVtZW50LnR5cGUgPT09ICd0ZXh0JyB8fCB0YXJnZXRFbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbmFibGVEb3duRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICAgIHR5cGU6IERPV05fRVZFTlRfVFlQRSxcbiAgICAgICAgICBzcmNFdmVudDogZXZlbnQsXG4gICAgICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVuYWJsZVVwRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICB0eXBlOiBVUF9FVkVOVF9UWVBFLFxuICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gS2V5SW5wdXQ7XG59KCk7XG5cbmV4cG9ydCB7IEtleUlucHV0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG52YXIgRVZFTlRfVFlQRSA9ICdjb250ZXh0bWVudSc7XG5cbnZhciBDb250ZXh0bWVudUlucHV0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29udGV4dG1lbnVJbnB1dChlbGVtZW50LCBjYWxsYmFjaykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb250ZXh0bWVudUlucHV0KTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZW5hYmxlOiB0cnVlXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVFdmVudCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29udGV4dG1lbnVJbnB1dCwgW3tcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZUV2ZW50VHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudFR5cGUoZXZlbnRUeXBlLCBlbmFibGVkKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBFVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBlbmFibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIHR5cGU6IEVWRU5UX1RZUEUsXG4gICAgICAgIGNlbnRlcjoge1xuICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgICB9LFxuICAgICAgICBzcmNFdmVudDogZXZlbnQsXG4gICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbnRleHRtZW51SW5wdXQ7XG59KCk7XG5cbmV4cG9ydCB7IENvbnRleHRtZW51SW5wdXQgYXMgZGVmYXVsdCB9OyIsInZhciBET1dOX0VWRU5UID0gMTtcbnZhciBNT1ZFX0VWRU5UID0gMjtcbnZhciBVUF9FVkVOVCA9IDQ7XG52YXIgTU9VU0VfRVZFTlRTID0ge1xuICBwb2ludGVyZG93bjogRE9XTl9FVkVOVCxcbiAgcG9pbnRlcm1vdmU6IE1PVkVfRVZFTlQsXG4gIHBvaW50ZXJ1cDogVVBfRVZFTlQsXG4gIG1vdXNlZG93bjogRE9XTl9FVkVOVCxcbiAgbW91c2Vtb3ZlOiBNT1ZFX0VWRU5ULFxuICBtb3VzZXVwOiBVUF9FVkVOVFxufTtcbnZhciBNT1VTRV9FVkVOVF9XSElDSF9MRUZUID0gMTtcbnZhciBNT1VTRV9FVkVOVF9XSElDSF9NSURETEUgPSAyO1xudmFyIE1PVVNFX0VWRU5UX1dISUNIX1JJR0hUID0gMztcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05fTEVGVCA9IDA7XG52YXIgTU9VU0VfRVZFTlRfQlVUVE9OX01JRERMRSA9IDE7XG52YXIgTU9VU0VfRVZFTlRfQlVUVE9OX1JJR0hUID0gMjtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05TX0xFRlRfTUFTSyA9IDE7XG52YXIgTU9VU0VfRVZFTlRfQlVUVE9OU19SSUdIVF9NQVNLID0gMjtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05TX01JRERMRV9NQVNLID0gNDtcbmV4cG9ydCBmdW5jdGlvbiB3aGljaEJ1dHRvbnMoZXZlbnQpIHtcbiAgdmFyIGV2ZW50VHlwZSA9IE1PVVNFX0VWRU5UU1tldmVudC5zcmNFdmVudC50eXBlXTtcblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIF9ldmVudCRzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50LFxuICAgICAgYnV0dG9ucyA9IF9ldmVudCRzcmNFdmVudC5idXR0b25zLFxuICAgICAgYnV0dG9uID0gX2V2ZW50JHNyY0V2ZW50LmJ1dHRvbixcbiAgICAgIHdoaWNoID0gX2V2ZW50JHNyY0V2ZW50LndoaWNoO1xuICB2YXIgbGVmdEJ1dHRvbiA9IGZhbHNlO1xuICB2YXIgbWlkZGxlQnV0dG9uID0gZmFsc2U7XG4gIHZhciByaWdodEJ1dHRvbiA9IGZhbHNlO1xuXG4gIGlmIChldmVudFR5cGUgPT09IFVQX0VWRU5UIHx8IGV2ZW50VHlwZSA9PT0gTU9WRV9FVkVOVCAmJiAhTnVtYmVyLmlzRmluaXRlKGJ1dHRvbnMpKSB7XG4gICAgbGVmdEJ1dHRvbiA9IHdoaWNoID09PSBNT1VTRV9FVkVOVF9XSElDSF9MRUZUO1xuICAgIG1pZGRsZUJ1dHRvbiA9IHdoaWNoID09PSBNT1VTRV9FVkVOVF9XSElDSF9NSURETEU7XG4gICAgcmlnaHRCdXR0b24gPSB3aGljaCA9PT0gTU9VU0VfRVZFTlRfV0hJQ0hfUklHSFQ7XG4gIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBNT1ZFX0VWRU5UKSB7XG4gICAgbGVmdEJ1dHRvbiA9IEJvb2xlYW4oYnV0dG9ucyAmIE1PVVNFX0VWRU5UX0JVVFRPTlNfTEVGVF9NQVNLKTtcbiAgICBtaWRkbGVCdXR0b24gPSBCb29sZWFuKGJ1dHRvbnMgJiBNT1VTRV9FVkVOVF9CVVRUT05TX01JRERMRV9NQVNLKTtcbiAgICByaWdodEJ1dHRvbiA9IEJvb2xlYW4oYnV0dG9ucyAmIE1PVVNFX0VWRU5UX0JVVFRPTlNfUklHSFRfTUFTSyk7XG4gIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBET1dOX0VWRU5UKSB7XG4gICAgbGVmdEJ1dHRvbiA9IGJ1dHRvbiA9PT0gTU9VU0VfRVZFTlRfQlVUVE9OX0xFRlQ7XG4gICAgbWlkZGxlQnV0dG9uID0gYnV0dG9uID09PSBNT1VTRV9FVkVOVF9CVVRUT05fTUlERExFO1xuICAgIHJpZ2h0QnV0dG9uID0gYnV0dG9uID09PSBNT1VTRV9FVkVOVF9CVVRUT05fUklHSFQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxlZnRCdXR0b246IGxlZnRCdXR0b24sXG4gICAgbWlkZGxlQnV0dG9uOiBtaWRkbGVCdXR0b24sXG4gICAgcmlnaHRCdXR0b246IHJpZ2h0QnV0dG9uXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T2Zmc2V0UG9zaXRpb24oZXZlbnQsIHJvb3RFbGVtZW50KSB7XG4gIHZhciBzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50O1xuXG4gIGlmICghZXZlbnQuY2VudGVyICYmICFOdW1iZXIuaXNGaW5pdGUoc3JjRXZlbnQuY2xpZW50WCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBjZW50ZXIgPSBldmVudC5jZW50ZXIgfHwge1xuICAgIHg6IHNyY0V2ZW50LmNsaWVudFgsXG4gICAgeTogc3JjRXZlbnQuY2xpZW50WVxuICB9O1xuICB2YXIgcmVjdCA9IHJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcmVjdC53aWR0aCAvIHJvb3RFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByZWN0LmhlaWdodCAvIHJvb3RFbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICB2YXIgb2Zmc2V0Q2VudGVyID0ge1xuICAgIHg6IChjZW50ZXIueCAtIHJlY3QubGVmdCAtIHJvb3RFbGVtZW50LmNsaWVudExlZnQpIC8gc2NhbGVYLFxuICAgIHk6IChjZW50ZXIueSAtIHJlY3QudG9wIC0gcm9vdEVsZW1lbnQuY2xpZW50VG9wKSAvIHNjYWxlWVxuICB9O1xuICByZXR1cm4ge1xuICAgIGNlbnRlcjogY2VudGVyLFxuICAgIG9mZnNldENlbnRlcjogb2Zmc2V0Q2VudGVyXG4gIH07XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgd2hpY2hCdXR0b25zLCBnZXRPZmZzZXRQb3NpdGlvbiB9IGZyb20gJy4vZXZlbnQtdXRpbHMnO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgc3JjRWxlbWVudDogJ3Jvb3QnLFxuICBwcmlvcml0eTogMFxufTtcblxudmFyIEV2ZW50UmVnaXN0cmFyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRSZWdpc3RyYXIoZXZlbnRNYW5hZ2VyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50UmVnaXN0cmFyKTtcblxuICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gZXZlbnRNYW5hZ2VyO1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB0aGlzLmhhbmRsZXJzQnlFbGVtZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRSZWdpc3RyYXIsIFt7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5fYWN0aXZlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHR5cGUsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHZhciBvbmNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgICAgIHZhciBwYXNzaXZlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBmYWxzZTtcbiAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMsXG4gICAgICAgICAgaGFuZGxlcnNCeUVsZW1lbnQgPSB0aGlzLmhhbmRsZXJzQnlFbGVtZW50O1xuXG4gICAgICBpZiAob3B0cyAmJiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnIHx8IG9wdHMuYWRkRXZlbnRMaXN0ZW5lcikpIHtcbiAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICBzcmNFbGVtZW50OiBvcHRzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG9wdHMgPSBvcHRzID8gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRzKSA6IERFRkFVTFRfT1BUSU9OUztcbiAgICAgIHZhciBlbnRyaWVzID0gaGFuZGxlcnNCeUVsZW1lbnQuZ2V0KG9wdHMuc3JjRWxlbWVudCk7XG5cbiAgICAgIGlmICghZW50cmllcykge1xuICAgICAgICBlbnRyaWVzID0gW107XG4gICAgICAgIGhhbmRsZXJzQnlFbGVtZW50LnNldChvcHRzLnNyY0VsZW1lbnQsIGVudHJpZXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICAgIHNyY0VsZW1lbnQ6IG9wdHMuc3JjRWxlbWVudCxcbiAgICAgICAgcHJpb3JpdHk6IG9wdHMucHJpb3JpdHlcbiAgICAgIH07XG5cbiAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgIGVudHJ5Lm9uY2UgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFzc2l2ZSkge1xuICAgICAgICBlbnRyeS5wYXNzaXZlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlcnMucHVzaChlbnRyeSk7XG4gICAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgIWVudHJ5LnBhc3NpdmU7XG4gICAgICB2YXIgaW5zZXJ0UG9zaXRpb24gPSBlbnRyaWVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChpbnNlcnRQb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgIGlmIChlbnRyaWVzW2luc2VydFBvc2l0aW9uXS5wcmlvcml0eSA+PSBlbnRyeS5wcmlvcml0eSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zZXJ0UG9zaXRpb24tLTtcbiAgICAgIH1cblxuICAgICAgZW50cmllcy5zcGxpY2UoaW5zZXJ0UG9zaXRpb24gKyAxLCAwLCBlbnRyeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUodHlwZSwgaGFuZGxlcikge1xuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycyxcbiAgICAgICAgICBoYW5kbGVyc0J5RWxlbWVudCA9IHRoaXMuaGFuZGxlcnNCeUVsZW1lbnQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSBoYW5kbGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgZW50cnkgPSBoYW5kbGVyc1tpXTtcblxuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gdHlwZSAmJiBlbnRyeS5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHZhciBlbnRyaWVzID0gaGFuZGxlcnNCeUVsZW1lbnQuZ2V0KGVudHJ5LnNyY0VsZW1lbnQpO1xuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGVudHJpZXMuaW5kZXhPZihlbnRyeSksIDEpO1xuXG4gICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoYW5kbGVyc0J5RWxlbWVudC5kZWxldGUoZW50cnkuc3JjRWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGhhbmRsZXJzLnNvbWUoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAhZW50cnkucGFzc2l2ZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1qb2xuaXJFdmVudCA9IHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2ZW50KTtcblxuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnNyY0V2ZW50LnRhcmdldDtcblxuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IG1qb2xuaXJFdmVudC5yb290RWxlbWVudCkge1xuICAgICAgICB0aGlzLl9lbWl0KG1qb2xuaXJFdmVudCwgdGFyZ2V0KTtcblxuICAgICAgICBpZiAobWpvbG5pckV2ZW50LmhhbmRsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZW1pdChtam9sbmlyRXZlbnQsICdyb290Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9lbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9lbWl0KGV2ZW50LCBzcmNFbGVtZW50KSB7XG4gICAgICB2YXIgZW50cmllcyA9IHRoaXMuaGFuZGxlcnNCeUVsZW1lbnQuZ2V0KHNyY0VsZW1lbnQpO1xuXG4gICAgICBpZiAoZW50cmllcykge1xuICAgICAgICB2YXIgaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICBldmVudC5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gZnVuY3Rpb24gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgIGV2ZW50LmhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgIGltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGVudHJpZXNUb1JlbW92ZSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBfZW50cmllcyRpID0gZW50cmllc1tpXSxcbiAgICAgICAgICAgICAgdHlwZSA9IF9lbnRyaWVzJGkudHlwZSxcbiAgICAgICAgICAgICAgaGFuZGxlciA9IF9lbnRyaWVzJGkuaGFuZGxlcixcbiAgICAgICAgICAgICAgb25jZSA9IF9lbnRyaWVzJGkub25jZTtcbiAgICAgICAgICBoYW5kbGVyKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBzdG9wUHJvcGFnYXRpb24sXG4gICAgICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvblxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyaWVzW2ldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBfZW50cmllc1RvUmVtb3ZlJF9pID0gZW50cmllc1RvUmVtb3ZlW19pXSxcbiAgICAgICAgICAgICAgX3R5cGUgPSBfZW50cmllc1RvUmVtb3ZlJF9pLnR5cGUsXG4gICAgICAgICAgICAgIF9oYW5kbGVyID0gX2VudHJpZXNUb1JlbW92ZSRfaS5oYW5kbGVyO1xuICAgICAgICAgIHRoaXMucmVtb3ZlKF90eXBlLCBfaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX25vcm1hbGl6ZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9ub3JtYWxpemVFdmVudChldmVudCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gdGhpcy5ldmVudE1hbmFnZXIuZWxlbWVudDtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBldmVudCwgd2hpY2hCdXR0b25zKGV2ZW50KSwgZ2V0T2Zmc2V0UG9zaXRpb24oZXZlbnQsIHJvb3RFbGVtZW50KSwge1xuICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgcm9vdEVsZW1lbnQ6IHJvb3RFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRSZWdpc3RyYXI7XG59KCk7XG5cbmV4cG9ydCB7IEV2ZW50UmVnaXN0cmFyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tICcuL3V0aWxzL2hhbW1lcic7XG5pbXBvcnQgV2hlZWxJbnB1dCBmcm9tICcuL2lucHV0cy93aGVlbC1pbnB1dCc7XG5pbXBvcnQgTW92ZUlucHV0IGZyb20gJy4vaW5wdXRzL21vdmUtaW5wdXQnO1xuaW1wb3J0IEtleUlucHV0IGZyb20gJy4vaW5wdXRzL2tleS1pbnB1dCc7XG5pbXBvcnQgQ29udGV4dG1lbnVJbnB1dCBmcm9tICcuL2lucHV0cy9jb250ZXh0bWVudS1pbnB1dCc7XG5pbXBvcnQgRXZlbnRSZWdpc3RyYXIgZnJvbSAnLi91dGlscy9ldmVudC1yZWdpc3RyYXInO1xuaW1wb3J0IHsgQkFTSUNfRVZFTlRfQUxJQVNFUywgRVZFTlRfUkVDT0dOSVpFUl9NQVAsIEdFU1RVUkVfRVZFTlRfQUxJQVNFUywgUkVDT0dOSVpFUlMsIFJFQ09HTklaRVJfQ09NUEFUSUJMRV9NQVAsIFJFQ09HTklaRVJfRkFMTEJBQ0tfTUFQIH0gZnJvbSAnLi9jb25zdGFudHMnO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgZXZlbnRzOiBudWxsLFxuICByZWNvZ25pemVyczogbnVsbCxcbiAgcmVjb2duaXplck9wdGlvbnM6IHt9LFxuICBNYW5hZ2VyOiBNYW5hZ2VyLFxuICB0b3VjaEFjdGlvbjogJ25vbmUnLFxuICB0YWJJbmRleDogMFxufTtcblxudmFyIEV2ZW50TWFuYWdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50TWFuYWdlcigpIHtcbiAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRNYW5hZ2VyKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb25CYXNpY0lucHV0ID0gdGhpcy5fb25CYXNpY0lucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25PdGhlckV2ZW50ID0gdGhpcy5fb25PdGhlckV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgIHZhciBldmVudHMgPSBvcHRpb25zLmV2ZW50cztcblxuICAgIGlmIChldmVudHMpIHtcbiAgICAgIHRoaXMub24oZXZlbnRzKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJzZXRFbGVtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgTWFuYWdlckNsYXNzID0gb3B0aW9ucy5NYW5hZ2VyO1xuICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IE1hbmFnZXJDbGFzcyhlbGVtZW50LCB7XG4gICAgICAgIHRvdWNoQWN0aW9uOiBvcHRpb25zLnRvdWNoQWN0aW9uLFxuICAgICAgICByZWNvZ25pemVyczogb3B0aW9ucy5yZWNvZ25pemVycyB8fCBSRUNPR05JWkVSU1xuICAgICAgfSkub24oJ2hhbW1lci5pbnB1dCcsIHRoaXMuX29uQmFzaWNJbnB1dCk7XG5cbiAgICAgIGlmICghb3B0aW9ucy5yZWNvZ25pemVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhSRUNPR05JWkVSX0NPTVBBVElCTEVfTUFQKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgdmFyIHJlY29nbml6ZXIgPSBfdGhpcy5tYW5hZ2VyLmdldChuYW1lKTtcblxuICAgICAgICAgIGlmIChyZWNvZ25pemVyKSB7XG4gICAgICAgICAgICBSRUNPR05JWkVSX0NPTVBBVElCTEVfTUFQW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKG90aGVyTmFtZSkge1xuICAgICAgICAgICAgICByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgob3RoZXJOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHJlY29nbml6ZXJOYW1lIGluIG9wdGlvbnMucmVjb2duaXplck9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHJlY29nbml6ZXIgPSB0aGlzLm1hbmFnZXIuZ2V0KHJlY29nbml6ZXJOYW1lKTtcblxuICAgICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICAgIHZhciByZWNvZ25pemVyT3B0aW9uID0gb3B0aW9ucy5yZWNvZ25pemVyT3B0aW9uc1tyZWNvZ25pemVyTmFtZV07XG4gICAgICAgICAgZGVsZXRlIHJlY29nbml6ZXJPcHRpb24uZW5hYmxlO1xuICAgICAgICAgIHJlY29nbml6ZXIuc2V0KHJlY29nbml6ZXJPcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2hlZWxJbnB1dCA9IG5ldyBXaGVlbElucHV0KGVsZW1lbnQsIHRoaXMuX29uT3RoZXJFdmVudCwge1xuICAgICAgICBlbmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMubW92ZUlucHV0ID0gbmV3IE1vdmVJbnB1dChlbGVtZW50LCB0aGlzLl9vbk90aGVyRXZlbnQsIHtcbiAgICAgICAgZW5hYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLmtleUlucHV0ID0gbmV3IEtleUlucHV0KGVsZW1lbnQsIHRoaXMuX29uT3RoZXJFdmVudCwge1xuICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICB0YWJJbmRleDogb3B0aW9ucy50YWJJbmRleFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbnRleHRtZW51SW5wdXQgPSBuZXcgQ29udGV4dG1lbnVJbnB1dChlbGVtZW50LCB0aGlzLl9vbk90aGVyRXZlbnQsIHtcbiAgICAgICAgZW5hYmxlOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmV2ZW50cyksXG4gICAgICAgICAgX3N0ZXA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIF9zdGVwJHZhbHVlID0gX3NsaWNlZFRvQXJyYXkoX3N0ZXAudmFsdWUsIDIpLFxuICAgICAgICAgICAgICBldmVudEFsaWFzID0gX3N0ZXAkdmFsdWVbMF0sXG4gICAgICAgICAgICAgIGV2ZW50UmVnaXN0cmFyID0gX3N0ZXAkdmFsdWVbMV07XG5cbiAgICAgICAgICBpZiAoIWV2ZW50UmVnaXN0cmFyLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlUmVjb2duaXplcihldmVudFJlZ2lzdHJhci5yZWNvZ25pemVyTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5vbihldmVudEFsaWFzLCBldmVudFJlZ2lzdHJhci5oYW5kbGVFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy53aGVlbElucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3ZlSW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmtleUlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb250ZXh0bWVudUlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy53aGVlbElucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3ZlSW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLmtleUlucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb250ZXh0bWVudUlucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHRoaXMuX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgZmFsc2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHRoaXMuX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndhdGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdhdGNoKGV2ZW50LCBoYW5kbGVyLCBvcHRzKSB7XG4gICAgICB0aGlzLl9hZGRFdmVudEhhbmRsZXIoZXZlbnQsIGhhbmRsZXIsIG9wdHMsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib2ZmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9mZihldmVudCwgaGFuZGxlcikge1xuICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRIYW5kbGVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3RvZ2dsZVJlY29nbml6ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3RvZ2dsZVJlY29nbml6ZXIobmFtZSwgZW5hYmxlZCkge1xuICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7XG5cbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvZ25pemVyID0gbWFuYWdlci5nZXQobmFtZSk7XG5cbiAgICAgIGlmIChyZWNvZ25pemVyICYmIHJlY29nbml6ZXIub3B0aW9ucy5lbmFibGUgIT09IGVuYWJsZWQpIHtcbiAgICAgICAgcmVjb2duaXplci5zZXQoe1xuICAgICAgICAgIGVuYWJsZTogZW5hYmxlZFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGZhbGxiYWNrUmVjb2duaXplcnMgPSBSRUNPR05JWkVSX0ZBTExCQUNLX01BUFtuYW1lXTtcblxuICAgICAgICBpZiAoZmFsbGJhY2tSZWNvZ25pemVycyAmJiAhdGhpcy5vcHRpb25zLnJlY29nbml6ZXJzKSB7XG4gICAgICAgICAgZmFsbGJhY2tSZWNvZ25pemVycy5mb3JFYWNoKGZ1bmN0aW9uIChvdGhlck5hbWUpIHtcbiAgICAgICAgICAgIHZhciBvdGhlclJlY29nbml6ZXIgPSBtYW5hZ2VyLmdldChvdGhlck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICBvdGhlclJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUobmFtZSk7XG4gICAgICAgICAgICAgIHJlY29nbml6ZXIuZHJvcFJlcXVpcmVGYWlsdXJlKG90aGVyTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdGhlclJlY29nbml6ZXIuZHJvcFJlcXVpcmVGYWlsdXJlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2hlZWxJbnB1dC5lbmFibGVFdmVudFR5cGUobmFtZSwgZW5hYmxlZCk7XG4gICAgICB0aGlzLm1vdmVJbnB1dC5lbmFibGVFdmVudFR5cGUobmFtZSwgZW5hYmxlZCk7XG4gICAgICB0aGlzLmtleUlucHV0LmVuYWJsZUV2ZW50VHlwZShuYW1lLCBlbmFibGVkKTtcbiAgICAgIHRoaXMuY29udGV4dG1lbnVJbnB1dC5lbmFibGVFdmVudFR5cGUobmFtZSwgZW5hYmxlZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9hZGRFdmVudEhhbmRsZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgb25jZSwgcGFzc2l2ZSkge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3B0cyA9IGhhbmRsZXI7XG5cbiAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5fYWRkRXZlbnRIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRbZXZlbnROYW1lXSwgb3B0cywgb25jZSwgcGFzc2l2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBtYW5hZ2VyID0gdGhpcy5tYW5hZ2VyLFxuICAgICAgICAgIGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgICAgdmFyIGV2ZW50QWxpYXMgPSBHRVNUVVJFX0VWRU5UX0FMSUFTRVNbZXZlbnRdIHx8IGV2ZW50O1xuICAgICAgdmFyIGV2ZW50UmVnaXN0cmFyID0gZXZlbnRzLmdldChldmVudEFsaWFzKTtcblxuICAgICAgaWYgKCFldmVudFJlZ2lzdHJhcikge1xuICAgICAgICBldmVudFJlZ2lzdHJhciA9IG5ldyBFdmVudFJlZ2lzdHJhcih0aGlzKTtcbiAgICAgICAgZXZlbnRzLnNldChldmVudEFsaWFzLCBldmVudFJlZ2lzdHJhcik7XG4gICAgICAgIGV2ZW50UmVnaXN0cmFyLnJlY29nbml6ZXJOYW1lID0gRVZFTlRfUkVDT0dOSVpFUl9NQVBbZXZlbnRBbGlhc10gfHwgZXZlbnRBbGlhcztcblxuICAgICAgICBpZiAobWFuYWdlcikge1xuICAgICAgICAgIG1hbmFnZXIub24oZXZlbnRBbGlhcywgZXZlbnRSZWdpc3RyYXIuaGFuZGxlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50UmVnaXN0cmFyLmFkZChldmVudCwgaGFuZGxlciwgb3B0cywgb25jZSwgcGFzc2l2ZSk7XG5cbiAgICAgIGlmICghZXZlbnRSZWdpc3RyYXIuaXNFbXB0eSgpKSB7XG4gICAgICAgIHRoaXMuX3RvZ2dsZVJlY29nbml6ZXIoZXZlbnRSZWdpc3RyYXIucmVjb2duaXplck5hbWUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcmVtb3ZlRXZlbnRIYW5kbGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW1vdmVFdmVudEhhbmRsZXIoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudCkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUV2ZW50SGFuZGxlcihldmVudE5hbWUsIGV2ZW50W2V2ZW50TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgICB2YXIgZXZlbnRBbGlhcyA9IEdFU1RVUkVfRVZFTlRfQUxJQVNFU1tldmVudF0gfHwgZXZlbnQ7XG4gICAgICB2YXIgZXZlbnRSZWdpc3RyYXIgPSBldmVudHMuZ2V0KGV2ZW50QWxpYXMpO1xuXG4gICAgICBpZiAoIWV2ZW50UmVnaXN0cmFyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnRSZWdpc3RyYXIucmVtb3ZlKGV2ZW50LCBoYW5kbGVyKTtcblxuICAgICAgaWYgKGV2ZW50UmVnaXN0cmFyLmlzRW1wdHkoKSkge1xuICAgICAgICB2YXIgcmVjb2duaXplck5hbWUgPSBldmVudFJlZ2lzdHJhci5yZWNvZ25pemVyTmFtZTtcbiAgICAgICAgdmFyIGlzUmVjb2duaXplclVzZWQgPSBmYWxzZTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGV2ZW50cy52YWx1ZXMoKSksXG4gICAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGVoID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZWgucmVjb2duaXplck5hbWUgPT09IHJlY29nbml6ZXJOYW1lICYmICFlaC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgaXNSZWNvZ25pemVyVXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzUmVjb2duaXplclVzZWQpIHtcbiAgICAgICAgICB0aGlzLl90b2dnbGVSZWNvZ25pemVyKHJlY29nbml6ZXJOYW1lLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uQmFzaWNJbnB1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25CYXNpY0lucHV0KGV2ZW50KSB7XG4gICAgICB2YXIgc3JjRXZlbnQgPSBldmVudC5zcmNFdmVudDtcbiAgICAgIHZhciBhbGlhcyA9IEJBU0lDX0VWRU5UX0FMSUFTRVNbc3JjRXZlbnQudHlwZV07XG5cbiAgICAgIGlmIChhbGlhcykge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdChhbGlhcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25PdGhlckV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbk90aGVyRXZlbnQoZXZlbnQpIHtcbiAgICAgIHRoaXMubWFuYWdlci5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRNYW5hZ2VyO1xufSgpO1xuXG5leHBvcnQgeyBFdmVudE1hbmFnZXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgTWFwU3RhdGUgZnJvbSAnLi9tYXAtc3RhdGUnO1xuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhdG9yIH0gZnJvbSAnLi90cmFuc2l0aW9uJztcbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciwgeyBUUkFOU0lUSU9OX0VWRU5UUyB9IGZyb20gJy4vdHJhbnNpdGlvbi1tYW5hZ2VyJztcbnZhciBOT19UUkFOU0lUSU9OX1BST1BTID0ge1xuICB0cmFuc2l0aW9uRHVyYXRpb246IDBcbn07XG5leHBvcnQgdmFyIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTID0ge1xuICB0cmFuc2l0aW9uRHVyYXRpb246IDMwMCxcbiAgdHJhbnNpdGlvbkVhc2luZzogZnVuY3Rpb24gdHJhbnNpdGlvbkVhc2luZyh0KSB7XG4gICAgcmV0dXJuIHQ7XG4gIH0sXG4gIHRyYW5zaXRpb25JbnRlcnBvbGF0b3I6IG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSxcbiAgdHJhbnNpdGlvbkludGVycnVwdGlvbjogVFJBTlNJVElPTl9FVkVOVFMuQlJFQUtcbn07XG52YXIgREVGQVVMVF9JTkVSVElBID0gMzAwO1xuXG52YXIgSU5FUlRJQV9FQVNJTkcgPSBmdW5jdGlvbiBJTkVSVElBX0VBU0lORyh0KSB7XG4gIHJldHVybiAxIC0gKDEgLSB0KSAqICgxIC0gdCk7XG59O1xuXG52YXIgRVZFTlRfVFlQRVMgPSB7XG4gIFdIRUVMOiBbJ3doZWVsJ10sXG4gIFBBTjogWydwYW5zdGFydCcsICdwYW5tb3ZlJywgJ3BhbmVuZCddLFxuICBQSU5DSDogWydwaW5jaHN0YXJ0JywgJ3BpbmNobW92ZScsICdwaW5jaGVuZCddLFxuICBUUklQTEVfUEFOOiBbJ3RyaXBhbnN0YXJ0JywgJ3RyaXBhbm1vdmUnLCAndHJpcGFuZW5kJ10sXG4gIERPVUJMRV9UQVA6IFsnZG91YmxldGFwJ10sXG4gIEtFWUJPQVJEOiBbJ2tleWRvd24nXVxufTtcblxudmFyIE1hcENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcENvbnRyb2xsZXIoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXBDb250cm9sbGVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImV2ZW50c1wiLCBbXSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzY3JvbGxab29tXCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZHJhZ1BhblwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRyYWdSb3RhdGVcIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkb3VibGVDbGlja1pvb21cIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0b3VjaFpvb21cIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0b3VjaFJvdGF0ZVwiLCBmYWxzZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJrZXlib2FyZFwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9pbnRlcmFjdGlvblN0YXRlXCIsIHtcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfZXZlbnRzXCIsIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9zZXRJbnRlcmFjdGlvblN0YXRlXCIsIGZ1bmN0aW9uIChuZXdTdGF0ZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5faW50ZXJhY3Rpb25TdGF0ZSwgbmV3U3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMub25TdGF0ZUNoYW5nZSkge1xuICAgICAgICBfdGhpcy5vblN0YXRlQ2hhbmdlKF90aGlzLl9pbnRlcmFjdGlvblN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9vblRyYW5zaXRpb25cIiwgZnVuY3Rpb24gKG5ld1ZpZXdwb3J0LCBvbGRWaWV3cG9ydCkge1xuICAgICAgX3RoaXMub25WaWV3cG9ydENoYW5nZShuZXdWaWV3cG9ydCwgX3RoaXMuX2ludGVyYWN0aW9uU3RhdGUsIG9sZFZpZXdwb3J0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fdHJhbnNpdGlvbk1hbmFnZXIgPSBuZXcgVHJhbnNpdGlvbk1hbmFnZXIoe1xuICAgICAgb25WaWV3cG9ydENoYW5nZTogdGhpcy5fb25UcmFuc2l0aW9uLFxuICAgICAgb25TdGF0ZUNoYW5nZTogdGhpcy5fc2V0SW50ZXJhY3Rpb25TdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcENvbnRyb2xsZXIsIFt7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICB0aGlzLm1hcFN0YXRlID0gdGhpcy5nZXRNYXBTdGF0ZSgpO1xuICAgICAgdmFyIGV2ZW50U3RhcnRCbG9ja2VkID0gdGhpcy5fZXZlbnRTdGFydEJsb2NrZWQ7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdwYW5zdGFydCc6XG4gICAgICAgICAgcmV0dXJuIGV2ZW50U3RhcnRCbG9ja2VkID8gZmFsc2UgOiB0aGlzLl9vblBhblN0YXJ0KGV2ZW50KTtcblxuICAgICAgICBjYXNlICdwYW5tb3ZlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25QYW4oZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3BhbmVuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uUGFuRW5kKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdwaW5jaHN0YXJ0JzpcbiAgICAgICAgICByZXR1cm4gZXZlbnRTdGFydEJsb2NrZWQgPyBmYWxzZSA6IHRoaXMuX29uUGluY2hTdGFydChldmVudCk7XG5cbiAgICAgICAgY2FzZSAncGluY2htb3ZlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25QaW5jaChldmVudCk7XG5cbiAgICAgICAgY2FzZSAncGluY2hlbmQnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vblBpbmNoRW5kKGV2ZW50KTtcblxuICAgICAgICBjYXNlICd0cmlwYW5zdGFydCc6XG4gICAgICAgICAgcmV0dXJuIGV2ZW50U3RhcnRCbG9ja2VkID8gZmFsc2UgOiB0aGlzLl9vblRyaXBsZVBhblN0YXJ0KGV2ZW50KTtcblxuICAgICAgICBjYXNlICd0cmlwYW5tb3ZlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25UcmlwbGVQYW4oZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3RyaXBhbmVuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uVHJpcGxlUGFuRW5kKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdkb3VibGV0YXAnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vbkRvdWJsZVRhcChldmVudCk7XG5cbiAgICAgICAgY2FzZSAnd2hlZWwnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vbldoZWVsKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25LZXlEb3duKGV2ZW50KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2VudGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENlbnRlcihldmVudCkge1xuICAgICAgdmFyIF9ldmVudCRvZmZzZXRDZW50ZXIgPSBldmVudC5vZmZzZXRDZW50ZXIsXG4gICAgICAgICAgeCA9IF9ldmVudCRvZmZzZXRDZW50ZXIueCxcbiAgICAgICAgICB5ID0gX2V2ZW50JG9mZnNldENlbnRlci55O1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNGdW5jdGlvbktleVByZXNzZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNGdW5jdGlvbktleVByZXNzZWQoZXZlbnQpIHtcbiAgICAgIHZhciBzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50O1xuICAgICAgcmV0dXJuIEJvb2xlYW4oc3JjRXZlbnQubWV0YUtleSB8fCBzcmNFdmVudC5hbHRLZXkgfHwgc3JjRXZlbnQuY3RybEtleSB8fCBzcmNFdmVudC5zaGlmdEtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJsb2NrRXZlbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsb2NrRXZlbnRzKHRpbWVvdXQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMi5fZXZlbnRTdGFydEJsb2NrZWQgPT09IHRpbWVyKSB7XG4gICAgICAgICAgX3RoaXMyLl9ldmVudFN0YXJ0QmxvY2tlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgdGhpcy5fZXZlbnRTdGFydEJsb2NrZWQgPSB0aW1lcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlVmlld3BvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIGV4dHJhUHJvcHMsIGludGVyYWN0aW9uU3RhdGUpIHtcbiAgICAgIHZhciBvbGRWaWV3cG9ydCA9IHRoaXMubWFwU3RhdGUgaW5zdGFuY2VvZiBNYXBTdGF0ZSA/IHRoaXMubWFwU3RhdGUuZ2V0Vmlld3BvcnRQcm9wcygpIDogdGhpcy5tYXBTdGF0ZTtcblxuICAgICAgdmFyIG5ld1ZpZXdwb3J0ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBuZXdNYXBTdGF0ZS5nZXRWaWV3cG9ydFByb3BzKCkpLCBleHRyYVByb3BzKTtcblxuICAgICAgdmFyIHZpZXdTdGF0ZUNoYW5nZWQgPSBPYmplY3Qua2V5cyhuZXdWaWV3cG9ydCkuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBvbGRWaWV3cG9ydFtrZXldICE9PSBuZXdWaWV3cG9ydFtrZXldO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zdGF0ZSA9IG5ld01hcFN0YXRlLmdldFN0YXRlKCk7XG5cbiAgICAgIHRoaXMuX3NldEludGVyYWN0aW9uU3RhdGUoaW50ZXJhY3Rpb25TdGF0ZSk7XG5cbiAgICAgIGlmICh2aWV3U3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMub25WaWV3cG9ydENoYW5nZShuZXdWaWV3cG9ydCwgdGhpcy5faW50ZXJhY3Rpb25TdGF0ZSwgb2xkVmlld3BvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXBTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXBTdGF0ZShvdmVycmlkZXMpIHtcbiAgICAgIHJldHVybiBuZXcgTWFwU3RhdGUoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMubWFwU3RhdGVQcm9wcyksIHRoaXMuX3N0YXRlKSwgb3ZlcnJpZGVzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRHJhZ2dpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNEcmFnZ2luZygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGlvblN0YXRlLmlzRHJhZ2dpbmc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE9wdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICB2YXIgb25WaWV3cG9ydENoYW5nZSA9IG9wdGlvbnMub25WaWV3cG9ydENoYW5nZSxcbiAgICAgICAgICBvblN0YXRlQ2hhbmdlID0gb3B0aW9ucy5vblN0YXRlQ2hhbmdlLFxuICAgICAgICAgIF9vcHRpb25zJGV2ZW50TWFuYWdlciA9IG9wdGlvbnMuZXZlbnRNYW5hZ2VyLFxuICAgICAgICAgIGV2ZW50TWFuYWdlciA9IF9vcHRpb25zJGV2ZW50TWFuYWdlciA9PT0gdm9pZCAwID8gdGhpcy5ldmVudE1hbmFnZXIgOiBfb3B0aW9ucyRldmVudE1hbmFnZXIsXG4gICAgICAgICAgX29wdGlvbnMkaXNJbnRlcmFjdGl2ID0gb3B0aW9ucy5pc0ludGVyYWN0aXZlLFxuICAgICAgICAgIGlzSW50ZXJhY3RpdmUgPSBfb3B0aW9ucyRpc0ludGVyYWN0aXYgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRpc0ludGVyYWN0aXYsXG4gICAgICAgICAgX29wdGlvbnMkc2Nyb2xsWm9vbSA9IG9wdGlvbnMuc2Nyb2xsWm9vbSxcbiAgICAgICAgICBzY3JvbGxab29tID0gX29wdGlvbnMkc2Nyb2xsWm9vbSA9PT0gdm9pZCAwID8gdGhpcy5zY3JvbGxab29tIDogX29wdGlvbnMkc2Nyb2xsWm9vbSxcbiAgICAgICAgICBfb3B0aW9ucyRkcmFnUGFuID0gb3B0aW9ucy5kcmFnUGFuLFxuICAgICAgICAgIGRyYWdQYW4gPSBfb3B0aW9ucyRkcmFnUGFuID09PSB2b2lkIDAgPyB0aGlzLmRyYWdQYW4gOiBfb3B0aW9ucyRkcmFnUGFuLFxuICAgICAgICAgIF9vcHRpb25zJGRyYWdSb3RhdGUgPSBvcHRpb25zLmRyYWdSb3RhdGUsXG4gICAgICAgICAgZHJhZ1JvdGF0ZSA9IF9vcHRpb25zJGRyYWdSb3RhdGUgPT09IHZvaWQgMCA/IHRoaXMuZHJhZ1JvdGF0ZSA6IF9vcHRpb25zJGRyYWdSb3RhdGUsXG4gICAgICAgICAgX29wdGlvbnMkZG91YmxlQ2xpY2taID0gb3B0aW9ucy5kb3VibGVDbGlja1pvb20sXG4gICAgICAgICAgZG91YmxlQ2xpY2tab29tID0gX29wdGlvbnMkZG91YmxlQ2xpY2taID09PSB2b2lkIDAgPyB0aGlzLmRvdWJsZUNsaWNrWm9vbSA6IF9vcHRpb25zJGRvdWJsZUNsaWNrWixcbiAgICAgICAgICBfb3B0aW9ucyR0b3VjaFpvb20gPSBvcHRpb25zLnRvdWNoWm9vbSxcbiAgICAgICAgICB0b3VjaFpvb20gPSBfb3B0aW9ucyR0b3VjaFpvb20gPT09IHZvaWQgMCA/IHRoaXMudG91Y2hab29tIDogX29wdGlvbnMkdG91Y2hab29tLFxuICAgICAgICAgIF9vcHRpb25zJHRvdWNoUm90YXRlID0gb3B0aW9ucy50b3VjaFJvdGF0ZSxcbiAgICAgICAgICB0b3VjaFJvdGF0ZSA9IF9vcHRpb25zJHRvdWNoUm90YXRlID09PSB2b2lkIDAgPyB0aGlzLnRvdWNoUm90YXRlIDogX29wdGlvbnMkdG91Y2hSb3RhdGUsXG4gICAgICAgICAgX29wdGlvbnMka2V5Ym9hcmQgPSBvcHRpb25zLmtleWJvYXJkLFxuICAgICAgICAgIGtleWJvYXJkID0gX29wdGlvbnMka2V5Ym9hcmQgPT09IHZvaWQgMCA/IHRoaXMua2V5Ym9hcmQgOiBfb3B0aW9ucyRrZXlib2FyZDtcbiAgICAgIHRoaXMub25WaWV3cG9ydENoYW5nZSA9IG9uVmlld3BvcnRDaGFuZ2U7XG4gICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UgPSBvblN0YXRlQ2hhbmdlO1xuICAgICAgdmFyIHByZXZPcHRpb25zID0gdGhpcy5tYXBTdGF0ZVByb3BzIHx8IHt9O1xuICAgICAgdmFyIGRpbWVuc2lvbkNoYW5nZWQgPSBwcmV2T3B0aW9ucy5oZWlnaHQgIT09IG9wdGlvbnMuaGVpZ2h0IHx8IHByZXZPcHRpb25zLndpZHRoICE9PSBvcHRpb25zLndpZHRoO1xuICAgICAgdGhpcy5tYXBTdGF0ZVByb3BzID0gb3B0aW9ucztcblxuICAgICAgaWYgKGRpbWVuc2lvbkNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5tYXBTdGF0ZSA9IHByZXZPcHRpb25zO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ldyBNYXBTdGF0ZShvcHRpb25zKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyYW5zaXRpb25NYW5hZ2VyLnByb2Nlc3NWaWV3cG9ydENoYW5nZShvcHRpb25zKTtcblxuICAgICAgaWYgKHRoaXMuZXZlbnRNYW5hZ2VyICE9PSBldmVudE1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgICAgICB0aGlzLnRvZ2dsZUV2ZW50cyh0aGlzLmV2ZW50cywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9nZ2xlRXZlbnRzKEVWRU5UX1RZUEVTLldIRUVMLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oc2Nyb2xsWm9vbSkpO1xuICAgICAgdGhpcy50b2dnbGVFdmVudHMoRVZFTlRfVFlQRVMuUEFOLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oZHJhZ1BhbiB8fCBkcmFnUm90YXRlKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5QSU5DSCwgaXNJbnRlcmFjdGl2ZSAmJiBCb29sZWFuKHRvdWNoWm9vbSB8fCB0b3VjaFJvdGF0ZSkpO1xuICAgICAgdGhpcy50b2dnbGVFdmVudHMoRVZFTlRfVFlQRVMuVFJJUExFX1BBTiwgaXNJbnRlcmFjdGl2ZSAmJiBCb29sZWFuKHRvdWNoUm90YXRlKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5ET1VCTEVfVEFQLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oZG91YmxlQ2xpY2tab29tKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5LRVlCT0FSRCwgaXNJbnRlcmFjdGl2ZSAmJiBCb29sZWFuKGtleWJvYXJkKSk7XG4gICAgICB0aGlzLnNjcm9sbFpvb20gPSBzY3JvbGxab29tO1xuICAgICAgdGhpcy5kcmFnUGFuID0gZHJhZ1BhbjtcbiAgICAgIHRoaXMuZHJhZ1JvdGF0ZSA9IGRyYWdSb3RhdGU7XG4gICAgICB0aGlzLmRvdWJsZUNsaWNrWm9vbSA9IGRvdWJsZUNsaWNrWm9vbTtcbiAgICAgIHRoaXMudG91Y2hab29tID0gdG91Y2hab29tO1xuICAgICAgdGhpcy50b3VjaFJvdGF0ZSA9IHRvdWNoUm90YXRlO1xuICAgICAgdGhpcy5rZXlib2FyZCA9IGtleWJvYXJkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b2dnbGVFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9nZ2xlRXZlbnRzKGV2ZW50TmFtZXMsIGVuYWJsZWQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5ldmVudE1hbmFnZXIpIHtcbiAgICAgICAgZXZlbnROYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICBpZiAoX3RoaXMzLl9ldmVudHNbZXZlbnROYW1lXSAhPT0gZW5hYmxlZCkge1xuICAgICAgICAgICAgX3RoaXMzLl9ldmVudHNbZXZlbnROYW1lXSA9IGVuYWJsZWQ7XG5cbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgIF90aGlzMy5ldmVudE1hbmFnZXIub24oZXZlbnROYW1lLCBfdGhpczMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMzLmV2ZW50TWFuYWdlci5vZmYoZXZlbnROYW1lLCBfdGhpczMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhblN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBhblN0YXJ0KGV2ZW50KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdGhpcy5fcGFuUm90YXRlID0gdGhpcy5pc0Z1bmN0aW9uS2V5UHJlc3NlZChldmVudCkgfHwgZXZlbnQucmlnaHRCdXR0b247XG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLl9wYW5Sb3RhdGUgPyB0aGlzLm1hcFN0YXRlLnJvdGF0ZVN0YXJ0KHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pIDogdGhpcy5tYXBTdGF0ZS5wYW5TdGFydCh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBhbihldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9wYW5Sb3RhdGUgPyB0aGlzLl9vblBhblJvdGF0ZShldmVudCkgOiB0aGlzLl9vblBhbk1vdmUoZXZlbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QYW5FbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuRW5kKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3BhblJvdGF0ZSA/IHRoaXMuX29uUGFuUm90YXRlRW5kKGV2ZW50KSA6IHRoaXMuX29uUGFuTW92ZUVuZChldmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhbk1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuTW92ZShldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmRyYWdQYW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW4oe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzUGFubmluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuTW92ZUVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5Nb3ZlRW5kKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5kcmFnUGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyRkcmFnUGFuJGluZXJ0aWEgPSB0aGlzLmRyYWdQYW4uaW5lcnRpYSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSBfdGhpcyRkcmFnUGFuJGluZXJ0aWEgPT09IHZvaWQgMCA/IERFRkFVTFRfSU5FUlRJQSA6IF90aGlzJGRyYWdQYW4kaW5lcnRpYTtcblxuICAgICAgICBpZiAoaW5lcnRpYSAmJiBldmVudC52ZWxvY2l0eSkge1xuICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICAgICAgdmFyIGVuZFBvcyA9IFtwb3NbMF0gKyBldmVudC52ZWxvY2l0eVggKiBpbmVydGlhIC8gMiwgcG9zWzFdICsgZXZlbnQudmVsb2NpdHlZICogaW5lcnRpYSAvIDJdO1xuICAgICAgICAgIHZhciBuZXdDb250cm9sbGVyU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbih7XG4gICAgICAgICAgICBwb3M6IGVuZFBvc1xuICAgICAgICAgIH0pLnBhbkVuZCgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3Q29udHJvbGxlclN0YXRlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTKSwge30sIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogaW5lcnRpYSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25FYXNpbmc6IElORVJUSUFfRUFTSU5HXG4gICAgICAgICAgfSksIHtcbiAgICAgICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaXNQYW5uaW5nOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW5FbmQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIG51bGwsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIGlzUGFubmluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhblJvdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5Sb3RhdGUoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5kcmFnUm90YXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucm90YXRlKHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgTk9fVFJBTlNJVElPTl9QUk9QUywge1xuICAgICAgICBpc1JvdGF0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QYW5Sb3RhdGVFbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuUm90YXRlRW5kKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5kcmFnUm90YXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyRkcmFnUm90YXRlJGluZXIgPSB0aGlzLmRyYWdSb3RhdGUuaW5lcnRpYSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSBfdGhpcyRkcmFnUm90YXRlJGluZXIgPT09IHZvaWQgMCA/IERFRkFVTFRfSU5FUlRJQSA6IF90aGlzJGRyYWdSb3RhdGUkaW5lcjtcblxuICAgICAgICBpZiAoaW5lcnRpYSAmJiBldmVudC52ZWxvY2l0eSkge1xuICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICAgICAgdmFyIGVuZFBvcyA9IFtwb3NbMF0gKyBldmVudC52ZWxvY2l0eVggKiBpbmVydGlhIC8gMiwgcG9zWzFdICsgZXZlbnQudmVsb2NpdHlZICogaW5lcnRpYSAvIDJdO1xuICAgICAgICAgIHZhciBuZXdDb250cm9sbGVyU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZSh7XG4gICAgICAgICAgICBwb3M6IGVuZFBvc1xuICAgICAgICAgIH0pLnJvdGF0ZUVuZCgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3Q29udHJvbGxlclN0YXRlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTKSwge30sIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogaW5lcnRpYSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25FYXNpbmc6IElORVJUSUFfRUFTSU5HXG4gICAgICAgICAgfSksIHtcbiAgICAgICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaXNSb3RhdGluZzogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuRW5kKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBudWxsLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uV2hlZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uV2hlZWwoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5zY3JvbGxab29tKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJHNjcm9sbFpvb20gPSB0aGlzLnNjcm9sbFpvb20sXG4gICAgICAgICAgX3RoaXMkc2Nyb2xsWm9vbSRzcGVlID0gX3RoaXMkc2Nyb2xsWm9vbS5zcGVlZCxcbiAgICAgICAgICBzcGVlZCA9IF90aGlzJHNjcm9sbFpvb20kc3BlZSA9PT0gdm9pZCAwID8gMC4wMSA6IF90aGlzJHNjcm9sbFpvb20kc3BlZSxcbiAgICAgICAgICBfdGhpcyRzY3JvbGxab29tJHNtb28gPSBfdGhpcyRzY3JvbGxab29tLnNtb290aCxcbiAgICAgICAgICBzbW9vdGggPSBfdGhpcyRzY3JvbGxab29tJHNtb28gPT09IHZvaWQgMCA/IGZhbHNlIDogX3RoaXMkc2Nyb2xsWm9vbSRzbW9vO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICB2YXIgZGVsdGEgPSBldmVudC5kZWx0YTtcbiAgICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyhkZWx0YSAqIHNwZWVkKSkpO1xuXG4gICAgICBpZiAoZGVsdGEgPCAwICYmIHNjYWxlICE9PSAwKSB7XG4gICAgICAgIHNjYWxlID0gMSAvIHNjYWxlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnpvb20oe1xuICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgc2NhbGU6IHNjYWxlXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpLCB7fSwge1xuICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKHtcbiAgICAgICAgICBhcm91bmQ6IHBvc1xuICAgICAgICB9KSxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBzbW9vdGggPyAyNTAgOiAxXG4gICAgICB9KSwge1xuICAgICAgICBpc1Bhbm5pbmc6IHRydWUsXG4gICAgICAgIGlzWm9vbWluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGluY2hTdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QaW5jaFN0YXJ0KGV2ZW50KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS56b29tU3RhcnQoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSkucm90YXRlU3RhcnQoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zdGFydFBpbmNoUm90YXRpb24gPSBldmVudC5yb3RhdGlvbjtcbiAgICAgIHRoaXMuX2xhc3RQaW5jaEV2ZW50ID0gZXZlbnQ7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBpbmNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBpbmNoKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRvdWNoWm9vbSAmJiAhdGhpcy50b3VjaFJvdGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGU7XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoWm9vbSkge1xuICAgICAgICB2YXIgc2NhbGUgPSBldmVudC5zY2FsZTtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgICAgbmV3TWFwU3RhdGUgPSBuZXdNYXBTdGF0ZS56b29tKHtcbiAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICBzY2FsZTogc2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoUm90YXRlKSB7XG4gICAgICAgIHZhciByb3RhdGlvbiA9IGV2ZW50LnJvdGF0aW9uO1xuICAgICAgICBuZXdNYXBTdGF0ZSA9IG5ld01hcFN0YXRlLnJvdGF0ZSh7XG4gICAgICAgICAgZGVsdGFBbmdsZVg6IHRoaXMuX3N0YXJ0UGluY2hSb3RhdGlvbiAtIHJvdGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IHRydWUsXG4gICAgICAgIGlzUGFubmluZzogQm9vbGVhbih0aGlzLnRvdWNoWm9vbSksXG4gICAgICAgIGlzWm9vbWluZzogQm9vbGVhbih0aGlzLnRvdWNoWm9vbSksXG4gICAgICAgIGlzUm90YXRpbmc6IEJvb2xlYW4odGhpcy50b3VjaFJvdGF0ZSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbGFzdFBpbmNoRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QaW5jaEVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QaW5jaEVuZChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoWm9vbSkge1xuICAgICAgICB2YXIgX3RoaXMkdG91Y2hab29tJGluZXJ0ID0gdGhpcy50b3VjaFpvb20uaW5lcnRpYSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSBfdGhpcyR0b3VjaFpvb20kaW5lcnQgPT09IHZvaWQgMCA/IERFRkFVTFRfSU5FUlRJQSA6IF90aGlzJHRvdWNoWm9vbSRpbmVydDtcbiAgICAgICAgdmFyIF9sYXN0UGluY2hFdmVudCA9IHRoaXMuX2xhc3RQaW5jaEV2ZW50O1xuXG4gICAgICAgIGlmIChpbmVydGlhICYmIF9sYXN0UGluY2hFdmVudCAmJiBldmVudC5zY2FsZSAhPT0gX2xhc3RQaW5jaEV2ZW50LnNjYWxlKSB7XG4gICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcblxuICAgICAgICAgIHZhciBfbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZUVuZCgpO1xuXG4gICAgICAgICAgdmFyIHogPSBNYXRoLmxvZzIoZXZlbnQuc2NhbGUpO1xuXG4gICAgICAgICAgdmFyIHZlbG9jaXR5WiA9ICh6IC0gTWF0aC5sb2cyKF9sYXN0UGluY2hFdmVudC5zY2FsZSkpIC8gKGV2ZW50LmRlbHRhVGltZSAtIF9sYXN0UGluY2hFdmVudC5kZWx0YVRpbWUpO1xuXG4gICAgICAgICAgdmFyIGVuZFNjYWxlID0gTWF0aC5wb3coMiwgeiArIHZlbG9jaXR5WiAqIGluZXJ0aWEgLyAyKTtcbiAgICAgICAgICBfbmV3TWFwU3RhdGUgPSBfbmV3TWFwU3RhdGUuem9vbSh7XG4gICAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICAgIHNjYWxlOiBlbmRTY2FsZVxuICAgICAgICAgIH0pLnpvb21FbmQoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KF9uZXdNYXBTdGF0ZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyksIHt9LCB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKHtcbiAgICAgICAgICAgICAgYXJvdW5kOiBwb3NcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBpbmVydGlhLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVhc2luZzogSU5FUlRJQV9FQVNJTkdcbiAgICAgICAgICB9KSwge1xuICAgICAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBpc1Bhbm5pbmc6IEJvb2xlYW4odGhpcy50b3VjaFpvb20pLFxuICAgICAgICAgICAgaXNab29taW5nOiBCb29sZWFuKHRoaXMudG91Y2hab29tKSxcbiAgICAgICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5ibG9ja0V2ZW50cyhpbmVydGlhKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnpvb21FbmQoKS5yb3RhdGVFbmQoKTtcbiAgICAgIHRoaXMuX3N0YXRlLnN0YXJ0UGluY2hSb3RhdGlvbiA9IDA7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBudWxsLCB7XG4gICAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICBpc1Bhbm5pbmc6IGZhbHNlLFxuICAgICAgICBpc1pvb21pbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9zdGFydFBpbmNoUm90YXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5fbGFzdFBpbmNoRXZlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblRyaXBsZVBhblN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblRyaXBsZVBhblN0YXJ0KGV2ZW50KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGVTdGFydCh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uVHJpcGxlUGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblRyaXBsZVBhbihldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy50b3VjaFJvdGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICBwb3NbMF0gLT0gZXZlbnQuZGVsdGFYO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGUoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzUm90YXRpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblRyaXBsZVBhbkVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25UcmlwbGVQYW5FbmQoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50b3VjaFJvdGF0ZSkge1xuICAgICAgICB2YXIgX3RoaXMkdG91Y2hSb3RhdGUkaW5lID0gdGhpcy50b3VjaFJvdGF0ZS5pbmVydGlhLFxuICAgICAgICAgICAgaW5lcnRpYSA9IF90aGlzJHRvdWNoUm90YXRlJGluZSA9PT0gdm9pZCAwID8gREVGQVVMVF9JTkVSVElBIDogX3RoaXMkdG91Y2hSb3RhdGUkaW5lO1xuXG4gICAgICAgIGlmIChpbmVydGlhICYmIGV2ZW50LnZlbG9jaXR5WSkge1xuICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICAgICAgdmFyIGVuZFBvcyA9IFtwb3NbMF0sIHBvc1sxXSArPSBldmVudC52ZWxvY2l0eVkgKiBpbmVydGlhIC8gMl07XG5cbiAgICAgICAgICB2YXIgX25ld01hcFN0YXRlMiA9IHRoaXMubWFwU3RhdGUucm90YXRlKHtcbiAgICAgICAgICAgIHBvczogZW5kUG9zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KF9uZXdNYXBTdGF0ZTIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpLCB7fSwge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBpbmVydGlhLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVhc2luZzogSU5FUlRJQV9FQVNJTkdcbiAgICAgICAgICB9KSwge1xuICAgICAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBpc1JvdGF0aW5nOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5ibG9ja0V2ZW50cyhpbmVydGlhKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGVFbmQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIG51bGwsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25Eb3VibGVUYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uRG91YmxlVGFwKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuZG91YmxlQ2xpY2tab29tKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgIHZhciBpc1pvb21PdXQgPSB0aGlzLmlzRnVuY3Rpb25LZXlQcmVzc2VkKGV2ZW50KTtcbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUuem9vbSh7XG4gICAgICAgIHBvczogcG9zLFxuICAgICAgICBzY2FsZTogaXNab29tT3V0ID8gMC41IDogMlxuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBPYmplY3QuYXNzaWduKHt9LCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUywge1xuICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgTGluZWFySW50ZXJwb2xhdG9yKHtcbiAgICAgICAgICBhcm91bmQ6IHBvc1xuICAgICAgICB9KVxuICAgICAgfSksIHtcbiAgICAgICAgaXNab29taW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25LZXlEb3duXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5rZXlib2FyZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBmdW5jS2V5ID0gdGhpcy5pc0Z1bmN0aW9uS2V5UHJlc3NlZChldmVudCk7XG4gICAgICB2YXIgX3RoaXMka2V5Ym9hcmQgPSB0aGlzLmtleWJvYXJkLFxuICAgICAgICAgIF90aGlzJGtleWJvYXJkJHpvb21TcCA9IF90aGlzJGtleWJvYXJkLnpvb21TcGVlZCxcbiAgICAgICAgICB6b29tU3BlZWQgPSBfdGhpcyRrZXlib2FyZCR6b29tU3AgPT09IHZvaWQgMCA/IDIgOiBfdGhpcyRrZXlib2FyZCR6b29tU3AsXG4gICAgICAgICAgX3RoaXMka2V5Ym9hcmQkbW92ZVNwID0gX3RoaXMka2V5Ym9hcmQubW92ZVNwZWVkLFxuICAgICAgICAgIG1vdmVTcGVlZCA9IF90aGlzJGtleWJvYXJkJG1vdmVTcCA9PT0gdm9pZCAwID8gMTAwIDogX3RoaXMka2V5Ym9hcmQkbW92ZVNwLFxuICAgICAgICAgIF90aGlzJGtleWJvYXJkJHJvdGF0ZSA9IF90aGlzJGtleWJvYXJkLnJvdGF0ZVNwZWVkWCxcbiAgICAgICAgICByb3RhdGVTcGVlZFggPSBfdGhpcyRrZXlib2FyZCRyb3RhdGUgPT09IHZvaWQgMCA/IDE1IDogX3RoaXMka2V5Ym9hcmQkcm90YXRlLFxuICAgICAgICAgIF90aGlzJGtleWJvYXJkJHJvdGF0ZTIgPSBfdGhpcyRrZXlib2FyZC5yb3RhdGVTcGVlZFksXG4gICAgICAgICAgcm90YXRlU3BlZWRZID0gX3RoaXMka2V5Ym9hcmQkcm90YXRlMiA9PT0gdm9pZCAwID8gMTAgOiBfdGhpcyRrZXlib2FyZCRyb3RhdGUyO1xuICAgICAgdmFyIG1hcFN0YXRlUHJvcHMgPSB0aGlzLm1hcFN0YXRlUHJvcHM7XG4gICAgICB2YXIgbmV3TWFwU3RhdGU7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQuc3JjRXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE4OTpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgem9vbTogbWFwU3RhdGVQcm9wcy56b29tIC0gTWF0aC5sb2cyKHpvb21TcGVlZCkgLSAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgem9vbTogbWFwU3RhdGVQcm9wcy56b29tIC0gTWF0aC5sb2cyKHpvb21TcGVlZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg3OlxuICAgICAgICAgIGlmIChmdW5jS2V5KSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICB6b29tOiBtYXBTdGF0ZVByb3BzLnpvb20gKyBNYXRoLmxvZzIoem9vbVNwZWVkKSArIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICB6b29tOiBtYXBTdGF0ZVByb3BzLnpvb20gKyBNYXRoLmxvZzIoem9vbVNwZWVkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgYmVhcmluZzogbWFwU3RhdGVQcm9wcy5iZWFyaW5nIC0gcm90YXRlU3BlZWRYXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbih7XG4gICAgICAgICAgICAgIHBvczogW21vdmVTcGVlZCwgMF0sXG4gICAgICAgICAgICAgIHN0YXJ0UG9zOiBbMCwgMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgaWYgKGZ1bmNLZXkpIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5nZXRNYXBTdGF0ZSh7XG4gICAgICAgICAgICAgIGJlYXJpbmc6IG1hcFN0YXRlUHJvcHMuYmVhcmluZyArIHJvdGF0ZVNwZWVkWFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW4oe1xuICAgICAgICAgICAgICBwb3M6IFstbW92ZVNwZWVkLCAwXSxcbiAgICAgICAgICAgICAgc3RhcnRQb3M6IFswLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgcGl0Y2g6IG1hcFN0YXRlUHJvcHMucGl0Y2ggKyByb3RhdGVTcGVlZFlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuKHtcbiAgICAgICAgICAgICAgcG9zOiBbMCwgbW92ZVNwZWVkXSxcbiAgICAgICAgICAgICAgc3RhcnRQb3M6IFswLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgcGl0Y2g6IG1hcFN0YXRlUHJvcHMucGl0Y2ggLSByb3RhdGVTcGVlZFlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuKHtcbiAgICAgICAgICAgICAgcG9zOiBbMCwgLW1vdmVTcGVlZF0sXG4gICAgICAgICAgICAgIHN0YXJ0UG9zOiBbMCwgMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXBDb250cm9sbGVyO1xufSgpO1xuXG5leHBvcnQgeyBNYXBDb250cm9sbGVyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFN0YXRpY01hcCwgeyBnZXRWaWV3cG9ydCB9IGZyb20gJy4vc3RhdGljLW1hcCc7XG5pbXBvcnQgeyBNQVBCT1hfTElNSVRTIH0gZnJvbSAnLi4vdXRpbHMvbWFwLXN0YXRlJztcbmltcG9ydCBUcmFuc2l0aW9uTWFuYWdlciBmcm9tICcuLi91dGlscy90cmFuc2l0aW9uLW1hbmFnZXInO1xuaW1wb3J0IE1hcENvbnRleHQsIHsgTWFwQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9tYXAtY29udGV4dCc7XG5pbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tICdtam9sbmlyLmpzJztcbmltcG9ydCBNYXBDb250cm9sbGVyIGZyb20gJy4uL3V0aWxzL21hcC1jb250cm9sbGVyJztcbmltcG9ydCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IGZyb20gJy4uL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QnO1xuaW1wb3J0IHsgZ2V0VGVycmFpbkVsZXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL3RlcnJhaW4nO1xudmFyIHByb3BUeXBlcyA9IE9iamVjdC5hc3NpZ24oe30sIFN0YXRpY01hcC5wcm9wVHlwZXMsIHtcbiAgbWF4Wm9vbTogUHJvcFR5cGVzLm51bWJlcixcbiAgbWluWm9vbTogUHJvcFR5cGVzLm51bWJlcixcbiAgbWF4UGl0Y2g6IFByb3BUeXBlcy5udW1iZXIsXG4gIG1pblBpdGNoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBvblZpZXdTdGF0ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uVmlld3BvcnRDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbkludGVyYWN0aW9uU3RhdGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICB0cmFuc2l0aW9uRHVyYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgdHJhbnNpdGlvbkludGVycG9sYXRvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgdHJhbnNpdGlvbkludGVycnVwdGlvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgdHJhbnNpdGlvbkVhc2luZzogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uVHJhbnNpdGlvblN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25UcmFuc2l0aW9uSW50ZXJydXB0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25UcmFuc2l0aW9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgc2Nyb2xsWm9vbTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgZHJhZ1BhbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgZHJhZ1JvdGF0ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgZG91YmxlQ2xpY2tab29tOiBQcm9wVHlwZXMuYm9vbCxcbiAgdG91Y2hab29tOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICB0b3VjaFJvdGF0ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAga2V5Ym9hcmQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIG9uSG92ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25EYmxDbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ29udGV4dE1lbnU6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlRG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VNb3ZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZVVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Ub3VjaFN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Ub3VjaE1vdmU6IFByb3BUeXBlcy5mdW5jLFxuICBvblRvdWNoRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZUVudGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZUxlYXZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZU91dDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uV2hlZWw6IFByb3BUeXBlcy5mdW5jLFxuICB0b3VjaEFjdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgZXZlbnRSZWNvZ25pemVyT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xpY2tSYWRpdXM6IFByb3BUeXBlcy5udW1iZXIsXG4gIGludGVyYWN0aXZlTGF5ZXJJZHM6IFByb3BUeXBlcy5hcnJheSxcbiAgZ2V0Q3Vyc29yOiBQcm9wVHlwZXMuZnVuYyxcbiAgY29udHJvbGxlcjogUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwQ29udHJvbGxlcilcbn0pO1xuXG52YXIgZ2V0RGVmYXVsdEN1cnNvciA9IGZ1bmN0aW9uIGdldERlZmF1bHRDdXJzb3IoX3JlZikge1xuICB2YXIgaXNEcmFnZ2luZyA9IF9yZWYuaXNEcmFnZ2luZyxcbiAgICAgIGlzSG92ZXJpbmcgPSBfcmVmLmlzSG92ZXJpbmc7XG4gIHJldHVybiBpc0RyYWdnaW5nID8gJ2dyYWJiaW5nJyA6IGlzSG92ZXJpbmcgPyAncG9pbnRlcicgOiAnZ3JhYic7XG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgU3RhdGljTWFwLmRlZmF1bHRQcm9wcywgTUFQQk9YX0xJTUlUUywgVHJhbnNpdGlvbk1hbmFnZXIuZGVmYXVsdFByb3BzLCB7XG4gIG9uVmlld1N0YXRlQ2hhbmdlOiBudWxsLFxuICBvblZpZXdwb3J0Q2hhbmdlOiBudWxsLFxuICBvbkNsaWNrOiBudWxsLFxuICBvbk5hdGl2ZUNsaWNrOiBudWxsLFxuICBvbkhvdmVyOiBudWxsLFxuICBvbkNvbnRleHRNZW51OiBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0sXG4gIHNjcm9sbFpvb206IHRydWUsXG4gIGRyYWdQYW46IHRydWUsXG4gIGRyYWdSb3RhdGU6IHRydWUsXG4gIGRvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcbiAgdG91Y2hab29tOiB0cnVlLFxuICB0b3VjaFJvdGF0ZTogZmFsc2UsXG4gIGtleWJvYXJkOiB0cnVlLFxuICB0b3VjaEFjdGlvbjogJ25vbmUnLFxuICBldmVudFJlY29nbml6ZXJPcHRpb25zOiB7fSxcbiAgY2xpY2tSYWRpdXM6IDAsXG4gIGdldEN1cnNvcjogZ2V0RGVmYXVsdEN1cnNvclxufSk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50KGV2ZW50KSB7XG4gIGlmIChldmVudC5sbmdMYXQgfHwgIWV2ZW50Lm9mZnNldENlbnRlcikge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIHZhciBfZXZlbnQkb2Zmc2V0Q2VudGVyID0gZXZlbnQub2Zmc2V0Q2VudGVyLFxuICAgICAgeCA9IF9ldmVudCRvZmZzZXRDZW50ZXIueCxcbiAgICAgIHkgPSBfZXZlbnQkb2Zmc2V0Q2VudGVyLnk7XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIHZhciBwb3MgPSBbeCwgeV07XG4gIGV2ZW50LnBvaW50ID0gcG9zO1xuICB2YXIgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0O1xuICB2YXIgbG9jYXRpb24gPSB2aWV3cG9ydC51bnByb2plY3QocG9zLCB7XG4gICAgdGFyZ2V0Wjogdmlld3BvcnQubWV0ZXJPZmZzZXRbMl1cbiAgfSk7XG4gIGV2ZW50LmxuZ0xhdCA9IFtsb2NhdGlvblswXSwgbG9jYXRpb25bMV1dO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEZlYXR1cmVzKHBvcykge1xuICB2YXIgbWFwID0gdGhpcy5tYXA7XG5cbiAgaWYgKCFtYXAgfHwgIXBvcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHF1ZXJ5UGFyYW1zID0ge307XG4gIHZhciBzaXplID0gdGhpcy5wcm9wcy5jbGlja1JhZGl1cztcblxuICBpZiAodGhpcy5wcm9wcy5pbnRlcmFjdGl2ZUxheWVySWRzKSB7XG4gICAgcXVlcnlQYXJhbXMubGF5ZXJzID0gdGhpcy5wcm9wcy5pbnRlcmFjdGl2ZUxheWVySWRzO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhzaXplID8gW1twb3NbMF0gLSBzaXplLCBwb3NbMV0gKyBzaXplXSwgW3Bvc1swXSArIHNpemUsIHBvc1sxXSAtIHNpemVdXSA6IHBvcywgcXVlcnlQYXJhbXMpO1xuICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25FdmVudChjYWxsYmFja05hbWUsIGV2ZW50KSB7XG4gIHZhciBmdW5jID0gdGhpcy5wcm9wc1tjYWxsYmFja05hbWVdO1xuXG4gIGlmIChmdW5jKSB7XG4gICAgZnVuYyhub3JtYWxpemVFdmVudC5jYWxsKHRoaXMsIGV2ZW50KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Qb2ludGVyRG93bihldmVudCkge1xuICBvbkV2ZW50LmNhbGwodGhpcywgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgPyAnb25Ub3VjaFN0YXJ0JyA6ICdvbk1vdXNlRG93bicsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gb25Qb2ludGVyVXAoZXZlbnQpIHtcbiAgb25FdmVudC5jYWxsKHRoaXMsIGV2ZW50LnBvaW50ZXJUeXBlID09PSAndG91Y2gnID8gJ29uVG91Y2hFbmQnIDogJ29uTW91c2VVcCcsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gb25Qb2ludGVyTW92ZShldmVudCkge1xuICBvbkV2ZW50LmNhbGwodGhpcywgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgPyAnb25Ub3VjaE1vdmUnIDogJ29uTW91c2VNb3ZlJywgZXZlbnQpO1xuXG4gIGlmICghdGhpcy5zdGF0ZS5pc0RyYWdnaW5nKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25Ib3ZlciA9IF90aGlzJHByb3BzLm9uSG92ZXIsXG4gICAgICAgIGludGVyYWN0aXZlTGF5ZXJJZHMgPSBfdGhpcyRwcm9wcy5pbnRlcmFjdGl2ZUxheWVySWRzO1xuICAgIHZhciBmZWF0dXJlcztcbiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50LmNhbGwodGhpcywgZXZlbnQpO1xuXG4gICAgaWYgKGludGVyYWN0aXZlTGF5ZXJJZHMgfHwgb25Ib3Zlcikge1xuICAgICAgZmVhdHVyZXMgPSBnZXRGZWF0dXJlcy5jYWxsKHRoaXMsIGV2ZW50LnBvaW50KTtcbiAgICB9XG5cbiAgICB2YXIgaXNIb3ZlcmluZyA9IEJvb2xlYW4oaW50ZXJhY3RpdmVMYXllcklkcyAmJiBmZWF0dXJlcyAmJiBmZWF0dXJlcy5sZW5ndGggPiAwKTtcbiAgICB2YXIgaXNFbnRlcmluZyA9IGlzSG92ZXJpbmcgJiYgIXRoaXMuc3RhdGUuaXNIb3ZlcmluZztcbiAgICB2YXIgaXNFeGl0aW5nID0gIWlzSG92ZXJpbmcgJiYgdGhpcy5zdGF0ZS5pc0hvdmVyaW5nO1xuXG4gICAgaWYgKG9uSG92ZXIgfHwgaXNFbnRlcmluZykge1xuICAgICAgZXZlbnQuZmVhdHVyZXMgPSBmZWF0dXJlcztcblxuICAgICAgaWYgKG9uSG92ZXIpIHtcbiAgICAgICAgb25Ib3ZlcihldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRW50ZXJpbmcpIHtcbiAgICAgIG9uRXZlbnQuY2FsbCh0aGlzLCAnb25Nb3VzZUVudGVyJywgZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0V4aXRpbmcpIHtcbiAgICAgIG9uRXZlbnQuY2FsbCh0aGlzLCAnb25Nb3VzZUxlYXZlJywgZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0VudGVyaW5nIHx8IGlzRXhpdGluZykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzSG92ZXJpbmc6IGlzSG92ZXJpbmdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvblBvaW50ZXJDbGljayhldmVudCkge1xuICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgIG9uQ2xpY2sgPSBfdGhpcyRwcm9wczIub25DbGljayxcbiAgICAgIG9uTmF0aXZlQ2xpY2sgPSBfdGhpcyRwcm9wczIub25OYXRpdmVDbGljayxcbiAgICAgIG9uRGJsQ2xpY2sgPSBfdGhpcyRwcm9wczIub25EYmxDbGljayxcbiAgICAgIGRvdWJsZUNsaWNrWm9vbSA9IF90aGlzJHByb3BzMi5kb3VibGVDbGlja1pvb207XG4gIHZhciBjYWxsYmFja3MgPSBbXTtcbiAgdmFyIGlzRG91YmxlQ2xpY2tFbmFibGVkID0gb25EYmxDbGljayB8fCBkb3VibGVDbGlja1pvb207XG5cbiAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgY2FzZSAnYW55Y2xpY2snOlxuICAgICAgY2FsbGJhY2tzLnB1c2gob25OYXRpdmVDbGljayk7XG5cbiAgICAgIGlmICghaXNEb3VibGVDbGlja0VuYWJsZWQpIHtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2gob25DbGljayk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgaWYgKGlzRG91YmxlQ2xpY2tFbmFibGVkKSB7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKG9uQ2xpY2spO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gIH1cblxuICBjYWxsYmFja3MgPSBjYWxsYmFja3MuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgZXZlbnQgPSBub3JtYWxpemVFdmVudC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICBldmVudC5mZWF0dXJlcyA9IGdldEZlYXR1cmVzLmNhbGwodGhpcywgZXZlbnQucG9pbnQpO1xuICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgcmV0dXJuIGNiKGV2ZW50KTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWZIYW5kbGVzKHN0YXRpY01hcFJlZikge1xuICByZXR1cm4ge1xuICAgIGdldE1hcDogc3RhdGljTWFwUmVmLmN1cnJlbnQgJiYgc3RhdGljTWFwUmVmLmN1cnJlbnQuZ2V0TWFwLFxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlczogc3RhdGljTWFwUmVmLmN1cnJlbnQgJiYgc3RhdGljTWFwUmVmLmN1cnJlbnQucXVlcnlSZW5kZXJlZEZlYXR1cmVzXG4gIH07XG59XG5cbnZhciBJbnRlcmFjdGl2ZU1hcCA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHBhcmVudENvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB2YXIgY29udHJvbGxlciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwcm9wcy5jb250cm9sbGVyIHx8IG5ldyBNYXBDb250cm9sbGVyKCk7XG4gIH0sIFtdKTtcbiAgdmFyIGV2ZW50TWFuYWdlciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRXZlbnRNYW5hZ2VyKG51bGwsIHtcbiAgICAgIHRvdWNoQWN0aW9uOiBwcm9wcy50b3VjaEFjdGlvbixcbiAgICAgIHJlY29nbml6ZXJPcHRpb25zOiBwcm9wcy5ldmVudFJlY29nbml6ZXJPcHRpb25zXG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdmFyIGV2ZW50Q2FudmFzUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgc3RhdGljTWFwUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHZhciBfdGhpc1JlZiA9IHVzZVJlZih7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHN0YXRlOiB7XG4gICAgICBpc0hvdmVyaW5nOiBmYWxzZSxcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfVxuICB9KTtcblxuICB2YXIgdGhpc1JlZiA9IF90aGlzUmVmLmN1cnJlbnQ7XG4gIHRoaXNSZWYucHJvcHMgPSBwcm9wcztcbiAgdGhpc1JlZi5tYXAgPSBzdGF0aWNNYXBSZWYuY3VycmVudCAmJiBzdGF0aWNNYXBSZWYuY3VycmVudC5nZXRNYXAoKTtcblxuICB0aGlzUmVmLnNldFN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG4gICAgdGhpc1JlZi5zdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpc1JlZi5zdGF0ZSksIG5ld1N0YXRlKTtcbiAgICBldmVudENhbnZhc1JlZi5jdXJyZW50LnN0eWxlLmN1cnNvciA9IHByb3BzLmdldEN1cnNvcih0aGlzUmVmLnN0YXRlKTtcbiAgfTtcblxuICB2YXIgaW5SZW5kZXIgPSB0cnVlO1xuICB2YXIgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQ7XG4gIHZhciBzdGF0ZVVwZGF0ZVJlcXVlc3RlZDtcblxuICB2YXIgaGFuZGxlVmlld3BvcnRDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVWaWV3cG9ydENoYW5nZSh2aWV3U3RhdGUsIGludGVyYWN0aW9uU3RhdGUsIG9sZFZpZXdTdGF0ZSkge1xuICAgIGlmIChpblJlbmRlcikge1xuICAgICAgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQgPSBbdmlld1N0YXRlLCBpbnRlcmFjdGlvblN0YXRlLCBvbGRWaWV3U3RhdGVdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBfdGhpc1JlZiRwcm9wcyA9IHRoaXNSZWYucHJvcHMsXG4gICAgICAgIG9uVmlld1N0YXRlQ2hhbmdlID0gX3RoaXNSZWYkcHJvcHMub25WaWV3U3RhdGVDaGFuZ2UsXG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UgPSBfdGhpc1JlZiRwcm9wcy5vblZpZXdwb3J0Q2hhbmdlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3U3RhdGUsICdwb3NpdGlvbicsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gWzAsIDAsIGdldFRlcnJhaW5FbGV2YXRpb24odGhpc1JlZi5tYXAsIHZpZXdTdGF0ZSldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG9uVmlld1N0YXRlQ2hhbmdlKSB7XG4gICAgICBvblZpZXdTdGF0ZUNoYW5nZSh7XG4gICAgICAgIHZpZXdTdGF0ZTogdmlld1N0YXRlLFxuICAgICAgICBpbnRlcmFjdGlvblN0YXRlOiBpbnRlcmFjdGlvblN0YXRlLFxuICAgICAgICBvbGRWaWV3U3RhdGU6IG9sZFZpZXdTdGF0ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9uVmlld3BvcnRDaGFuZ2UpIHtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2Uodmlld1N0YXRlLCBpbnRlcmFjdGlvblN0YXRlLCBvbGRWaWV3U3RhdGUpO1xuICAgIH1cbiAgfTtcblxuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRSZWZIYW5kbGVzKHN0YXRpY01hcFJlZik7XG4gIH0sIFtdKTtcbiAgdmFyIGNvbnRleHQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwYXJlbnRDb250ZXh0KSwge30sIHtcbiAgICAgIGV2ZW50TWFuYWdlcjogZXZlbnRNYW5hZ2VyLFxuICAgICAgY29udGFpbmVyOiBwYXJlbnRDb250ZXh0LmNvbnRhaW5lciB8fCBldmVudENhbnZhc1JlZi5jdXJyZW50XG4gICAgfSk7XG4gIH0sIFtwYXJlbnRDb250ZXh0LCBldmVudENhbnZhc1JlZi5jdXJyZW50XSk7XG4gIGNvbnRleHQub25WaWV3cG9ydENoYW5nZSA9IGhhbmRsZVZpZXdwb3J0Q2hhbmdlO1xuICBjb250ZXh0LnZpZXdwb3J0ID0gcGFyZW50Q29udGV4dC52aWV3cG9ydCB8fCBnZXRWaWV3cG9ydCh0aGlzUmVmKTtcbiAgdGhpc1JlZi52aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQ7XG5cbiAgdmFyIGhhbmRsZUludGVyYWN0aW9uU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVJbnRlcmFjdGlvblN0YXRlQ2hhbmdlKGludGVyYWN0aW9uU3RhdGUpIHtcbiAgICB2YXIgX2ludGVyYWN0aW9uU3RhdGUkaXNEID0gaW50ZXJhY3Rpb25TdGF0ZS5pc0RyYWdnaW5nLFxuICAgICAgICBpc0RyYWdnaW5nID0gX2ludGVyYWN0aW9uU3RhdGUkaXNEID09PSB2b2lkIDAgPyBmYWxzZSA6IF9pbnRlcmFjdGlvblN0YXRlJGlzRDtcblxuICAgIGlmIChpc0RyYWdnaW5nICE9PSB0aGlzUmVmLnN0YXRlLmlzRHJhZ2dpbmcpIHtcbiAgICAgIHRoaXNSZWYuc2V0U3RhdGUoe1xuICAgICAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaW5SZW5kZXIpIHtcbiAgICAgIHN0YXRlVXBkYXRlUmVxdWVzdGVkID0gaW50ZXJhY3Rpb25TdGF0ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb25JbnRlcmFjdGlvblN0YXRlQ2hhbmdlID0gdGhpc1JlZi5wcm9wcy5vbkludGVyYWN0aW9uU3RhdGVDaGFuZ2U7XG5cbiAgICBpZiAob25JbnRlcmFjdGlvblN0YXRlQ2hhbmdlKSB7XG4gICAgICBvbkludGVyYWN0aW9uU3RhdGVDaGFuZ2UoaW50ZXJhY3Rpb25TdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB1cGRhdGVDb250cm9sbGVyT3B0cyA9IGZ1bmN0aW9uIHVwZGF0ZUNvbnRyb2xsZXJPcHRzKCkge1xuICAgIGlmICh0aGlzUmVmLndpZHRoICYmIHRoaXNSZWYuaGVpZ2h0KSB7XG4gICAgICBjb250cm9sbGVyLnNldE9wdGlvbnMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXNSZWYucHJvcHMpLCB0aGlzUmVmLnByb3BzLnZpZXdTdGF0ZSksIHt9LCB7XG4gICAgICAgIGlzSW50ZXJhY3RpdmU6IEJvb2xlYW4odGhpc1JlZi5wcm9wcy5vblZpZXdTdGF0ZUNoYW5nZSB8fCB0aGlzUmVmLnByb3BzLm9uVmlld3BvcnRDaGFuZ2UpLFxuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlOiBoYW5kbGVWaWV3cG9ydENoYW5nZSxcbiAgICAgICAgb25TdGF0ZUNoYW5nZTogaGFuZGxlSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZSxcbiAgICAgICAgZXZlbnRNYW5hZ2VyOiBldmVudE1hbmFnZXIsXG4gICAgICAgIHdpZHRoOiB0aGlzUmVmLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXNSZWYuaGVpZ2h0XG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvblJlc2l6ZSA9IGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYyKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodDtcbiAgICB0aGlzUmVmLndpZHRoID0gd2lkdGg7XG4gICAgdGhpc1JlZi5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdXBkYXRlQ29udHJvbGxlck9wdHMoKTtcbiAgICB0aGlzUmVmLnByb3BzLm9uUmVzaXplKHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBldmVudE1hbmFnZXIuc2V0RWxlbWVudChldmVudENhbnZhc1JlZi5jdXJyZW50KTtcbiAgICBldmVudE1hbmFnZXIub24oe1xuICAgICAgcG9pbnRlcmRvd246IG9uUG9pbnRlckRvd24uYmluZCh0aGlzUmVmKSxcbiAgICAgIHBvaW50ZXJtb3ZlOiBvblBvaW50ZXJNb3ZlLmJpbmQodGhpc1JlZiksXG4gICAgICBwb2ludGVydXA6IG9uUG9pbnRlclVwLmJpbmQodGhpc1JlZiksXG4gICAgICBwb2ludGVybGVhdmU6IG9uRXZlbnQuYmluZCh0aGlzUmVmLCAnb25Nb3VzZU91dCcpLFxuICAgICAgY2xpY2s6IG9uUG9pbnRlckNsaWNrLmJpbmQodGhpc1JlZiksXG4gICAgICBhbnljbGljazogb25Qb2ludGVyQ2xpY2suYmluZCh0aGlzUmVmKSxcbiAgICAgIGRibGNsaWNrOiBvbkV2ZW50LmJpbmQodGhpc1JlZiwgJ29uRGJsQ2xpY2snKSxcbiAgICAgIHdoZWVsOiBvbkV2ZW50LmJpbmQodGhpc1JlZiwgJ29uV2hlZWwnKSxcbiAgICAgIGNvbnRleHRtZW51OiBvbkV2ZW50LmJpbmQodGhpc1JlZiwgJ29uQ29udGV4dE1lbnUnKVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBldmVudE1hbmFnZXIuZGVzdHJveSgpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKSB7XG4gICAgICBoYW5kbGVWaWV3cG9ydENoYW5nZS5hcHBseSh2b2lkIDAsIF90b0NvbnN1bWFibGVBcnJheSh2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCkpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZVVwZGF0ZVJlcXVlc3RlZCkge1xuICAgICAgaGFuZGxlSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZVVwZGF0ZVJlcXVlc3RlZCk7XG4gICAgfVxuICB9KTtcbiAgdXBkYXRlQ29udHJvbGxlck9wdHMoKTtcbiAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgZ2V0Q3Vyc29yID0gcHJvcHMuZ2V0Q3Vyc29yO1xuICB2YXIgZXZlbnRDYW52YXNTdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICB9LCBzdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIGN1cnNvcjogZ2V0Q3Vyc29yKHRoaXNSZWYuc3RhdGUpXG4gICAgfSk7XG4gIH0sIFtzdHlsZSwgd2lkdGgsIGhlaWdodCwgZ2V0Q3Vyc29yLCB0aGlzUmVmLnN0YXRlXSk7XG5cbiAgaWYgKCF2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCB8fCAhdGhpc1JlZi5fY2hpbGQpIHtcbiAgICB0aGlzUmVmLl9jaGlsZCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFwQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAga2V5OiBcImV2ZW50LWNhbnZhc1wiLFxuICAgICAgcmVmOiBldmVudENhbnZhc1JlZixcbiAgICAgIHN0eWxlOiBldmVudENhbnZhc1N0eWxlXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChTdGF0aWNNYXAsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIHN0eWxlOiBudWxsLFxuICAgICAgb25SZXNpemU6IG9uUmVzaXplLFxuICAgICAgcmVmOiBzdGF0aWNNYXBSZWZcbiAgICB9KSkpKTtcbiAgfVxuXG4gIGluUmVuZGVyID0gZmFsc2U7XG4gIHJldHVybiB0aGlzUmVmLl9jaGlsZDtcbn0pO1xuSW50ZXJhY3RpdmVNYXAuc3VwcG9ydGVkID0gU3RhdGljTWFwLnN1cHBvcnRlZDtcbkludGVyYWN0aXZlTWFwLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkludGVyYWN0aXZlTWFwLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEludGVyYWN0aXZlTWFwOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikgfHwgYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChfdHlwZW9mKGEpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKGIpID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuXG4gICAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwLCBfYUtleXMgPSBhS2V5czsgX2kgPCBfYUtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIga2V5ID0gX2FLZXlzW19pXTtcblxuICAgICAgaWYgKCFiLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTWFwQ29udGV4dCBmcm9tICcuL21hcC1jb250ZXh0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vdXRpbHMvYXNzZXJ0JztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vdXRpbHMvZGVlcC1lcXVhbCc7XG52YXIgc291cmNlQ291bnRlciA9IDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNvdXJjZShtYXAsIGlkLCBwcm9wcykge1xuICBpZiAobWFwLnN0eWxlICYmIG1hcC5zdHlsZS5fbG9hZGVkKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyk7XG5cbiAgICBkZWxldGUgb3B0aW9ucy5pZDtcbiAgICBkZWxldGUgb3B0aW9ucy5jaGlsZHJlbjtcbiAgICBtYXAuYWRkU291cmNlKGlkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFwLmdldFNvdXJjZShpZCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU291cmNlKHNvdXJjZSwgcHJvcHMsIHByZXZQcm9wcykge1xuICBhc3NlcnQocHJvcHMuaWQgPT09IHByZXZQcm9wcy5pZCwgJ3NvdXJjZSBpZCBjaGFuZ2VkJyk7XG4gIGFzc2VydChwcm9wcy50eXBlID09PSBwcmV2UHJvcHMudHlwZSwgJ3NvdXJjZSB0eXBlIGNoYW5nZWQnKTtcbiAgdmFyIGNoYW5nZWRLZXkgPSAnJztcbiAgdmFyIGNoYW5nZWRLZXlDb3VudCA9IDA7XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdpZCcgJiYgIWRlZXBFcXVhbChwcmV2UHJvcHNba2V5XSwgcHJvcHNba2V5XSkpIHtcbiAgICAgIGNoYW5nZWRLZXkgPSBrZXk7XG4gICAgICBjaGFuZ2VkS2V5Q291bnQrKztcbiAgICB9XG4gIH1cblxuICBpZiAoIWNoYW5nZWRLZXlDb3VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodHlwZSA9PT0gJ2dlb2pzb24nKSB7XG4gICAgc291cmNlLnNldERhdGEocHJvcHMuZGF0YSk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIHNvdXJjZS51cGRhdGVJbWFnZSh7XG4gICAgICB1cmw6IHByb3BzLnVybCxcbiAgICAgIGNvb3JkaW5hdGVzOiBwcm9wcy5jb29yZGluYXRlc1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCh0eXBlID09PSAnY2FudmFzJyB8fCB0eXBlID09PSAndmlkZW8nKSAmJiBjaGFuZ2VkS2V5Q291bnQgPT09IDEgJiYgY2hhbmdlZEtleSA9PT0gJ2Nvb3JkaW5hdGVzJykge1xuICAgIHNvdXJjZS5zZXRDb29yZGluYXRlcyhwcm9wcy5jb29yZGluYXRlcyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZlY3RvcicgJiYgc291cmNlLnNldFVybCkge1xuICAgIHN3aXRjaCAoY2hhbmdlZEtleSkge1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgc291cmNlLnNldFVybChwcm9wcy51cmwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGlsZXMnOlxuICAgICAgICBzb3VyY2Uuc2V0VGlsZXMocHJvcHMudGlsZXMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKFwiVW5hYmxlIHRvIHVwZGF0ZSA8U291cmNlPiBwcm9wOiBcIi5jb25jYXQoY2hhbmdlZEtleSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIFNvdXJjZShwcm9wcykge1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHZhciBwcm9wc1JlZiA9IHVzZVJlZih7XG4gICAgaWQ6IHByb3BzLmlkLFxuICAgIHR5cGU6IHByb3BzLnR5cGVcbiAgfSk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzZXRTdHlsZUxvYWRlZCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGlkID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3BzLmlkIHx8IFwianN4LXNvdXJjZS1cIi5jb25jYXQoc291cmNlQ291bnRlcisrKTtcbiAgfSwgW10pO1xuICB2YXIgbWFwID0gY29udGV4dC5tYXA7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1hcCkge1xuICAgICAgdmFyIGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIHJldHVybiBzZXRTdHlsZUxvYWRlZChmdW5jdGlvbiAodmVyc2lvbikge1xuICAgICAgICAgIHJldHVybiB2ZXJzaW9uICsgMTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBtYXAub24oJ3N0eWxlZGF0YScsIGZvcmNlVXBkYXRlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1hcC5vZmYoJ3N0eWxlZGF0YScsIGZvcmNlVXBkYXRlKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobWFwLnN0eWxlICYmIG1hcC5zdHlsZS5fbG9hZGVkICYmIG1hcC5nZXRTb3VyY2UoaWQpKSB7XG4gICAgICAgICAgICBtYXAucmVtb3ZlU291cmNlKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbbWFwLCBpZF0pO1xuICB2YXIgc291cmNlID0gbWFwICYmIG1hcC5zdHlsZSAmJiBtYXAuZ2V0U291cmNlKGlkKTtcblxuICBpZiAoc291cmNlKSB7XG4gICAgdXBkYXRlU291cmNlKHNvdXJjZSwgcHJvcHMsIHByb3BzUmVmLmN1cnJlbnQpO1xuICB9IGVsc2Uge1xuICAgIHNvdXJjZSA9IGNyZWF0ZVNvdXJjZShtYXAsIGlkLCBwcm9wcyk7XG4gIH1cblxuICBwcm9wc1JlZi5jdXJyZW50ID0gcHJvcHM7XG4gIHJldHVybiBzb3VyY2UgJiYgUmVhY3QuQ2hpbGRyZW4ubWFwKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQgJiYgY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICBzb3VyY2U6IGlkXG4gICAgfSk7XG4gIH0pIHx8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgTWFwQ29udGV4dCBmcm9tICcuL21hcC1jb250ZXh0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vdXRpbHMvYXNzZXJ0JztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vdXRpbHMvZGVlcC1lcXVhbCc7XG52YXIgTEFZRVJfVFlQRVMgPSBbJ2ZpbGwnLCAnbGluZScsICdzeW1ib2wnLCAnY2lyY2xlJywgJ2ZpbGwtZXh0cnVzaW9uJywgJ3Jhc3RlcicsICdiYWNrZ3JvdW5kJywgJ2hlYXRtYXAnLCAnaGlsbHNoYWRlJywgJ3NreSddO1xudmFyIHByb3BUeXBlcyA9IHtcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKExBWUVSX1RZUEVTKS5pc1JlcXVpcmVkLFxuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgc291cmNlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBiZWZvcmVJZDogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZnVuY3Rpb24gZGlmZkxheWVyU3R5bGVzKG1hcCwgaWQsIHByb3BzLCBwcmV2UHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRsYXlvdXQgPSBwcm9wcy5sYXlvdXQsXG4gICAgICBsYXlvdXQgPSBfcHJvcHMkbGF5b3V0ID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRsYXlvdXQsXG4gICAgICBfcHJvcHMkcGFpbnQgPSBwcm9wcy5wYWludCxcbiAgICAgIHBhaW50ID0gX3Byb3BzJHBhaW50ID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRwYWludCxcbiAgICAgIGZpbHRlciA9IHByb3BzLmZpbHRlcixcbiAgICAgIG1pbnpvb20gPSBwcm9wcy5taW56b29tLFxuICAgICAgbWF4em9vbSA9IHByb3BzLm1heHpvb20sXG4gICAgICBiZWZvcmVJZCA9IHByb3BzLmJlZm9yZUlkLFxuICAgICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wibGF5b3V0XCIsIFwicGFpbnRcIiwgXCJmaWx0ZXJcIiwgXCJtaW56b29tXCIsIFwibWF4em9vbVwiLCBcImJlZm9yZUlkXCJdKTtcblxuICBpZiAoYmVmb3JlSWQgIT09IHByZXZQcm9wcy5iZWZvcmVJZCkge1xuICAgIG1hcC5tb3ZlTGF5ZXIoaWQsIGJlZm9yZUlkKTtcbiAgfVxuXG4gIGlmIChsYXlvdXQgIT09IHByZXZQcm9wcy5sYXlvdXQpIHtcbiAgICB2YXIgcHJldkxheW91dCA9IHByZXZQcm9wcy5sYXlvdXQgfHwge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChsYXlvdXRba2V5XSwgcHJldkxheW91dFtrZXldKSkge1xuICAgICAgICBtYXAuc2V0TGF5b3V0UHJvcGVydHkoaWQsIGtleSwgbGF5b3V0W2tleV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9rZXkgaW4gcHJldkxheW91dCkge1xuICAgICAgaWYgKCFsYXlvdXQuaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgICAgbWFwLnNldExheW91dFByb3BlcnR5KGlkLCBfa2V5LCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwYWludCAhPT0gcHJldlByb3BzLnBhaW50KSB7XG4gICAgdmFyIHByZXZQYWludCA9IHByZXZQcm9wcy5wYWludCB8fCB7fTtcblxuICAgIGZvciAodmFyIF9rZXkyIGluIHBhaW50KSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChwYWludFtfa2V5Ml0sIHByZXZQYWludFtfa2V5Ml0pKSB7XG4gICAgICAgIG1hcC5zZXRQYWludFByb3BlcnR5KGlkLCBfa2V5MiwgcGFpbnRbX2tleTJdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfa2V5MyBpbiBwcmV2UGFpbnQpIHtcbiAgICAgIGlmICghcGFpbnQuaGFzT3duUHJvcGVydHkoX2tleTMpKSB7XG4gICAgICAgIG1hcC5zZXRQYWludFByb3BlcnR5KGlkLCBfa2V5MywgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWRlZXBFcXVhbChmaWx0ZXIsIHByZXZQcm9wcy5maWx0ZXIpKSB7XG4gICAgbWFwLnNldEZpbHRlcihpZCwgZmlsdGVyKTtcbiAgfVxuXG4gIGlmIChtaW56b29tICE9PSBwcmV2UHJvcHMubWluem9vbSB8fCBtYXh6b29tICE9PSBwcmV2UHJvcHMubWF4em9vbSkge1xuICAgIG1hcC5zZXRMYXllclpvb21SYW5nZShpZCwgbWluem9vbSwgbWF4em9vbSk7XG4gIH1cblxuICBmb3IgKHZhciBfa2V5NCBpbiBvdGhlclByb3BzKSB7XG4gICAgaWYgKCFkZWVwRXF1YWwob3RoZXJQcm9wc1tfa2V5NF0sIHByZXZQcm9wc1tfa2V5NF0pKSB7XG4gICAgICBtYXAuc2V0TGF5ZXJQcm9wZXJ0eShpZCwgX2tleTQsIG90aGVyUHJvcHNbX2tleTRdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTGF5ZXIobWFwLCBpZCwgcHJvcHMpIHtcbiAgaWYgKG1hcC5zdHlsZSAmJiBtYXAuc3R5bGUuX2xvYWRlZCkge1xuICAgIHZhciBvcHRpb25zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBpZDogaWRcbiAgICB9KTtcblxuICAgIGRlbGV0ZSBvcHRpb25zLmJlZm9yZUlkO1xuICAgIG1hcC5hZGRMYXllcihvcHRpb25zLCBwcm9wcy5iZWZvcmVJZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5ZXIobWFwLCBpZCwgcHJvcHMsIHByZXZQcm9wcykge1xuICBhc3NlcnQocHJvcHMuaWQgPT09IHByZXZQcm9wcy5pZCwgJ2xheWVyIGlkIGNoYW5nZWQnKTtcbiAgYXNzZXJ0KHByb3BzLnR5cGUgPT09IHByZXZQcm9wcy50eXBlLCAnbGF5ZXIgdHlwZSBjaGFuZ2VkJyk7XG5cbiAgdHJ5IHtcbiAgICBkaWZmTGF5ZXJTdHlsZXMobWFwLCBpZCwgcHJvcHMsIHByZXZQcm9wcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgfVxufVxuXG52YXIgbGF5ZXJDb3VudGVyID0gMDtcblxuZnVuY3Rpb24gTGF5ZXIocHJvcHMpIHtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB2YXIgcHJvcHNSZWYgPSB1c2VSZWYoe1xuICAgIGlkOiBwcm9wcy5pZCxcbiAgICB0eXBlOiBwcm9wcy50eXBlXG4gIH0pO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgwKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgc2V0U3R5bGVMb2FkZWQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBpZCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwcm9wcy5pZCB8fCBcImpzeC1sYXllci1cIi5jb25jYXQobGF5ZXJDb3VudGVyKyspO1xuICB9LCBbXSk7XG4gIHZhciBtYXAgPSBjb250ZXh0Lm1hcDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWFwKSB7XG4gICAgICB2YXIgZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHNldFN0eWxlTG9hZGVkKGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHZlcnNpb24gKyAxO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIG1hcC5vbignc3R5bGVkYXRhJywgZm9yY2VVcGRhdGUpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWFwLm9mZignc3R5bGVkYXRhJywgZm9yY2VVcGRhdGUpO1xuXG4gICAgICAgIGlmIChtYXAuc3R5bGUgJiYgbWFwLnN0eWxlLl9sb2FkZWQpIHtcbiAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIoaWQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFttYXBdKTtcbiAgdmFyIGxheWVyID0gbWFwICYmIG1hcC5zdHlsZSAmJiBtYXAuZ2V0TGF5ZXIoaWQpO1xuXG4gIGlmIChsYXllcikge1xuICAgIHVwZGF0ZUxheWVyKG1hcCwgaWQsIHByb3BzLCBwcm9wc1JlZi5jdXJyZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjcmVhdGVMYXllcihtYXAsIGlkLCBwcm9wcyk7XG4gIH1cblxuICBwcm9wc1JlZi5jdXJyZW50ID0gcHJvcHM7XG4gIHJldHVybiBudWxsO1xufVxuXG5MYXllci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnQgZGVmYXVsdCBMYXllcjsiLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBNYXBDb250ZXh0IGZyb20gJy4vbWFwLWNvbnRleHQnO1xuZXhwb3J0IHZhciBtYXBDb250cm9sRGVmYXVsdFByb3BzID0ge1xuICBjYXB0dXJlU2Nyb2xsOiBmYWxzZSxcbiAgY2FwdHVyZURyYWc6IHRydWUsXG4gIGNhcHR1cmVDbGljazogdHJ1ZSxcbiAgY2FwdHVyZURvdWJsZUNsaWNrOiB0cnVlLFxuICBjYXB0dXJlUG9pbnRlck1vdmU6IGZhbHNlXG59O1xuZXhwb3J0IHZhciBtYXBDb250cm9sUHJvcFR5cGVzID0ge1xuICBjYXB0dXJlU2Nyb2xsOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2FwdHVyZURyYWc6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlRG91YmxlQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlUG9pbnRlck1vdmU6IFByb3BUeXBlcy5ib29sXG59O1xuXG5mdW5jdGlvbiBvbk1vdW50KHRoaXNSZWYpIHtcbiAgdmFyIHJlZiA9IHRoaXNSZWYuY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gIHZhciBldmVudE1hbmFnZXIgPSB0aGlzUmVmLmNvbnRleHQuZXZlbnRNYW5hZ2VyO1xuXG4gIGlmICghcmVmIHx8ICFldmVudE1hbmFnZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGV2ZW50cyA9IHtcbiAgICB3aGVlbDogZnVuY3Rpb24gd2hlZWwoZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZVNjcm9sbCkge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbCkge1xuICAgICAgICBwcm9wcy5vblNjcm9sbChldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGFuc3RhcnQ6IGZ1bmN0aW9uIHBhbnN0YXJ0KGV2dCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpc1JlZi5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLmNhcHR1cmVEcmFnKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgIHByb3BzLm9uRHJhZ1N0YXJ0KGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfSxcbiAgICBhbnljbGljazogZnVuY3Rpb24gYW55Y2xpY2soZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZUNsaWNrKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgcHJvcHMub25DbGljayhldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xpY2s6IGZ1bmN0aW9uIGNsaWNrKGV2dCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpc1JlZi5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLmNhcHR1cmVDbGljaykge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgIHByb3BzLm9uQ2xpY2soZXZ0LCB0aGlzUmVmKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRibGNsaWNrOiBmdW5jdGlvbiBkYmxjbGljayhldnQpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXNSZWYucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy5jYXB0dXJlRG91YmxlQ2xpY2spIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMub25Eb3VibGVDbGljaykge1xuICAgICAgICBwcm9wcy5vbkRvdWJsZUNsaWNrKGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfSxcbiAgICBwb2ludGVybW92ZTogZnVuY3Rpb24gcG9pbnRlcm1vdmUoZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZVBvaW50ZXJNb3ZlKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uUG9pbnRlck1vdmUpIHtcbiAgICAgICAgcHJvcHMub25Qb2ludGVyTW92ZShldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZXZlbnRNYW5hZ2VyLndhdGNoKGV2ZW50cywgcmVmKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBldmVudE1hbmFnZXIub2ZmKGV2ZW50cyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1hcENvbnRyb2woKSB7XG4gIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChNYXBDb250ZXh0KTtcbiAgdmFyIGNvbnRhaW5lclJlZiA9IHVzZVJlZihudWxsKTtcblxuICB2YXIgX3RoaXNSZWYgPSB1c2VSZWYoe1xuICAgIHByb3BzOiBwcm9wcyxcbiAgICBzdGF0ZToge30sXG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjb250YWluZXJSZWY6IGNvbnRhaW5lclJlZlxuICB9KTtcblxuICB2YXIgdGhpc1JlZiA9IF90aGlzUmVmLmN1cnJlbnQ7XG4gIHRoaXNSZWYucHJvcHMgPSBwcm9wcztcbiAgdGhpc1JlZi5jb250ZXh0ID0gY29udGV4dDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gb25Nb3VudCh0aGlzUmVmKTtcbiAgfSwgW2NvbnRleHQuZXZlbnRNYW5hZ2VyXSk7XG4gIHJldHVybiB0aGlzUmVmO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHtcbiAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkge1xuICAgIHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHtcbiAgICAgIHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7XG5cbiAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHVyZUNvbXBvbmVudCwgY3JlYXRlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcblxuZnVuY3Rpb24gQ29udHJvbChwcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSBwcm9wcy5pbnN0YW5jZTtcblxuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIGluc3RhbmNlLl9jb250ZXh0ID0gY29udGV4dDtcbiAgaW5zdGFuY2UuX2NvbnRhaW5lclJlZiA9IGNvbnRhaW5lclJlZjtcbiAgcmV0dXJuIGluc3RhbmNlLl9yZW5kZXIoKTtcbn1cblxudmFyIEJhc2VDb250cm9sID0gZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhCYXNlQ29udHJvbCwgX1B1cmVDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQmFzZUNvbnRyb2wpO1xuXG4gIGZ1bmN0aW9uIEJhc2VDb250cm9sKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCYXNlQ29udHJvbCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9jb250ZXh0XCIsIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfY29udGFpbmVyUmVmXCIsIGNyZWF0ZVJlZigpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfb25TY3JvbGxcIiwgZnVuY3Rpb24gKGV2dCkge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9vbkRyYWdTdGFydFwiLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX29uRGJsQ2xpY2tcIiwgZnVuY3Rpb24gKGV2dCkge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9vbkNsaWNrXCIsIGZ1bmN0aW9uIChldnQpIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfb25Qb2ludGVyTW92ZVwiLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmFzZUNvbnRyb2wsIFt7XG4gICAga2V5OiBcIl9yZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbmRlcigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignX3JlbmRlcigpIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udHJvbCwgX2V4dGVuZHMoe1xuICAgICAgICBpbnN0YW5jZTogdGhpc1xuICAgICAgfSwgdGhpcy5wcm9wcywge1xuICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGwsXG4gICAgICAgIG9uRHJhZ1N0YXJ0OiB0aGlzLl9vbkRyYWdTdGFydCxcbiAgICAgICAgb25EYmxDbGljazogdGhpcy5fb25EYmxDbGljayxcbiAgICAgICAgb25DbGljazogdGhpcy5fb25DbGljayxcbiAgICAgICAgb25Qb2ludGVyTW92ZTogdGhpcy5fb25Qb2ludGVyTW92ZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCYXNlQ29udHJvbDtcbn0oUHVyZUNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShCYXNlQ29udHJvbCwgXCJwcm9wVHlwZXNcIiwgbWFwQ29udHJvbFByb3BUeXBlcyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShCYXNlQ29udHJvbCwgXCJkZWZhdWx0UHJvcHNcIiwgbWFwQ29udHJvbERlZmF1bHRQcm9wcyk7XG5cbmV4cG9ydCB7IEJhc2VDb250cm9sIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL3VzZS1tYXAtY29udHJvbCc7XG5leHBvcnQgdmFyIGRyYWdnYWJsZUNvbnRyb2xQcm9wVHlwZXMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sUHJvcFR5cGVzLCB7XG4gIGRyYWdnYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIG9uRHJhZzogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRHJhZ0VuZDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRHJhZ1N0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb2Zmc2V0TGVmdDogUHJvcFR5cGVzLm51bWJlcixcbiAgb2Zmc2V0VG9wOiBQcm9wVHlwZXMubnVtYmVyXG59KTtcbmV4cG9ydCB2YXIgZHJhZ2dhYmxlQ29udHJvbERlZmF1bHRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIHtcbiAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgb2Zmc2V0TGVmdDogMCxcbiAgb2Zmc2V0VG9wOiAwXG59KTtcblxuZnVuY3Rpb24gZ2V0RHJhZ0V2ZW50UG9zaXRpb24oZXZlbnQpIHtcbiAgdmFyIF9ldmVudCRvZmZzZXRDZW50ZXIgPSBldmVudC5vZmZzZXRDZW50ZXIsXG4gICAgICB4ID0gX2V2ZW50JG9mZnNldENlbnRlci54LFxuICAgICAgeSA9IF9ldmVudCRvZmZzZXRDZW50ZXIueTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZnVuY3Rpb24gZ2V0RHJhZ0V2ZW50T2Zmc2V0KGV2ZW50LCBjb250YWluZXIpIHtcbiAgdmFyIF9ldmVudCRjZW50ZXIgPSBldmVudC5jZW50ZXIsXG4gICAgICB4ID0gX2V2ZW50JGNlbnRlci54LFxuICAgICAgeSA9IF9ldmVudCRjZW50ZXIueTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgdmFyIHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFtyZWN0LmxlZnQgLSB4LCByZWN0LnRvcCAtIHldO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldERyYWdMbmdMYXQoZHJhZ1BvcywgZHJhZ09mZnNldCwgcHJvcHMsIGNvbnRleHQpIHtcbiAgdmFyIHggPSBkcmFnUG9zWzBdICsgZHJhZ09mZnNldFswXSAtIHByb3BzLm9mZnNldExlZnQ7XG4gIHZhciB5ID0gZHJhZ1Bvc1sxXSArIGRyYWdPZmZzZXRbMV0gLSBwcm9wcy5vZmZzZXRUb3A7XG4gIHJldHVybiBjb250ZXh0LnZpZXdwb3J0LnVucHJvamVjdChbeCwgeV0pO1xufVxuXG5mdW5jdGlvbiBvbkRyYWdTdGFydChldmVudCwgX3JlZikge1xuICB2YXIgcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgICAgY2FsbGJhY2tzID0gX3JlZi5jYWxsYmFja3MsXG4gICAgICBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBjb250ZXh0ID0gX3JlZi5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3JlZi5jb250YWluZXJSZWY7XG4gIHZhciBkcmFnZ2FibGUgPSBwcm9wcy5kcmFnZ2FibGU7XG5cbiAgaWYgKCFkcmFnZ2FibGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgdmFyIGRyYWdQb3MgPSBnZXREcmFnRXZlbnRQb3NpdGlvbihldmVudCk7XG4gIHZhciBkcmFnT2Zmc2V0ID0gZ2V0RHJhZ0V2ZW50T2Zmc2V0KGV2ZW50LCBjb250YWluZXJSZWYuY3VycmVudCk7XG4gIHN0YXRlLnNldERyYWdQb3MoZHJhZ1Bvcyk7XG4gIHN0YXRlLnNldERyYWdPZmZzZXQoZHJhZ09mZnNldCk7XG5cbiAgaWYgKGNhbGxiYWNrcy5vbkRyYWdTdGFydCAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgdmFyIGNhbGxiYWNrRXZlbnQgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudCk7XG4gICAgY2FsbGJhY2tFdmVudC5sbmdMYXQgPSBnZXREcmFnTG5nTGF0KGRyYWdQb3MsIGRyYWdPZmZzZXQsIHByb3BzLCBjb250ZXh0KTtcbiAgICBjYWxsYmFja3Mub25EcmFnU3RhcnQoY2FsbGJhY2tFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25EcmFnKGV2ZW50LCBfcmVmMikge1xuICB2YXIgcHJvcHMgPSBfcmVmMi5wcm9wcyxcbiAgICAgIGNhbGxiYWNrcyA9IF9yZWYyLmNhbGxiYWNrcyxcbiAgICAgIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBjb250ZXh0ID0gX3JlZjIuY29udGV4dDtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIHZhciBkcmFnUG9zID0gZ2V0RHJhZ0V2ZW50UG9zaXRpb24oZXZlbnQpO1xuICBzdGF0ZS5zZXREcmFnUG9zKGRyYWdQb3MpO1xuICB2YXIgZHJhZ09mZnNldCA9IHN0YXRlLmRyYWdPZmZzZXQ7XG5cbiAgaWYgKGNhbGxiYWNrcy5vbkRyYWcgJiYgZHJhZ09mZnNldCkge1xuICAgIHZhciBjYWxsYmFja0V2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQpO1xuICAgIGNhbGxiYWNrRXZlbnQubG5nTGF0ID0gZ2V0RHJhZ0xuZ0xhdChkcmFnUG9zLCBkcmFnT2Zmc2V0LCBwcm9wcywgY29udGV4dCk7XG4gICAgY2FsbGJhY2tzLm9uRHJhZyhjYWxsYmFja0V2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkRyYWdFbmQoZXZlbnQsIF9yZWYzKSB7XG4gIHZhciBwcm9wcyA9IF9yZWYzLnByb3BzLFxuICAgICAgY2FsbGJhY2tzID0gX3JlZjMuY2FsbGJhY2tzLFxuICAgICAgc3RhdGUgPSBfcmVmMy5zdGF0ZSxcbiAgICAgIGNvbnRleHQgPSBfcmVmMy5jb250ZXh0O1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgdmFyIGRyYWdQb3MgPSBzdGF0ZS5kcmFnUG9zLFxuICAgICAgZHJhZ09mZnNldCA9IHN0YXRlLmRyYWdPZmZzZXQ7XG4gIHN0YXRlLnNldERyYWdQb3MobnVsbCk7XG4gIHN0YXRlLnNldERyYWdPZmZzZXQobnVsbCk7XG5cbiAgaWYgKGNhbGxiYWNrcy5vbkRyYWdFbmQgJiYgZHJhZ1BvcyAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgdmFyIGNhbGxiYWNrRXZlbnQgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudCk7XG4gICAgY2FsbGJhY2tFdmVudC5sbmdMYXQgPSBnZXREcmFnTG5nTGF0KGRyYWdQb3MsIGRyYWdPZmZzZXQsIHByb3BzLCBjb250ZXh0KTtcbiAgICBjYWxsYmFja3Mub25EcmFnRW5kKGNhbGxiYWNrRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uRHJhZ0NhbmNlbChldmVudCwgX3JlZjQpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjQuc3RhdGU7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBzdGF0ZS5zZXREcmFnUG9zKG51bGwpO1xuICBzdGF0ZS5zZXREcmFnT2Zmc2V0KG51bGwpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyh0aGlzUmVmKSB7XG4gIHZhciBldmVudE1hbmFnZXIgPSB0aGlzUmVmLmNvbnRleHQuZXZlbnRNYW5hZ2VyO1xuXG4gIGlmICghZXZlbnRNYW5hZ2VyIHx8ICF0aGlzUmVmLnN0YXRlLmRyYWdQb3MpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGV2ZW50cyA9IHtcbiAgICBwYW5tb3ZlOiBmdW5jdGlvbiBwYW5tb3ZlKGV2dCkge1xuICAgICAgcmV0dXJuIG9uRHJhZyhldnQsIHRoaXNSZWYpO1xuICAgIH0sXG4gICAgcGFuZW5kOiBmdW5jdGlvbiBwYW5lbmQoZXZ0KSB7XG4gICAgICByZXR1cm4gb25EcmFnRW5kKGV2dCwgdGhpc1JlZik7XG4gICAgfSxcbiAgICBwYW5jYW5jZWw6IGZ1bmN0aW9uIHBhbmNhbmNlbChldnQpIHtcbiAgICAgIHJldHVybiBvbkRyYWdDYW5jZWwoZXZ0LCB0aGlzUmVmKTtcbiAgICB9XG4gIH07XG4gIGV2ZW50TWFuYWdlci53YXRjaChldmVudHMpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50TWFuYWdlci5vZmYoZXZlbnRzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRHJhZ2dhYmxlQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGRyYWdQb3MgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RHJhZ1BvcyA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIGRyYWdPZmZzZXQgPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0RHJhZ09mZnNldCA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdmFyIHRoaXNSZWYgPSB1c2VNYXBDb250cm9sKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIG9uRHJhZ1N0YXJ0OiBvbkRyYWdTdGFydFxuICB9KSk7XG4gIHRoaXNSZWYuY2FsbGJhY2tzID0gcHJvcHM7XG4gIHRoaXNSZWYuc3RhdGUuZHJhZ1BvcyA9IGRyYWdQb3M7XG4gIHRoaXNSZWYuc3RhdGUuc2V0RHJhZ1BvcyA9IHNldERyYWdQb3M7XG4gIHRoaXNSZWYuc3RhdGUuZHJhZ09mZnNldCA9IGRyYWdPZmZzZXQ7XG4gIHRoaXNSZWYuc3RhdGUuc2V0RHJhZ09mZnNldCA9IHNldERyYWdPZmZzZXQ7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlZ2lzdGVyRXZlbnRzKHRoaXNSZWYpO1xuICB9LCBbdGhpc1JlZi5jb250ZXh0LmV2ZW50TWFuYWdlciwgQm9vbGVhbihkcmFnUG9zKV0pO1xuICByZXR1cm4gdGhpc1JlZjtcbn0iLCJ2YXIgcGl4ZWxSYXRpbyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG5leHBvcnQgdmFyIGNyaXNwUGl4ZWwgPSBmdW5jdGlvbiBjcmlzcFBpeGVsKHNpemUpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoc2l6ZSAqIHBpeGVsUmF0aW8pIC8gcGl4ZWxSYXRpbztcbn07XG5leHBvcnQgdmFyIGNyaXNwUGVyY2VudGFnZSA9IGZ1bmN0aW9uIGNyaXNwUGVyY2VudGFnZShlbCwgcGVyY2VudGFnZSkge1xuICB2YXIgZGltZW5zaW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAneCc7XG5cbiAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2U7XG4gIH1cblxuICB2YXIgb3JpZ1NpemUgPSBkaW1lbnNpb24gPT09ICd4JyA/IGVsLm9mZnNldFdpZHRoIDogZWwub2Zmc2V0SGVpZ2h0O1xuICByZXR1cm4gY3Jpc3BQaXhlbChwZXJjZW50YWdlIC8gMTAwICogb3JpZ1NpemUpIC8gb3JpZ1NpemUgKiAxMDA7XG59OyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VEcmFnZ2FibGVDb250cm9sLCB7IGRyYWdnYWJsZUNvbnRyb2xEZWZhdWx0UHJvcHMsIGRyYWdnYWJsZUNvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL2RyYWdnYWJsZS1jb250cm9sJztcbmltcG9ydCB7IGNyaXNwUGl4ZWwgfSBmcm9tICcuLi91dGlscy9jcmlzcC1waXhlbCc7XG5pbXBvcnQgeyBnZXRUZXJyYWluRWxldmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdGVycmFpbic7XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZHJhZ2dhYmxlQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnXG59KTtcblxuZnVuY3Rpb24gZ2V0UG9zaXRpb24oX3JlZikge1xuICB2YXIgcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgICAgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgY29udGV4dCA9IF9yZWYuY29udGV4dDtcbiAgdmFyIGxvbmdpdHVkZSA9IHByb3BzLmxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlID0gcHJvcHMubGF0aXR1ZGUsXG4gICAgICBvZmZzZXRMZWZ0ID0gcHJvcHMub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcCA9IHByb3BzLm9mZnNldFRvcDtcbiAgdmFyIGRyYWdQb3MgPSBzdGF0ZS5kcmFnUG9zLFxuICAgICAgZHJhZ09mZnNldCA9IHN0YXRlLmRyYWdPZmZzZXQ7XG4gIHZhciB2aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQsXG4gICAgICBtYXAgPSBjb250ZXh0Lm1hcDtcblxuICBpZiAoZHJhZ1BvcyAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgcmV0dXJuIFtkcmFnUG9zWzBdICsgZHJhZ09mZnNldFswXSwgZHJhZ1Bvc1sxXSArIGRyYWdPZmZzZXRbMV1dO1xuICB9XG5cbiAgdmFyIGFsdGl0dWRlID0gZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIHtcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGVcbiAgfSk7XG5cbiAgdmFyIF92aWV3cG9ydCRwcm9qZWN0ID0gdmlld3BvcnQucHJvamVjdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSwgYWx0aXR1ZGVdKSxcbiAgICAgIF92aWV3cG9ydCRwcm9qZWN0MiA9IF9zbGljZWRUb0FycmF5KF92aWV3cG9ydCRwcm9qZWN0LCAyKSxcbiAgICAgIHggPSBfdmlld3BvcnQkcHJvamVjdDJbMF0sXG4gICAgICB5ID0gX3ZpZXdwb3J0JHByb2plY3QyWzFdO1xuXG4gIHggKz0gb2Zmc2V0TGVmdDtcbiAgeSArPSBvZmZzZXRUb3A7XG4gIHJldHVybiBbeCwgeV07XG59XG5cbmZ1bmN0aW9uIE1hcmtlcihwcm9wcykge1xuICB2YXIgdGhpc1JlZiA9IHVzZURyYWdnYWJsZUNvbnRyb2wocHJvcHMpO1xuICB2YXIgc3RhdGUgPSB0aGlzUmVmLnN0YXRlLFxuICAgICAgY29udGFpbmVyUmVmID0gdGhpc1JlZi5jb250YWluZXJSZWY7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZHJhZ2dhYmxlID0gcHJvcHMuZHJhZ2dhYmxlO1xuICB2YXIgZHJhZ1BvcyA9IHN0YXRlLmRyYWdQb3M7XG5cbiAgdmFyIF9nZXRQb3NpdGlvbiA9IGdldFBvc2l0aW9uKHRoaXNSZWYpLFxuICAgICAgX2dldFBvc2l0aW9uMiA9IF9zbGljZWRUb0FycmF5KF9nZXRQb3NpdGlvbiwgMiksXG4gICAgICB4ID0gX2dldFBvc2l0aW9uMlswXSxcbiAgICAgIHkgPSBfZ2V0UG9zaXRpb24yWzFdO1xuXG4gIHZhciB0cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZShcIi5jb25jYXQoY3Jpc3BQaXhlbCh4KSwgXCJweCwgXCIpLmNvbmNhdChjcmlzcFBpeGVsKHkpLCBcInB4KVwiKTtcbiAgdmFyIGN1cnNvciA9IGRyYWdnYWJsZSA/IGRyYWdQb3MgPyAnZ3JhYmJpbmcnIDogJ2dyYWInIDogJ2F1dG8nO1xuICB2YXIgY29udHJvbCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250YWluZXJTdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgY3Vyc29yOiBjdXJzb3JcbiAgICB9O1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1tYXJrZXIgXCIuY29uY2F0KGNsYXNzTmFtZSksXG4gICAgICByZWY6IHRoaXNSZWYuY29udGFpbmVyUmVmLFxuICAgICAgc3R5bGU6IGNvbnRhaW5lclN0eWxlXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9LCBbY2hpbGRyZW4sIGNsYXNzTmFtZV0pO1xuICB2YXIgY29udGFpbmVyID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgY29udGFpbmVyLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sO1xufVxuXG5NYXJrZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhNYXJrZXIpOyIsImV4cG9ydCB2YXIgQU5DSE9SX1BPU0lUSU9OID0ge1xuICB0b3A6IHtcbiAgICB4OiAwLjUsXG4gICAgeTogMFxuICB9LFxuICAndG9wLWxlZnQnOiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH0sXG4gICd0b3AtcmlnaHQnOiB7XG4gICAgeDogMSxcbiAgICB5OiAwXG4gIH0sXG4gIGJvdHRvbToge1xuICAgIHg6IDAuNSxcbiAgICB5OiAxXG4gIH0sXG4gICdib3R0b20tbGVmdCc6IHtcbiAgICB4OiAwLFxuICAgIHk6IDFcbiAgfSxcbiAgJ2JvdHRvbS1yaWdodCc6IHtcbiAgICB4OiAxLFxuICAgIHk6IDFcbiAgfSxcbiAgbGVmdDoge1xuICAgIHg6IDAsXG4gICAgeTogMC41XG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgeDogMSxcbiAgICB5OiAwLjVcbiAgfVxufTtcbnZhciBBTkNIT1JfVFlQRVMgPSBPYmplY3Qua2V5cyhBTkNIT1JfUE9TSVRJT04pO1xuZXhwb3J0IGZ1bmN0aW9uIGdldER5bmFtaWNQb3NpdGlvbihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueSxcbiAgICAgIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgc2VsZldpZHRoID0gX3JlZi5zZWxmV2lkdGgsXG4gICAgICBzZWxmSGVpZ2h0ID0gX3JlZi5zZWxmSGVpZ2h0LFxuICAgICAgYW5jaG9yID0gX3JlZi5hbmNob3IsXG4gICAgICBfcmVmJHBhZGRpbmcgPSBfcmVmLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX3JlZiRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRwYWRkaW5nO1xuICB2YXIgX0FOQ0hPUl9QT1NJVElPTiRhbmNoID0gQU5DSE9SX1BPU0lUSU9OW2FuY2hvcl0sXG4gICAgICBhbmNob3JYID0gX0FOQ0hPUl9QT1NJVElPTiRhbmNoLngsXG4gICAgICBhbmNob3JZID0gX0FOQ0hPUl9QT1NJVElPTiRhbmNoLnk7XG4gIHZhciB0b3AgPSB5IC0gYW5jaG9yWSAqIHNlbGZIZWlnaHQ7XG4gIHZhciBib3R0b20gPSB0b3AgKyBzZWxmSGVpZ2h0O1xuICB2YXIgY3V0b2ZmWSA9IE1hdGgubWF4KDAsIHBhZGRpbmcgLSB0b3ApICsgTWF0aC5tYXgoMCwgYm90dG9tIC0gaGVpZ2h0ICsgcGFkZGluZyk7XG5cbiAgaWYgKGN1dG9mZlkgPiAwKSB7XG4gICAgdmFyIGJlc3RBbmNob3JZID0gYW5jaG9yWTtcbiAgICB2YXIgbWluQ3V0b2ZmID0gY3V0b2ZmWTtcblxuICAgIGZvciAoYW5jaG9yWSA9IDA7IGFuY2hvclkgPD0gMTsgYW5jaG9yWSArPSAwLjUpIHtcbiAgICAgIHRvcCA9IHkgLSBhbmNob3JZICogc2VsZkhlaWdodDtcbiAgICAgIGJvdHRvbSA9IHRvcCArIHNlbGZIZWlnaHQ7XG4gICAgICBjdXRvZmZZID0gTWF0aC5tYXgoMCwgcGFkZGluZyAtIHRvcCkgKyBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQgKyBwYWRkaW5nKTtcblxuICAgICAgaWYgKGN1dG9mZlkgPCBtaW5DdXRvZmYpIHtcbiAgICAgICAgbWluQ3V0b2ZmID0gY3V0b2ZmWTtcbiAgICAgICAgYmVzdEFuY2hvclkgPSBhbmNob3JZO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFuY2hvclkgPSBiZXN0QW5jaG9yWTtcbiAgfVxuXG4gIHZhciB4U3RlcCA9IDAuNTtcblxuICBpZiAoYW5jaG9yWSA9PT0gMC41KSB7XG4gICAgYW5jaG9yWCA9IE1hdGguZmxvb3IoYW5jaG9yWCk7XG4gICAgeFN0ZXAgPSAxO1xuICB9XG5cbiAgdmFyIGxlZnQgPSB4IC0gYW5jaG9yWCAqIHNlbGZXaWR0aDtcbiAgdmFyIHJpZ2h0ID0gbGVmdCArIHNlbGZXaWR0aDtcbiAgdmFyIGN1dG9mZlggPSBNYXRoLm1heCgwLCBwYWRkaW5nIC0gbGVmdCkgKyBNYXRoLm1heCgwLCByaWdodCAtIHdpZHRoICsgcGFkZGluZyk7XG5cbiAgaWYgKGN1dG9mZlggPiAwKSB7XG4gICAgdmFyIGJlc3RBbmNob3JYID0gYW5jaG9yWDtcbiAgICB2YXIgX21pbkN1dG9mZiA9IGN1dG9mZlg7XG5cbiAgICBmb3IgKGFuY2hvclggPSAwOyBhbmNob3JYIDw9IDE7IGFuY2hvclggKz0geFN0ZXApIHtcbiAgICAgIGxlZnQgPSB4IC0gYW5jaG9yWCAqIHNlbGZXaWR0aDtcbiAgICAgIHJpZ2h0ID0gbGVmdCArIHNlbGZXaWR0aDtcbiAgICAgIGN1dG9mZlggPSBNYXRoLm1heCgwLCBwYWRkaW5nIC0gbGVmdCkgKyBNYXRoLm1heCgwLCByaWdodCAtIHdpZHRoICsgcGFkZGluZyk7XG5cbiAgICAgIGlmIChjdXRvZmZYIDwgX21pbkN1dG9mZikge1xuICAgICAgICBfbWluQ3V0b2ZmID0gY3V0b2ZmWDtcbiAgICAgICAgYmVzdEFuY2hvclggPSBhbmNob3JYO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFuY2hvclggPSBiZXN0QW5jaG9yWDtcbiAgfVxuXG4gIHJldHVybiBBTkNIT1JfVFlQRVMuZmluZChmdW5jdGlvbiAocG9zaXRpb25UeXBlKSB7XG4gICAgdmFyIGFuY2hvclBvc2l0aW9uID0gQU5DSE9SX1BPU0lUSU9OW3Bvc2l0aW9uVHlwZV07XG4gICAgcmV0dXJuIGFuY2hvclBvc2l0aW9uLnggPT09IGFuY2hvclggJiYgYW5jaG9yUG9zaXRpb24ueSA9PT0gYW5jaG9yWTtcbiAgfSkgfHwgYW5jaG9yO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbmltcG9ydCB7IGdldER5bmFtaWNQb3NpdGlvbiwgQU5DSE9SX1BPU0lUSU9OIH0gZnJvbSAnLi4vdXRpbHMvZHluYW1pYy1wb3NpdGlvbic7XG5pbXBvcnQgeyBnZXRUZXJyYWluRWxldmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdGVycmFpbic7XG5pbXBvcnQgeyBjcmlzcFBlcmNlbnRhZ2UsIGNyaXNwUGl4ZWwgfSBmcm9tICcuLi91dGlscy9jcmlzcC1waXhlbCc7XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnLFxuICBvZmZzZXRMZWZ0OiAwLFxuICBvZmZzZXRUb3A6IDAsXG4gIHRpcFNpemU6IDEwLFxuICBhbmNob3I6ICdib3R0b20nLFxuICBkeW5hbWljUG9zaXRpb246IHRydWUsXG4gIHNvcnRCeURlcHRoOiBmYWxzZSxcbiAgY2xvc2VCdXR0b246IHRydWUsXG4gIGNsb3NlT25DbGljazogdHJ1ZSxcbiAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHt9XG59KTtcblxuZnVuY3Rpb24gZ2V0UG9zaXRpb24ocHJvcHMsIHZpZXdwb3J0LCBlbCwgX3JlZikge1xuICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgIHggPSBfcmVmMlswXSxcbiAgICAgIHkgPSBfcmVmMlsxXTtcblxuICB2YXIgYW5jaG9yID0gcHJvcHMuYW5jaG9yLFxuICAgICAgZHluYW1pY1Bvc2l0aW9uID0gcHJvcHMuZHluYW1pY1Bvc2l0aW9uLFxuICAgICAgdGlwU2l6ZSA9IHByb3BzLnRpcFNpemU7XG5cbiAgaWYgKGVsKSB7XG4gICAgcmV0dXJuIGR5bmFtaWNQb3NpdGlvbiA/IGdldER5bmFtaWNQb3NpdGlvbih7XG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIGFuY2hvcjogYW5jaG9yLFxuICAgICAgcGFkZGluZzogdGlwU2l6ZSxcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgICAgc2VsZldpZHRoOiBlbC5jbGllbnRXaWR0aCxcbiAgICAgIHNlbGZIZWlnaHQ6IGVsLmNsaWVudEhlaWdodFxuICAgIH0pIDogYW5jaG9yO1xuICB9XG5cbiAgcmV0dXJuIGFuY2hvcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyU3R5bGUocHJvcHMsIHZpZXdwb3J0LCBlbCwgX3JlZjMsIHBvc2l0aW9uVHlwZSkge1xuICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMyksXG4gICAgICB4ID0gX3JlZjRbMF0sXG4gICAgICB5ID0gX3JlZjRbMV0sXG4gICAgICB6ID0gX3JlZjRbMl07XG5cbiAgdmFyIG9mZnNldExlZnQgPSBwcm9wcy5vZmZzZXRMZWZ0LFxuICAgICAgb2Zmc2V0VG9wID0gcHJvcHMub2Zmc2V0VG9wLFxuICAgICAgc29ydEJ5RGVwdGggPSBwcm9wcy5zb3J0QnlEZXB0aDtcbiAgdmFyIGFuY2hvclBvc2l0aW9uID0gQU5DSE9SX1BPU0lUSU9OW3Bvc2l0aW9uVHlwZV07XG4gIHZhciBsZWZ0ID0geCArIG9mZnNldExlZnQ7XG4gIHZhciB0b3AgPSB5ICsgb2Zmc2V0VG9wO1xuICB2YXIgeFBlcmNlbnRhZ2UgPSBjcmlzcFBlcmNlbnRhZ2UoZWwsIC1hbmNob3JQb3NpdGlvbi54ICogMTAwKTtcbiAgdmFyIHlQZXJjZW50YWdlID0gY3Jpc3BQZXJjZW50YWdlKGVsLCAtYW5jaG9yUG9zaXRpb24ueSAqIDEwMCwgJ3knKTtcbiAgdmFyIHN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRyYW5zZm9ybTogXCJcXG4gICAgICB0cmFuc2xhdGUoXCIuY29uY2F0KHhQZXJjZW50YWdlLCBcIiUsIFwiKS5jb25jYXQoeVBlcmNlbnRhZ2UsIFwiJSlcXG4gICAgICB0cmFuc2xhdGUoXCIpLmNvbmNhdChjcmlzcFBpeGVsKGxlZnQpLCBcInB4LCBcIikuY29uY2F0KGNyaXNwUGl4ZWwodG9wKSwgXCJweClcXG4gICAgXCIpLFxuICAgIGRpc3BsYXk6IHVuZGVmaW5lZCxcbiAgICB6SW5kZXg6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGlmICghc29ydEJ5RGVwdGgpIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBpZiAoeiA+IDEgfHwgeiA8IC0xIHx8IHggPCAwIHx8IHggPiB2aWV3cG9ydC53aWR0aCB8fCB5IDwgMCB8fCB5ID4gdmlld3BvcnQuaGVpZ2h0KSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS56SW5kZXggPSBNYXRoLmZsb29yKCgxIC0geikgLyAyICogMTAwMDAwKTtcbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gb25DbGljayhldnQsIF9yZWY1KSB7XG4gIHZhciBwcm9wcyA9IF9yZWY1LnByb3BzLFxuICAgICAgY29udGV4dCA9IF9yZWY1LmNvbnRleHQ7XG5cbiAgaWYgKHByb3BzLmNsb3NlT25DbGljayB8fCBldnQudGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ21hcGJveGdsLXBvcHVwLWNsb3NlLWJ1dHRvbicpIHtcbiAgICBwcm9wcy5vbkNsb3NlKCk7XG5cbiAgICBpZiAoY29udGV4dC5ldmVudE1hbmFnZXIpIHtcbiAgICAgIGNvbnRleHQuZXZlbnRNYW5hZ2VyLm9uY2UoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LCBldnQudGFyZ2V0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gUG9wdXAocHJvcHMpIHtcbiAgdmFyIGNvbnRlbnRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB0aGlzUmVmID0gdXNlTWFwQ29udHJvbChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICBvbkNsaWNrOiBvbkNsaWNrXG4gIH0pKTtcbiAgdmFyIGNvbnRleHQgPSB0aGlzUmVmLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSB0aGlzUmVmLmNvbnRhaW5lclJlZjtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzZXRMb2FkZWQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0TG9hZGVkKHRydWUpO1xuICB9LCBbY29udGVudFJlZi5jdXJyZW50XSk7XG4gIHZhciB2aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQsXG4gICAgICBtYXAgPSBjb250ZXh0Lm1hcDtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxvbmdpdHVkZSA9IHByb3BzLmxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlID0gcHJvcHMubGF0aXR1ZGUsXG4gICAgICB0aXBTaXplID0gcHJvcHMudGlwU2l6ZSxcbiAgICAgIGNsb3NlQnV0dG9uID0gcHJvcHMuY2xvc2VCdXR0b24sXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgYWx0aXR1ZGUgPSBwcm9wcy5hbHRpdHVkZTtcblxuICBpZiAoYWx0aXR1ZGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGFsdGl0dWRlID0gZ2V0VGVycmFpbkVsZXZhdGlvbihtYXAsIHtcbiAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgcG9zaXRpb24gPSB2aWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIGxhdGl0dWRlLCBhbHRpdHVkZV0pO1xuICB2YXIgcG9zaXRpb25UeXBlID0gZ2V0UG9zaXRpb24ocHJvcHMsIHZpZXdwb3J0LCBjb250ZW50UmVmLmN1cnJlbnQsIHBvc2l0aW9uKTtcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gZ2V0Q29udGFpbmVyU3R5bGUocHJvcHMsIHZpZXdwb3J0LCBjb250YWluZXJSZWYuY3VycmVudCwgcG9zaXRpb24sIHBvc2l0aW9uVHlwZSk7XG4gIHZhciBvblJlYWN0Q2xpY2sgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhY29udGV4dC5ldmVudE1hbmFnZXIgJiYgb25DbGljayhlLCB0aGlzUmVmKTtcbiAgfSwgW2NvbnRleHQuZXZlbnRNYW5hZ2VyXSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtcG9wdXAgbWFwYm94Z2wtcG9wdXAtYW5jaG9yLVwiLmNvbmNhdChwb3NpdGlvblR5cGUsIFwiIFwiKS5jb25jYXQoY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogY29udGFpbmVyU3R5bGUsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcInRpcFwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1wb3B1cC10aXBcIixcbiAgICBzdHlsZToge1xuICAgICAgYm9yZGVyV2lkdGg6IHRpcFNpemVcbiAgICB9XG4gIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiY29udGVudFwiLFxuICAgIHJlZjogY29udGVudFJlZixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtcG9wdXAtY29udGVudFwiLFxuICAgIG9uQ2xpY2s6IG9uUmVhY3RDbGlja1xuICB9LCBjbG9zZUJ1dHRvbiAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBrZXk6IFwiY2xvc2UtYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLXBvcHVwLWNsb3NlLWJ1dHRvblwiLFxuICAgIHR5cGU6IFwiYnV0dG9uXCJcbiAgfSwgXCJcXHhEN1wiKSwgY2hpbGRyZW4pKTtcbn1cblxuUG9wdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhQb3B1cCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIHRvZ2dsZUxhYmVsOiAnVG9nZ2xlIEF0dHJpYnV0aW9uJ1xufSk7XG5cbmZ1bmN0aW9uIHNldHVwQXR0cmlidXRpb25jb250cm9sKG9wdHMsIG1hcCwgY29udGFpbmVyLCBhdHRyaWJ1dGlvbkNvbnRhaW5lcikge1xuICB2YXIgY29udHJvbCA9IG5ldyBtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2wob3B0cyk7XG4gIGNvbnRyb2wuX21hcCA9IG1hcDtcbiAgY29udHJvbC5fY29udGFpbmVyID0gY29udGFpbmVyO1xuICBjb250cm9sLl9pbm5lckNvbnRhaW5lciA9IGF0dHJpYnV0aW9uQ29udGFpbmVyO1xuXG4gIGNvbnRyb2wuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuXG4gIGNvbnRyb2wuX3VwZGF0ZUVkaXRMaW5rKCk7XG5cbiAgbWFwLm9uKCdzdHlsZWRhdGEnLCBjb250cm9sLl91cGRhdGVEYXRhKTtcbiAgbWFwLm9uKCdzb3VyY2VkYXRhJywgY29udHJvbC5fdXBkYXRlRGF0YSk7XG4gIHJldHVybiBjb250cm9sO1xufVxuXG5mdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGlvbkNvbnRyb2woY29udHJvbCkge1xuICBjb250cm9sLl9tYXAub2ZmKCdzdHlsZWRhdGEnLCBjb250cm9sLl91cGRhdGVEYXRhKTtcblxuICBjb250cm9sLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgY29udHJvbC5fdXBkYXRlRGF0YSk7XG59XG5cbmZ1bmN0aW9uIEF0dHJpYnV0aW9uQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBpbm5lckNvbnRhaW5lclJlZiA9IHVzZVJlZihudWxsKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzaG93Q29tcGFjdCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRTaG93Q29tcGFjdCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udHJvbDtcblxuICAgIGlmIChjb250ZXh0Lm1hcCkge1xuICAgICAgY29udHJvbCA9IHNldHVwQXR0cmlidXRpb25jb250cm9sKHtcbiAgICAgICAgY3VzdG9tQXR0cmlidXRpb246IHByb3BzLmN1c3RvbUF0dHJpYnV0aW9uXG4gICAgICB9LCBjb250ZXh0Lm1hcCwgY29udGFpbmVyUmVmLmN1cnJlbnQsIGlubmVyQ29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29udHJvbCAmJiByZW1vdmVBdHRyaWJ1dGlvbkNvbnRyb2woY29udHJvbCk7XG4gICAgfTtcbiAgfSwgW2NvbnRleHQubWFwXSk7XG4gIHZhciBjb21wYWN0ID0gcHJvcHMuY29tcGFjdCA9PT0gdW5kZWZpbmVkID8gY29udGV4dC52aWV3cG9ydC53aWR0aCA8PSA2NDAgOiBwcm9wcy5jb21wYWN0O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghY29tcGFjdCAmJiBzaG93Q29tcGFjdCkge1xuICAgICAgc2V0U2hvd0NvbXBhY3QoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2NvbXBhY3RdKTtcbiAgdmFyIHRvZ2dsZUF0dHJpYnV0aW9uID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZXRTaG93Q29tcGFjdChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIFwiYXJpYS1wcmVzc2VkXCI6IHNob3dDb21wYWN0LFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtYXR0cmliIFwiLmNvbmNhdChjb21wYWN0ID8gJ21hcGJveGdsLWNvbXBhY3QnIDogJycsIFwiIFwiKS5jb25jYXQoc2hvd0NvbXBhY3QgPyAnbWFwYm94Z2wtY29tcGFjdC1zaG93JyA6ICcnKVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWF0dHJpYi1idXR0b25cIixcbiAgICB0aXRsZTogcHJvcHMudG9nZ2xlTGFiZWwsXG4gICAgb25DbGljazogdG9nZ2xlQXR0cmlidXRpb25cbiAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogaW5uZXJDb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtYXR0cmliLWlubmVyXCIsXG4gICAgcm9sZTogXCJsaXN0XCJcbiAgfSkpKTtcbn1cblxuQXR0cmlidXRpb25Db250cm9sLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oQXR0cmlidXRpb25Db250cm9sKTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgbGFiZWw6ICdUb2dnbGUgZnVsbHNjcmVlbidcbn0pO1xuXG5mdW5jdGlvbiBGdWxsc2NyZWVuQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGlzRnVsbHNjcmVlbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRJc0Z1bGxzY3JlZW4gPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgc2hvd0J1dHRvbiA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRTaG93QnV0dG9uID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgX3VzZVN0YXRlNSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgICAgbWFwYm94RnVsbHNjcmVlbkNvbnRyb2wgPSBfdXNlU3RhdGU2WzBdLFxuICAgICAgY3JlYXRlTWFwYm94RnVsbHNjcmVlbkNvbnRyb2wgPSBfdXNlU3RhdGU2WzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRyb2wgPSBuZXcgbWFwYm94Z2wuRnVsbHNjcmVlbkNvbnRyb2woKTtcbiAgICBjcmVhdGVNYXBib3hGdWxsc2NyZWVuQ29udHJvbChjb250cm9sKTtcbiAgICBzZXRTaG93QnV0dG9uKGNvbnRyb2wuX2NoZWNrRnVsbHNjcmVlblN1cHBvcnQoKSk7XG5cbiAgICB2YXIgb25GdWxsc2NyZWVuQ2hhbmdlID0gZnVuY3Rpb24gb25GdWxsc2NyZWVuQ2hhbmdlKCkge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9ICFjb250cm9sLl9mdWxsc2NyZWVuO1xuICAgICAgY29udHJvbC5fZnVsbHNjcmVlbiA9IG5leHRTdGF0ZTtcbiAgICAgIHNldElzRnVsbHNjcmVlbihuZXh0U3RhdGUpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGNvbnRyb2wuX2Z1bGxzY3JlZW5jaGFuZ2UsIG9uRnVsbHNjcmVlbkNoYW5nZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoY29udHJvbC5fZnVsbHNjcmVlbmNoYW5nZSwgb25GdWxsc2NyZWVuQ2hhbmdlKTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdmFyIG9uQ2xpY2tGdWxsc2NyZWVuID0gZnVuY3Rpb24gb25DbGlja0Z1bGxzY3JlZW4oKSB7XG4gICAgaWYgKG1hcGJveEZ1bGxzY3JlZW5Db250cm9sKSB7XG4gICAgICBtYXBib3hGdWxsc2NyZWVuQ29udHJvbC5fY29udGFpbmVyID0gcHJvcHMuY29udGFpbmVyIHx8IGNvbnRleHQuY29udGFpbmVyO1xuXG4gICAgICBtYXBib3hGdWxsc2NyZWVuQ29udHJvbC5fb25DbGlja0Z1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuXG4gIGlmICghc2hvd0J1dHRvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWw7XG4gIHZhciB0eXBlID0gaXNGdWxsc2NyZWVuID8gJ3NocmluaycgOiAnZnVsbHNjcmVlbic7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1ncm91cFwiLFxuICAgIHJlZjogY29udGFpbmVyUmVmXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIGtleTogdHlwZSxcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uIG1hcGJveGdsLWN0cmwtXCIuY29uY2F0KHR5cGUpLFxuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgdGl0bGU6IGxhYmVsLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tGdWxsc2NyZWVuXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uXCIsXG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICB9KSkpKTtcbn1cblxuRnVsbHNjcmVlbkNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhGdWxsc2NyZWVuQ29udHJvbCk7IiwidmFyIHN1cHBvcnRlZDtcbmV4cG9ydCBmdW5jdGlvbiBpc0dlb2xvY2F0aW9uU3VwcG9ydGVkKCkge1xuICBpZiAoc3VwcG9ydGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN1cHBvcnRlZCk7XG4gIH1cblxuICBpZiAod2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe1xuICAgICAgbmFtZTogJ2dlb2xvY2F0aW9uJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHApIHtcbiAgICAgIHN1cHBvcnRlZCA9IHAuc3RhdGUgIT09ICdkZW5pZWQnO1xuICAgICAgcmV0dXJuIHN1cHBvcnRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIHN1cHBvcnRlZCA9IEJvb2xlYW4od2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbik7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydGVkKTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvZ2xvYmFscyc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IE1hcFN0YXRlIGZyb20gJy4uL3V0aWxzL21hcC1zdGF0ZSc7XG5pbXBvcnQgeyBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyB9IGZyb20gJy4uL3V0aWxzL21hcC1jb250cm9sbGVyJztcbmltcG9ydCB7IGlzR2VvbG9jYXRpb25TdXBwb3J0ZWQgfSBmcm9tICcuLi91dGlscy9nZW9sb2NhdGUtdXRpbHMnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIGxhYmVsOiAnRmluZCBNeSBMb2NhdGlvbicsXG4gIGRpc2FibGVkTGFiZWw6ICdMb2NhdGlvbiBOb3QgQXZhaWxhYmxlJyxcbiAgYXV0bzogZmFsc2UsXG4gIHBvc2l0aW9uT3B0aW9uczoge1xuICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogZmFsc2UsXG4gICAgdGltZW91dDogNjAwMFxuICB9LFxuICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgbWF4Wm9vbTogMTVcbiAgfSxcbiAgdHJhY2tVc2VyTG9jYXRpb246IGZhbHNlLFxuICBzaG93VXNlckxvY2F0aW9uOiB0cnVlLFxuICBzaG93QWNjdXJhY3lDaXJjbGU6IHRydWUsXG4gIG9uR2VvbG9jYXRlOiBmdW5jdGlvbiBvbkdlb2xvY2F0ZSgpIHt9XG59KTtcblxuZnVuY3Rpb24gZ2V0Qm91bmRzKHBvc2l0aW9uKSB7XG4gIHZhciBjZW50ZXIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7XG4gIHZhciByYWRpdXMgPSBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3k7XG4gIHZhciBib3VuZHMgPSBjZW50ZXIudG9Cb3VuZHMocmFkaXVzKTtcbiAgcmV0dXJuIFtbYm91bmRzLl9uZS5sbmcsIGJvdW5kcy5fbmUubGF0XSwgW2JvdW5kcy5fc3cubG5nLCBib3VuZHMuX3N3LmxhdF1dO1xufVxuXG5mdW5jdGlvbiBzZXR1cE1hcGJveEdlb2xvY2F0ZUNvbnRyb2woY29udGV4dCwgcHJvcHMsIGdlb2xvY2F0ZUJ1dHRvbikge1xuICB2YXIgY29udHJvbCA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHByb3BzKTtcbiAgY29udHJvbC5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRyb2wuX21hcCA9IHtcbiAgICBvbjogZnVuY3Rpb24gb24oKSB7fSxcbiAgICBfZ2V0VUlTdHJpbmc6IGZ1bmN0aW9uIF9nZXRVSVN0cmluZygpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH07XG5cbiAgY29udHJvbC5fc2V0dXBVSSh0cnVlKTtcblxuICBjb250cm9sLl9tYXAgPSBjb250ZXh0Lm1hcDtcbiAgY29udHJvbC5fZ2VvbG9jYXRlQnV0dG9uID0gZ2VvbG9jYXRlQnV0dG9uO1xuICB2YXIgZXZlbnRNYW5hZ2VyID0gY29udGV4dC5ldmVudE1hbmFnZXI7XG5cbiAgaWYgKGNvbnRyb2wub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiAmJiBldmVudE1hbmFnZXIpIHtcbiAgICBldmVudE1hbmFnZXIub24oJ3BhbnN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGNvbnRyb2wuX3dhdGNoU3RhdGUgPT09ICdBQ1RJVkVfTE9DSycpIHtcbiAgICAgICAgY29udHJvbC5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EJztcbiAgICAgICAgZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29udHJvbC5vbignZ2VvbG9jYXRlJywgcHJvcHMub25HZW9sb2NhdGUpO1xuICByZXR1cm4gY29udHJvbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FtZXJhKHBvc2l0aW9uLCBfcmVmKSB7XG4gIHZhciBjb250ZXh0ID0gX3JlZi5jb250ZXh0LFxuICAgICAgcHJvcHMgPSBfcmVmLnByb3BzO1xuICB2YXIgYm91bmRzID0gZ2V0Qm91bmRzKHBvc2l0aW9uKTtcblxuICB2YXIgX2NvbnRleHQkdmlld3BvcnQkZml0ID0gY29udGV4dC52aWV3cG9ydC5maXRCb3VuZHMoYm91bmRzLCBwcm9wcy5maXRCb3VuZHNPcHRpb25zKSxcbiAgICAgIGxvbmdpdHVkZSA9IF9jb250ZXh0JHZpZXdwb3J0JGZpdC5sb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSA9IF9jb250ZXh0JHZpZXdwb3J0JGZpdC5sYXRpdHVkZSxcbiAgICAgIHpvb20gPSBfY29udGV4dCR2aWV3cG9ydCRmaXQuem9vbTtcblxuICB2YXIgbmV3Vmlld1N0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dC52aWV3cG9ydCwge1xuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICB6b29tOiB6b29tXG4gIH0pO1xuICB2YXIgbWFwU3RhdGUgPSBuZXcgTWFwU3RhdGUobmV3Vmlld1N0YXRlKTtcbiAgdmFyIHZpZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIG1hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpO1xuICB2YXIgb25WaWV3cG9ydENoYW5nZSA9IHByb3BzLm9uVmlld3BvcnRDaGFuZ2UgfHwgY29udGV4dC5vblZpZXdwb3J0Q2hhbmdlIHx8IG5vb3A7XG4gIHZhciBvblZpZXdTdGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld1N0YXRlQ2hhbmdlIHx8IGNvbnRleHQub25WaWV3U3RhdGVDaGFuZ2UgfHwgbm9vcDtcbiAgb25WaWV3U3RhdGVDaGFuZ2Uoe1xuICAgIHZpZXdTdGF0ZTogdmlld1N0YXRlXG4gIH0pO1xuICBvblZpZXdwb3J0Q2hhbmdlKHZpZXdTdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIEdlb2xvY2F0ZUNvbnRyb2wocHJvcHMpIHtcbiAgdmFyIHRoaXNSZWYgPSB1c2VNYXBDb250cm9sKHByb3BzKTtcbiAgdmFyIGNvbnRleHQgPSB0aGlzUmVmLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSB0aGlzUmVmLmNvbnRhaW5lclJlZjtcbiAgdmFyIGdlb2xvY2F0ZUJ1dHRvblJlZiA9IHVzZVJlZihudWxsKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIG1hcGJveEdlb2xvY2F0ZUNvbnRyb2wgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgY3JlYXRlTWFwYm94R2VvbG9jYXRlQ29udHJvbCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBzdXBwb3J0c0dlb2xvY2F0aW9uID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldFN1cHBvcnRzR2VvbG9jYXRpb24gPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRyb2w7XG5cbiAgICBpZiAoY29udGV4dC5tYXApIHtcbiAgICAgIGlzR2VvbG9jYXRpb25TdXBwb3J0ZWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgc2V0U3VwcG9ydHNHZW9sb2NhdGlvbihyZXN1bHQpO1xuXG4gICAgICAgIGlmIChnZW9sb2NhdGVCdXR0b25SZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnRyb2wgPSBzZXR1cE1hcGJveEdlb2xvY2F0ZUNvbnRyb2woY29udGV4dCwgcHJvcHMsIGdlb2xvY2F0ZUJ1dHRvblJlZi5jdXJyZW50KTtcblxuICAgICAgICAgIGNvbnRyb2wuX3VwZGF0ZUNhbWVyYSA9IGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNhbWVyYShwb3NpdGlvbiwgdGhpc1JlZik7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNyZWF0ZU1hcGJveEdlb2xvY2F0ZUNvbnRyb2woY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICBjb250cm9sLl9jbGVhcldhdGNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2NvbnRleHQubWFwXSk7XG4gIHZhciB0cmlnZ2VyR2VvbG9jYXRlID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGlmIChtYXBib3hHZW9sb2NhdGVDb250cm9sKSB7XG4gICAgICBtYXBib3hHZW9sb2NhdGVDb250cm9sLm9wdGlvbnMgPSB0aGlzUmVmLnByb3BzO1xuICAgICAgbWFwYm94R2VvbG9jYXRlQ29udHJvbC50cmlnZ2VyKCk7XG4gICAgfVxuICB9LCBbbWFwYm94R2VvbG9jYXRlQ29udHJvbF0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChwcm9wcy5hdXRvKSB7XG4gICAgICB0cmlnZ2VyR2VvbG9jYXRlKCk7XG4gICAgfVxuICB9LCBbbWFwYm94R2VvbG9jYXRlQ29udHJvbCwgcHJvcHMuYXV0b10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtYXBib3hHZW9sb2NhdGVDb250cm9sKSB7XG4gICAgICBtYXBib3hHZW9sb2NhdGVDb250cm9sLl9vblpvb20oKTtcbiAgICB9XG4gIH0sIFtjb250ZXh0LnZpZXdwb3J0Lnpvb21dKTtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICBkaXNhYmxlZExhYmVsID0gcHJvcHMuZGlzYWJsZWRMYWJlbCxcbiAgICAgIHRyYWNrVXNlckxvY2F0aW9uID0gcHJvcHMudHJhY2tVc2VyTG9jYXRpb247XG4gIHZhciBzdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSwgcHJvcHMuc3R5bGUpO1xuICB9LCBbcHJvcHMuc3R5bGVdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ2VvbG9jYXRlLWNvbnRyb2xcIixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAga2V5OiBcImdlb2xvY2F0ZVwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWljb24gbWFwYm94Z2wtY3RybC1nZW9sb2NhdGVcIixcbiAgICByZWY6IGdlb2xvY2F0ZUJ1dHRvblJlZixcbiAgICBkaXNhYmxlZDogIXN1cHBvcnRzR2VvbG9jYXRpb24sXG4gICAgXCJhcmlhLXByZXNzZWRcIjogIXRyYWNrVXNlckxvY2F0aW9uLFxuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgdGl0bGU6IHN1cHBvcnRzR2VvbG9jYXRpb24gPyBsYWJlbCA6IGRpc2FibGVkTGFiZWwsXG4gICAgXCJhcmlhLWxhYmVsXCI6IHN1cHBvcnRzR2VvbG9jYXRpb24gPyBsYWJlbCA6IGRpc2FibGVkTGFiZWwsXG4gICAgb25DbGljazogdHJpZ2dlckdlb2xvY2F0ZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvblwiLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgfSkpKSk7XG59XG5cbkdlb2xvY2F0ZUNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhHZW9sb2NhdGVDb250cm9sKTsiLCJleHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKHZlcnNpb24xLCB2ZXJzaW9uMikge1xuICB2YXIgdjEgPSAodmVyc2lvbjEgfHwgJycpLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gIHZhciB2MiA9ICh2ZXJzaW9uMiB8fCAnJykuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIHZhciBwYXJ0MSA9IHYxW2ldIHx8IDA7XG4gICAgdmFyIHBhcnQyID0gdjJbaV0gfHwgMDtcblxuICAgIGlmIChwYXJ0MSA8IHBhcnQyKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnQxID4gcGFydDIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNYXBTdGF0ZSBmcm9tICcuLi91dGlscy9tYXAtc3RhdGUnO1xuaW1wb3J0IHsgTElORUFSX1RSQU5TSVRJT05fUFJPUFMgfSBmcm9tICcuLi91dGlscy9tYXAtY29udHJvbGxlcic7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uJztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL3VzZS1tYXAtY29udHJvbCc7XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnLFxuICBzaG93Q29tcGFzczogdHJ1ZSxcbiAgc2hvd1pvb206IHRydWUsXG4gIHpvb21JbkxhYmVsOiAnWm9vbSBJbicsXG4gIHpvb21PdXRMYWJlbDogJ1pvb20gT3V0JyxcbiAgY29tcGFzc0xhYmVsOiAnUmVzZXQgTm9ydGgnXG59KTtcbnZhciBWRVJTSU9OX0xFR0FDWSA9IDE7XG52YXIgVkVSU0lPTl8xXzYgPSAyO1xuXG5mdW5jdGlvbiBnZXRVSVZlcnNpb24obWFwYm94VmVyc2lvbikge1xuICByZXR1cm4gY29tcGFyZVZlcnNpb25zKG1hcGJveFZlcnNpb24sICcxLjYuMCcpID49IDAgPyBWRVJTSU9OXzFfNiA6IFZFUlNJT05fTEVHQUNZO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWaWV3cG9ydChjb250ZXh0LCBwcm9wcywgb3B0cykge1xuICB2YXIgdmlld3BvcnQgPSBjb250ZXh0LnZpZXdwb3J0O1xuICB2YXIgbWFwU3RhdGUgPSBuZXcgTWFwU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgdmlld3BvcnQsIG9wdHMpKTtcbiAgdmFyIHZpZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIG1hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpO1xuICB2YXIgb25WaWV3cG9ydENoYW5nZSA9IHByb3BzLm9uVmlld3BvcnRDaGFuZ2UgfHwgY29udGV4dC5vblZpZXdwb3J0Q2hhbmdlIHx8IG5vb3A7XG4gIHZhciBvblZpZXdTdGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld1N0YXRlQ2hhbmdlIHx8IGNvbnRleHQub25WaWV3U3RhdGVDaGFuZ2UgfHwgbm9vcDtcbiAgb25WaWV3U3RhdGVDaGFuZ2Uoe1xuICAgIHZpZXdTdGF0ZTogdmlld1N0YXRlXG4gIH0pO1xuICBvblZpZXdwb3J0Q2hhbmdlKHZpZXdTdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckJ1dHRvbih0eXBlLCBsYWJlbCwgY2FsbGJhY2ssIGNoaWxkcmVuKSB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBrZXk6IHR5cGUsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLVwiLmNvbmNhdCh0eXBlKSxcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIHRpdGxlOiBsYWJlbCxcbiAgICBvbkNsaWNrOiBjYWxsYmFja1xuICB9LCBjaGlsZHJlbiB8fCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvblwiLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb21wYXNzKGNvbnRleHQpIHtcbiAgdmFyIHVpVmVyc2lvbiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb250ZXh0Lm1hcCA/IGdldFVJVmVyc2lvbihjb250ZXh0Lm1hcC52ZXJzaW9uKSA6IFZFUlNJT05fMV82O1xuICB9LCBbY29udGV4dC5tYXBdKTtcbiAgdmFyIGJlYXJpbmcgPSBjb250ZXh0LnZpZXdwb3J0LmJlYXJpbmc7XG4gIHZhciBzdHlsZSA9IHtcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdCgtYmVhcmluZywgXCJkZWcpXCIpXG4gIH07XG4gIHJldHVybiB1aVZlcnNpb24gPT09IFZFUlNJT05fMV82ID8gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWljb25cIixcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9KSA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1jb21wYXNzLWFycm93XCIsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBOYXZpZ2F0aW9uQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBvblpvb21JbiA9IGZ1bmN0aW9uIG9uWm9vbUluKCkge1xuICAgIHVwZGF0ZVZpZXdwb3J0KGNvbnRleHQsIHByb3BzLCB7XG4gICAgICB6b29tOiBjb250ZXh0LnZpZXdwb3J0Lnpvb20gKyAxXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9uWm9vbU91dCA9IGZ1bmN0aW9uIG9uWm9vbU91dCgpIHtcbiAgICB1cGRhdGVWaWV3cG9ydChjb250ZXh0LCBwcm9wcywge1xuICAgICAgem9vbTogY29udGV4dC52aWV3cG9ydC56b29tIC0gMVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBvblJlc2V0Tm9ydGggPSBmdW5jdGlvbiBvblJlc2V0Tm9ydGgoKSB7XG4gICAgdXBkYXRlVmlld3BvcnQoY29udGV4dCwgcHJvcHMsIHtcbiAgICAgIGJlYXJpbmc6IDAsXG4gICAgICBwaXRjaDogMFxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzaG93Q29tcGFzcyA9IHByb3BzLnNob3dDb21wYXNzLFxuICAgICAgc2hvd1pvb20gPSBwcm9wcy5zaG93Wm9vbSxcbiAgICAgIHpvb21JbkxhYmVsID0gcHJvcHMuem9vbUluTGFiZWwsXG4gICAgICB6b29tT3V0TGFiZWwgPSBwcm9wcy56b29tT3V0TGFiZWwsXG4gICAgICBjb21wYXNzTGFiZWwgPSBwcm9wcy5jb21wYXNzTGFiZWw7XG4gIHZhciBzdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSwgcHJvcHMuc3R5bGUpO1xuICB9LCBbcHJvcHMuc3R5bGVdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgc2hvd1pvb20gJiYgcmVuZGVyQnV0dG9uKCd6b29tLWluJywgem9vbUluTGFiZWwsIG9uWm9vbUluKSwgc2hvd1pvb20gJiYgcmVuZGVyQnV0dG9uKCd6b29tLW91dCcsIHpvb21PdXRMYWJlbCwgb25ab29tT3V0KSwgc2hvd0NvbXBhc3MgJiYgcmVuZGVyQnV0dG9uKCdjb21wYXNzJywgY29tcGFzc0xhYmVsLCBvblJlc2V0Tm9ydGgsIHJlbmRlckNvbXBhc3MoY29udGV4dCkpKSk7XG59XG5cbk5hdmlnYXRpb25Db250cm9sLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oTmF2aWdhdGlvbkNvbnRyb2wpOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1hcGJveGdsIGZyb20gJy4uL3V0aWxzL21hcGJveGdsJztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuL3VzZS1tYXAtY29udHJvbCc7XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBjbGFzc05hbWU6ICcnLFxuICBtYXhXaWR0aDogMTAwLFxuICB1bml0OiAnbWV0cmljJ1xufSk7XG5cbmZ1bmN0aW9uIFNjYWxlQ29udHJvbChwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgbWFwYm94U2NhbGVDb250cm9sID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIGNyZWF0ZU1hcGJveFNjYWxlQ29udHJvbCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29udGV4dC5tYXApIHtcbiAgICAgIHZhciBjb250cm9sID0gbmV3IG1hcGJveGdsLlNjYWxlQ29udHJvbCgpO1xuICAgICAgY29udHJvbC5fbWFwID0gY29udGV4dC5tYXA7XG4gICAgICBjb250cm9sLl9jb250YWluZXIgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNyZWF0ZU1hcGJveFNjYWxlQ29udHJvbChjb250cm9sKTtcbiAgICB9XG4gIH0sIFtjb250ZXh0Lm1hcF0pO1xuXG4gIGlmIChtYXBib3hTY2FsZUNvbnRyb2wpIHtcbiAgICBtYXBib3hTY2FsZUNvbnRyb2wub3B0aW9ucyA9IHByb3BzO1xuXG4gICAgbWFwYm94U2NhbGVDb250cm9sLl9vbk1vdmUoKTtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSwgcHJvcHMuc3R5bGUpO1xuICB9LCBbcHJvcHMuc3R5bGVdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlXCJcbiAgfSkpO1xufVxuXG5TY2FsZUNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhTY2FsZUNvbnRyb2wpOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNYXBDb250cm9sLCB7IG1hcENvbnRyb2xQcm9wVHlwZXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3VzZS1tYXAtY29udHJvbCc7XG52YXIgcGl4ZWxSYXRpbyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjYXB0dXJlU2Nyb2xsOiBmYWxzZSxcbiAgY2FwdHVyZURyYWc6IGZhbHNlLFxuICBjYXB0dXJlQ2xpY2s6IGZhbHNlLFxuICBjYXB0dXJlRG91YmxlQ2xpY2s6IGZhbHNlLFxuICBjYXB0dXJlUG9pbnRlck1vdmU6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBDYW52YXNPdmVybGF5KHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBjdHggPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RHJhd2luZ0NvbnRleHQgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0RHJhd2luZ0NvbnRleHQoY29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Q29udGV4dCgnMmQnKSk7XG4gIH0sIFtdKTtcbiAgdmFyIHZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydCxcbiAgICAgIGlzRHJhZ2dpbmcgPSBjb250ZXh0LmlzRHJhZ2dpbmc7XG5cbiAgaWYgKGN0eCkge1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnNjYWxlKHBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuICAgIHByb3BzLnJlZHJhdyh7XG4gICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICAgIGN0eDogY3R4LFxuICAgICAgaXNEcmFnZ2luZzogaXNEcmFnZ2luZyxcbiAgICAgIHByb2plY3Q6IHZpZXdwb3J0LnByb2plY3QsXG4gICAgICB1bnByb2plY3Q6IHZpZXdwb3J0LnVucHJvamVjdFxuICAgIH0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoICogcGl4ZWxSYXRpbyxcbiAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCAqIHBpeGVsUmF0aW8sXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdCh2aWV3cG9ydC53aWR0aCwgXCJweFwiKSxcbiAgICAgIGhlaWdodDogXCJcIi5jb25jYXQodmlld3BvcnQuaGVpZ2h0LCBcInB4XCIpLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfVxuICB9KTtcbn1cblxuQ2FudmFzT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBDYW52YXNPdmVybGF5OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IGZhbHNlLFxuICBjYXB0dXJlRHJhZzogZmFsc2UsXG4gIGNhcHR1cmVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVEb3VibGVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIEhUTUxPdmVybGF5KHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIHZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydCxcbiAgICAgIGlzRHJhZ2dpbmcgPSBjb250ZXh0LmlzRHJhZ2dpbmc7XG5cbiAgdmFyIHN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0XG4gIH0sIHByb3BzLnN0eWxlKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzLnJlZHJhdyh7XG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmcsXG4gICAgcHJvamVjdDogdmlld3BvcnQucHJvamVjdCxcbiAgICB1bnByb2plY3Q6IHZpZXdwb3J0LnVucHJvamVjdFxuICB9KSk7XG59XG5cbkhUTUxPdmVybGF5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEhUTUxPdmVybGF5OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IGZhbHNlLFxuICBjYXB0dXJlRHJhZzogZmFsc2UsXG4gIGNhcHR1cmVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVEb3VibGVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIFNWR092ZXJsYXkocHJvcHMpIHtcbiAgdmFyIF91c2VNYXBDb250cm9sID0gdXNlTWFwQ29udHJvbChwcm9wcyksXG4gICAgICBjb250ZXh0ID0gX3VzZU1hcENvbnRyb2wuY29udGV4dCxcbiAgICAgIGNvbnRhaW5lclJlZiA9IF91c2VNYXBDb250cm9sLmNvbnRhaW5lclJlZjtcblxuICB2YXIgdmlld3BvcnQgPSBjb250ZXh0LnZpZXdwb3J0LFxuICAgICAgaXNEcmFnZ2luZyA9IGNvbnRleHQuaXNEcmFnZ2luZztcblxuICB2YXIgc3R5bGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMFxuICB9LCBwcm9wcy5zdHlsZSk7XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMucmVkcmF3KHtcbiAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHQsXG4gICAgaXNEcmFnZ2luZzogaXNEcmFnZ2luZyxcbiAgICBwcm9qZWN0OiB2aWV3cG9ydC5wcm9qZWN0LFxuICAgIHVucHJvamVjdDogdmlld3BvcnQudW5wcm9qZWN0XG4gIH0pKTtcbn1cblxuU1ZHT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBTVkdPdmVybGF5OyIsImltcG9ydCBtYXBib3hnbCBmcm9tICcuL21hcGJveGdsJztcbnZhciBzZXRSVExUZXh0UGx1Z2luID0gbWFwYm94Z2wgPyBtYXBib3hnbC5zZXRSVExUZXh0UGx1Z2luIDogZnVuY3Rpb24gKCkge307XG5leHBvcnQgZGVmYXVsdCBzZXRSVExUZXh0UGx1Z2luOyIsImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbXBvbmVudHMvaW50ZXJhY3RpdmUtbWFwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW50ZXJhY3RpdmVNYXAgfSBmcm9tICcuL2NvbXBvbmVudHMvaW50ZXJhY3RpdmUtbWFwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RhdGljTWFwIH0gZnJvbSAnLi9jb21wb25lbnRzL3N0YXRpYy1tYXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTb3VyY2UgfSBmcm9tICcuL2NvbXBvbmVudHMvc291cmNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGF5ZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvbGF5ZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYXNlQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9iYXNlLWNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXJrZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvbWFya2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9wdXAgfSBmcm9tICcuL2NvbXBvbmVudHMvcG9wdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBdHRyaWJ1dGlvbkNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvYXR0cmlidXRpb24tY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZ1bGxzY3JlZW5Db250cm9sIH0gZnJvbSAnLi9jb21wb25lbnRzL2Z1bGxzY3JlZW4tY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdlb2xvY2F0ZUNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvZ2VvbG9jYXRlLWNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZpZ2F0aW9uQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9uYXZpZ2F0aW9uLWNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTY2FsZUNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvc2NhbGUtY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhbnZhc092ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL2NhbnZhcy1vdmVybGF5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSFRNTE92ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL2h0bWwtb3ZlcmxheSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNWR092ZXJsYXkgfSBmcm9tICcuL292ZXJsYXlzL3N2Zy1vdmVybGF5JztcbmV4cG9ydCB7IFRSQU5TSVRJT05fRVZFTlRTIH0gZnJvbSAnLi91dGlscy90cmFuc2l0aW9uLW1hbmFnZXInO1xuZXhwb3J0IHsgVHJhbnNpdGlvbkludGVycG9sYXRvciwgTGluZWFySW50ZXJwb2xhdG9yLCBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yIGFzIEZseVRvSW50ZXJwb2xhdG9yIH0gZnJvbSAnLi91dGlscy90cmFuc2l0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFwQ29udHJvbGxlciB9IGZyb20gJy4vdXRpbHMvbWFwLWNvbnRyb2xsZXInO1xuZXhwb3J0IHsgV2ViTWVyY2F0b3JWaWV3cG9ydCB9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXRSVExUZXh0UGx1Z2luIH0gZnJvbSAnLi91dGlscy9zZXQtcnRsLXRleHQtcGx1Z2luJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFwQ29udGV4dCB9IGZyb20gJy4vY29tcG9uZW50cy9tYXAtY29udGV4dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIF91c2VNYXBDb250cm9sIH0gZnJvbSAnLi9jb21wb25lbnRzL3VzZS1tYXAtY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIF9NYXBDb250ZXh0IH0gZnJvbSAnLi9jb21wb25lbnRzL21hcC1jb250ZXh0JzsiLCIvKipcbiAqIEBtb2R1bGUgaGVscGVyc1xuICovXG5cbi8qKlxuICogRWFydGggUmFkaXVzIHVzZWQgd2l0aCB0aGUgSGFydmVzaW5lIGZvcm11bGEgYW5kIGFwcHJveGltYXRlcyB1c2luZyBhIHNwaGVyaWNhbCAobm9uLWVsbGlwc29pZCkgRWFydGguXG4gKlxuICogQG1lbWJlcm9mIGhlbHBlcnNcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgZWFydGhSYWRpdXMgPSA2MzcxMDA4Ljg7XG4vKipcbiAqIFVuaXQgb2YgbWVhc3VyZW1lbnQgZmFjdG9ycyB1c2luZyBhIHNwaGVyaWNhbCAobm9uLWVsbGlwc29pZCkgZWFydGggcmFkaXVzLlxuICpcbiAqIEBtZW1iZXJvZiBoZWxwZXJzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCB2YXIgZmFjdG9ycyA9IHtcbiAgY2VudGltZXRlcnM6IGVhcnRoUmFkaXVzICogMTAwLFxuICBjZW50aW1ldHJlczogZWFydGhSYWRpdXMgKiAxMDAsXG4gIGRlZ3JlZXM6IGVhcnRoUmFkaXVzIC8gMTExMzI1LFxuICBmZWV0OiBlYXJ0aFJhZGl1cyAqIDMuMjgwODQsXG4gIGluY2hlczogZWFydGhSYWRpdXMgKiAzOS4zNyxcbiAga2lsb21ldGVyczogZWFydGhSYWRpdXMgLyAxMDAwLFxuICBraWxvbWV0cmVzOiBlYXJ0aFJhZGl1cyAvIDEwMDAsXG4gIG1ldGVyczogZWFydGhSYWRpdXMsXG4gIG1ldHJlczogZWFydGhSYWRpdXMsXG4gIG1pbGVzOiBlYXJ0aFJhZGl1cyAvIDE2MDkuMzQ0LFxuICBtaWxsaW1ldGVyczogZWFydGhSYWRpdXMgKiAxMDAwLFxuICBtaWxsaW1ldHJlczogZWFydGhSYWRpdXMgKiAxMDAwLFxuICBuYXV0aWNhbG1pbGVzOiBlYXJ0aFJhZGl1cyAvIDE4NTIsXG4gIHJhZGlhbnM6IDEsXG4gIHlhcmRzOiBlYXJ0aFJhZGl1cyAqIDEuMDkzNlxufTtcbi8qKlxuICogVW5pdHMgb2YgbWVhc3VyZW1lbnQgZmFjdG9ycyBiYXNlZCBvbiAxIG1ldGVyLlxuICpcbiAqIEBtZW1iZXJvZiBoZWxwZXJzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCB2YXIgdW5pdHNGYWN0b3JzID0ge1xuICBjZW50aW1ldGVyczogMTAwLFxuICBjZW50aW1ldHJlczogMTAwLFxuICBkZWdyZWVzOiAxIC8gMTExMzI1LFxuICBmZWV0OiAzLjI4MDg0LFxuICBpbmNoZXM6IDM5LjM3LFxuICBraWxvbWV0ZXJzOiAxIC8gMTAwMCxcbiAga2lsb21ldHJlczogMSAvIDEwMDAsXG4gIG1ldGVyczogMSxcbiAgbWV0cmVzOiAxLFxuICBtaWxlczogMSAvIDE2MDkuMzQ0LFxuICBtaWxsaW1ldGVyczogMTAwMCxcbiAgbWlsbGltZXRyZXM6IDEwMDAsXG4gIG5hdXRpY2FsbWlsZXM6IDEgLyAxODUyLFxuICByYWRpYW5zOiAxIC8gZWFydGhSYWRpdXMsXG4gIHlhcmRzOiAxLjA5MzYxMzNcbn07XG4vKipcbiAqIEFyZWEgb2YgbWVhc3VyZW1lbnQgZmFjdG9ycyBiYXNlZCBvbiAxIHNxdWFyZSBtZXRlci5cbiAqXG4gKiBAbWVtYmVyb2YgaGVscGVyc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG5leHBvcnQgdmFyIGFyZWFGYWN0b3JzID0ge1xuICBhY3JlczogMC4wMDAyNDcxMDUsXG4gIGNlbnRpbWV0ZXJzOiAxMDAwMCxcbiAgY2VudGltZXRyZXM6IDEwMDAwLFxuICBmZWV0OiAxMC43NjM5MTA0MTcsXG4gIGhlY3RhcmVzOiAwLjAwMDEsXG4gIGluY2hlczogMTU1MC4wMDMxMDAwMDYsXG4gIGtpbG9tZXRlcnM6IDAuMDAwMDAxLFxuICBraWxvbWV0cmVzOiAwLjAwMDAwMSxcbiAgbWV0ZXJzOiAxLFxuICBtZXRyZXM6IDEsXG4gIG1pbGVzOiAzLjg2ZS03LFxuICBtaWxsaW1ldGVyczogMTAwMDAwMCxcbiAgbWlsbGltZXRyZXM6IDEwMDAwMDAsXG4gIHlhcmRzOiAxLjE5NTk5MDA0NlxufTtcbi8qKlxuICogV3JhcHMgYSBHZW9KU09OIHtAbGluayBHZW9tZXRyeX0gaW4gYSBHZW9KU09OIHtAbGluayBGZWF0dXJlfS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlXG4gKiBAcGFyYW0ge0dlb21ldHJ5fSBnZW9tZXRyeSBpbnB1dCBnZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlfSBhIEdlb0pTT04gRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBnZW9tZXRyeSA9IHtcbiAqICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgXCJjb29yZGluYXRlc1wiOiBbMTEwLCA1MF1cbiAqIH07XG4gKlxuICogdmFyIGZlYXR1cmUgPSB0dXJmLmZlYXR1cmUoZ2VvbWV0cnkpO1xuICpcbiAqIC8vPWZlYXR1cmVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZmVhdCA9IHtcbiAgICB0eXBlOiBcIkZlYXR1cmVcIlxuICB9O1xuXG4gIGlmIChvcHRpb25zLmlkID09PSAwIHx8IG9wdGlvbnMuaWQpIHtcbiAgICBmZWF0LmlkID0gb3B0aW9ucy5pZDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmJib3gpIHtcbiAgICBmZWF0LmJib3ggPSBvcHRpb25zLmJib3g7XG4gIH1cblxuICBmZWF0LnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICBmZWF0Lmdlb21ldHJ5ID0gZ2VvbTtcbiAgcmV0dXJuIGZlYXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBHZW9KU09OIHtAbGluayBHZW9tZXRyeX0gZnJvbSBhIEdlb21ldHJ5IHN0cmluZyB0eXBlICYgY29vcmRpbmF0ZXMuXG4gKiBGb3IgR2VvbWV0cnlDb2xsZWN0aW9uIHR5cGUgdXNlIGBoZWxwZXJzLmdlb21ldHJ5Q29sbGVjdGlvbmBcbiAqXG4gKiBAbmFtZSBnZW9tZXRyeVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgR2VvbWV0cnkgVHlwZVxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBjb29yZGluYXRlcyBDb29yZGluYXRlc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcmV0dXJucyB7R2VvbWV0cnl9IGEgR2VvSlNPTiBHZW9tZXRyeVxuICogQGV4YW1wbGVcbiAqIHZhciB0eXBlID0gXCJQb2ludFwiO1xuICogdmFyIGNvb3JkaW5hdGVzID0gWzExMCwgNTBdO1xuICogdmFyIGdlb21ldHJ5ID0gdHVyZi5nZW9tZXRyeSh0eXBlLCBjb29yZGluYXRlcyk7XG4gKiAvLyA9PiBnZW9tZXRyeVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9tZXRyeSh0eXBlLCBjb29yZGluYXRlcywgX29wdGlvbnMpIHtcbiAgaWYgKF9vcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBfb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRpbmF0ZXMpLmdlb21ldHJ5O1xuXG4gICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTtcblxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICByZXR1cm4gcG9seWdvbihjb29yZGluYXRlcykuZ2VvbWV0cnk7XG5cbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgcmV0dXJuIG11bHRpUG9pbnQoY29vcmRpbmF0ZXMpLmdlb21ldHJ5O1xuXG4gICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgcmV0dXJuIG11bHRpTGluZVN0cmluZyhjb29yZGluYXRlcykuZ2VvbWV0cnk7XG5cbiAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICByZXR1cm4gbXVsdGlQb2x5Z29uKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIGludmFsaWRcIik7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBQb2ludH0ge0BsaW5rIEZlYXR1cmV9IGZyb20gYSBQb3NpdGlvbi5cbiAqXG4gKiBAbmFtZSBwb2ludFxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjb29yZGluYXRlcyBsb25naXR1ZGUsIGxhdGl0dWRlIHBvc2l0aW9uIChlYWNoIGluIGRlY2ltYWwgZGVncmVlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxQb2ludD59IGEgUG9pbnQgZmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludCA9IHR1cmYucG9pbnQoWy03NS4zNDMsIDM5Ljk4NF0pO1xuICpcbiAqIC8vPXBvaW50XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50KGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29vcmRpbmF0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheVwiKTtcbiAgfVxuXG4gIGlmIChjb29yZGluYXRlcy5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmRpbmF0ZXMgbXVzdCBiZSBhdCBsZWFzdCAyIG51bWJlcnMgbG9uZ1wiKTtcbiAgfVxuXG4gIGlmICghaXNOdW1iZXIoY29vcmRpbmF0ZXNbMF0pIHx8ICFpc051bWJlcihjb29yZGluYXRlc1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVyc1wiKTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiUG9pbnRcIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUG9pbnR9IHtAbGluayBGZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSBhbiBBcnJheSBvZiBQb2ludCBjb29yZGluYXRlcy5cbiAqXG4gKiBAbmFtZSBwb2ludHNcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvaW50c1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBUcmFuc2xhdGUgdGhlc2UgcHJvcGVydGllcyB0byBlYWNoIEZlYXR1cmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9uPFBvaW50Pn0gUG9pbnQgRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludHMgPSB0dXJmLnBvaW50cyhbXG4gKiAgIFstNzUsIDM5XSxcbiAqICAgWy04MCwgNDVdLFxuICogICBbLTc4LCA1MF1cbiAqIF0pO1xuICpcbiAqIC8vPXBvaW50c1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludHMoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBmZWF0dXJlQ29sbGVjdGlvbihjb29yZGluYXRlcy5tYXAoZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBwb2ludChjb29yZHMsIHByb3BlcnRpZXMpO1xuICB9KSwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUG9seWdvbn0ge0BsaW5rIEZlYXR1cmV9IGZyb20gYW4gQXJyYXkgb2YgTGluZWFyUmluZ3MuXG4gKlxuICogQG5hbWUgcG9seWdvblxuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIExpbmVhclJpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8UG9seWdvbj59IFBvbHlnb24gRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFtbWy01LCA1Ml0sIFstNCwgNTZdLCBbLTIsIDUxXSwgWy03LCA1NF0sIFstNSwgNTJdXV0sIHsgbmFtZTogJ3BvbHkxJyB9KTtcbiAqXG4gKiAvLz1wb2x5Z29uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb24oY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMCwgY29vcmRpbmF0ZXNfMSA9IGNvb3JkaW5hdGVzOyBfaSA8IGNvb3JkaW5hdGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHJpbmcgPSBjb29yZGluYXRlc18xW19pXTtcblxuICAgIGlmIChyaW5nLmxlbmd0aCA8IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVhY2ggTGluZWFyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuXCIpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZ1tyaW5nLmxlbmd0aCAtIDFdLmxlbmd0aDsgaisrKSB7XG4gICAgICAvLyBDaGVjayBpZiBmaXJzdCBwb2ludCBvZiBQb2x5Z29uIGNvbnRhaW5zIHR3byBudW1iZXJzXG4gICAgICBpZiAocmluZ1tyaW5nLmxlbmd0aCAtIDFdW2pdICE9PSByaW5nWzBdW2pdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC5cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJQb2x5Z29uXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFBvbHlnb259IHtAbGluayBGZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSBhbiBBcnJheSBvZiBQb2x5Z29uIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBuYW1lIHBvbHlnb25zXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvbHlnb24gY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9uPFBvbHlnb24+fSBQb2x5Z29uIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvbHlnb25zID0gdHVyZi5wb2x5Z29ucyhbXG4gKiAgIFtbWy01LCA1Ml0sIFstNCwgNTZdLCBbLTIsIDUxXSwgWy03LCA1NF0sIFstNSwgNTJdXV0sXG4gKiAgIFtbWy0xNSwgNDJdLCBbLTE0LCA0Nl0sIFstMTIsIDQxXSwgWy0xNywgNDRdLCBbLTE1LCA0Ml1dXSxcbiAqIF0pO1xuICpcbiAqIC8vPXBvbHlnb25zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25zKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb24oY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICByZXR1cm4gcG9seWdvbihjb29yZHMsIHByb3BlcnRpZXMpO1xuICB9KSwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgTGluZVN0cmluZ30ge0BsaW5rIEZlYXR1cmV9IGZyb20gYW4gQXJyYXkgb2YgUG9zaXRpb25zLlxuICpcbiAqIEBuYW1lIGxpbmVTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvc2l0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPExpbmVTdHJpbmc+fSBMaW5lU3RyaW5nIEZlYXR1cmVcbiAqIEBleGFtcGxlXG4gKiB2YXIgbGluZXN0cmluZzEgPSB0dXJmLmxpbmVTdHJpbmcoW1stMjQsIDYzXSwgWy0yMywgNjBdLCBbLTI1LCA2NV0sIFstMjAsIDY5XV0sIHtuYW1lOiAnbGluZSAxJ30pO1xuICogdmFyIGxpbmVzdHJpbmcyID0gdHVyZi5saW5lU3RyaW5nKFtbLTE0LCA0M10sIFstMTMsIDQwXSwgWy0xNSwgNDVdLCBbLTEwLCA0OV1dLCB7bmFtZTogJ2xpbmUgMid9KTtcbiAqXG4gKiAvLz1saW5lc3RyaW5nMVxuICogLy89bGluZXN0cmluZzJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZVN0cmluZyhjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byBvciBtb3JlIHBvc2l0aW9uc1wiKTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTGluZVN0cmluZ1wiLFxuICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICB9O1xuICByZXR1cm4gZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBMaW5lU3RyaW5nfSB7QGxpbmsgRmVhdHVyZUNvbGxlY3Rpb259IGZyb20gYW4gQXJyYXkgb2YgTGluZVN0cmluZyBjb29yZGluYXRlcy5cbiAqXG4gKiBAbmFtZSBsaW5lU3RyaW5nc1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIExpbmVhclJpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9uPExpbmVTdHJpbmc+fSBMaW5lU3RyaW5nIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIGxpbmVzdHJpbmdzID0gdHVyZi5saW5lU3RyaW5ncyhbXG4gKiAgIFtbLTI0LCA2M10sIFstMjMsIDYwXSwgWy0yNSwgNjVdLCBbLTIwLCA2OV1dLFxuICogICBbWy0xNCwgNDNdLCBbLTEzLCA0MF0sIFstMTUsIDQ1XSwgWy0xMCwgNDldXVxuICogXSk7XG4gKlxuICogLy89bGluZXN0cmluZ3NcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZVN0cmluZ3MoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBmZWF0dXJlQ29sbGVjdGlvbihjb29yZGluYXRlcy5tYXAoZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBsaW5lU3RyaW5nKGNvb3JkcywgcHJvcGVydGllcyk7XG4gIH0pLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVGFrZXMgb25lIG9yIG1vcmUge0BsaW5rIEZlYXR1cmV8RmVhdHVyZXN9IGFuZCBjcmVhdGVzIGEge0BsaW5rIEZlYXR1cmVDb2xsZWN0aW9ufS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlQ29sbGVjdGlvblxuICogQHBhcmFtIHtGZWF0dXJlW119IGZlYXR1cmVzIGlucHV0IGZlYXR1cmVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlQ29sbGVjdGlvbn0gRmVhdHVyZUNvbGxlY3Rpb24gb2YgRmVhdHVyZXNcbiAqIEBleGFtcGxlXG4gKiB2YXIgbG9jYXRpb25BID0gdHVyZi5wb2ludChbLTc1LjM0MywgMzkuOTg0XSwge25hbWU6ICdMb2NhdGlvbiBBJ30pO1xuICogdmFyIGxvY2F0aW9uQiA9IHR1cmYucG9pbnQoWy03NS44MzMsIDM5LjI4NF0sIHtuYW1lOiAnTG9jYXRpb24gQid9KTtcbiAqIHZhciBsb2NhdGlvbkMgPSB0dXJmLnBvaW50KFstNzUuNTM0LCAzOS4xMjNdLCB7bmFtZTogJ0xvY2F0aW9uIEMnfSk7XG4gKlxuICogdmFyIGNvbGxlY3Rpb24gPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgbG9jYXRpb25BLFxuICogICBsb2NhdGlvbkIsXG4gKiAgIGxvY2F0aW9uQ1xuICogXSk7XG4gKlxuICogLy89Y29sbGVjdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlQ29sbGVjdGlvbihmZWF0dXJlcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGZjID0ge1xuICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIlxuICB9O1xuXG4gIGlmIChvcHRpb25zLmlkKSB7XG4gICAgZmMuaWQgPSBvcHRpb25zLmlkO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYmJveCkge1xuICAgIGZjLmJib3ggPSBvcHRpb25zLmJib3g7XG4gIH1cblxuICBmYy5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICByZXR1cm4gZmM7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aUxpbmVTdHJpbmc+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpTGluZVN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIExpbmVTdHJpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlMaW5lU3RyaW5nPn0gYSBNdWx0aUxpbmVTdHJpbmcgZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWRcbiAqIEBleGFtcGxlXG4gKiB2YXIgbXVsdGlMaW5lID0gdHVyZi5tdWx0aUxpbmVTdHJpbmcoW1tbMCwwXSxbMTAsMTBdXV0pO1xuICpcbiAqIC8vPW11bHRpTGluZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aUxpbmVTdHJpbmcoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTXVsdGlMaW5lU3RyaW5nXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEZlYXR1cmU8TXVsdGlQb2ludD59IGJhc2VkIG9uIGFcbiAqIGNvb3JkaW5hdGUgYXJyYXkuIFByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIG9wdGlvbmFsbHkuXG4gKlxuICogQG5hbWUgbXVsdGlQb2ludFxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgUG9zaXRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlQb2ludD59IGEgTXVsdGlQb2ludCBmZWF0dXJlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gY29vcmRpbmF0ZXMgYXJlIHBhc3NlZFxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aVB0ID0gdHVyZi5tdWx0aVBvaW50KFtbMCwwXSxbMTAsMTBdXSk7XG4gKlxuICogLy89bXVsdGlQdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVBvaW50KGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZ2VvbSA9IHtcbiAgICB0eXBlOiBcIk11bHRpUG9pbnRcIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aVBvbHlnb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpUG9seWdvblxuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBQb2x5Z29uc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPE11bHRpUG9seWdvbj59IGEgbXVsdGlwb2x5Z29uIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpUG9seSA9IHR1cmYubXVsdGlQb2x5Z29uKFtbW1swLDBdLFswLDEwXSxbMTAsMTBdLFsxMCwwXSxbMCwwXV1dXSk7XG4gKlxuICogLy89bXVsdGlQb2x5XG4gKlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVBvbHlnb24oY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTXVsdGlQb2x5Z29uXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEZlYXR1cmU8R2VvbWV0cnlDb2xsZWN0aW9uPn0gYmFzZWQgb24gYVxuICogY29vcmRpbmF0ZSBhcnJheS4gUHJvcGVydGllcyBjYW4gYmUgYWRkZWQgb3B0aW9uYWxseS5cbiAqXG4gKiBAbmFtZSBnZW9tZXRyeUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXk8R2VvbWV0cnk+fSBnZW9tZXRyaWVzIGFuIGFycmF5IG9mIEdlb0pTT04gR2VvbWV0cmllc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPEdlb21ldHJ5Q29sbGVjdGlvbj59IGEgR2VvSlNPTiBHZW9tZXRyeUNvbGxlY3Rpb24gRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBwdCA9IHR1cmYuZ2VvbWV0cnkoXCJQb2ludFwiLCBbMTAwLCAwXSk7XG4gKiB2YXIgbGluZSA9IHR1cmYuZ2VvbWV0cnkoXCJMaW5lU3RyaW5nXCIsIFtbMTAxLCAwXSwgWzEwMiwgMV1dKTtcbiAqIHZhciBjb2xsZWN0aW9uID0gdHVyZi5nZW9tZXRyeUNvbGxlY3Rpb24oW3B0LCBsaW5lXSk7XG4gKlxuICogLy8gPT4gY29sbGVjdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9tZXRyeUNvbGxlY3Rpb24oZ2VvbWV0cmllcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJHZW9tZXRyeUNvbGxlY3Rpb25cIixcbiAgICBnZW9tZXRyaWVzOiBnZW9tZXRyaWVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSb3VuZCBudW1iZXIgdG8gcHJlY2lzaW9uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG51bSBOdW1iZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFByZWNpc2lvblxuICogQHJldHVybnMge251bWJlcn0gcm91bmRlZCBudW1iZXJcbiAqIEBleGFtcGxlXG4gKiB0dXJmLnJvdW5kKDEyMC40MzIxKVxuICogLy89MTIwXG4gKlxuICogdHVyZi5yb3VuZCgxMjAuNDMyMSwgMilcbiAqIC8vPTEyMC40M1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChudW0sIHByZWNpc2lvbikge1xuICBpZiAocHJlY2lzaW9uID09PSB2b2lkIDApIHtcbiAgICBwcmVjaXNpb24gPSAwO1xuICB9XG5cbiAgaWYgKHByZWNpc2lvbiAmJiAhKHByZWNpc2lvbiA+PSAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICB9XG5cbiAgdmFyIG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uIHx8IDApO1xuICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiBtdWx0aXBsaWVyKSAvIG11bHRpcGxpZXI7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gcmFkaWFucyB0byBhIG1vcmUgZnJpZW5kbHkgdW5pdC5cbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGtpbG9tZXRlcnMsIGNlbnRpbWV0ZXJzLCBmZWV0XG4gKlxuICogQG5hbWUgcmFkaWFuc1RvTGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyBpbiByYWRpYW5zIGFjcm9zcyB0aGUgc3BoZXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VuaXRzPVwia2lsb21ldGVyc1wiXSBjYW4gYmUgZGVncmVlcywgcmFkaWFucywgbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldHJlcyxcbiAqIG1ldGVycywga2lsb21ldHJlcywga2lsb21ldGVycy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IGRpc3RhbmNlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhZGlhbnNUb0xlbmd0aChyYWRpYW5zLCB1bml0cykge1xuICBpZiAodW5pdHMgPT09IHZvaWQgMCkge1xuICAgIHVuaXRzID0gXCJraWxvbWV0ZXJzXCI7XG4gIH1cblxuICB2YXIgZmFjdG9yID0gZmFjdG9yc1t1bml0c107XG5cbiAgaWYgKCFmYWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodW5pdHMgKyBcIiB1bml0cyBpcyBpbnZhbGlkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHJhZGlhbnMgKiBmYWN0b3I7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gYSByZWFsLXdvcmxkIHVuaXQgaW50byByYWRpYW5zXG4gKiBWYWxpZCB1bml0czogbWlsZXMsIG5hdXRpY2FsbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldGVycywgbWV0cmVzLCBraWxvbWV0ZXJzLCBjZW50aW1ldGVycywgZmVldFxuICpcbiAqIEBuYW1lIGxlbmd0aFRvUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIGluIHJlYWwgdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9XCJraWxvbWV0ZXJzXCJdIGNhbiBiZSBkZWdyZWVzLCByYWRpYW5zLCBtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0cmVzLFxuICogbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGhUb1JhZGlhbnMoZGlzdGFuY2UsIHVuaXRzKSB7XG4gIGlmICh1bml0cyA9PT0gdm9pZCAwKSB7XG4gICAgdW5pdHMgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIHZhciBmYWN0b3IgPSBmYWN0b3JzW3VuaXRzXTtcblxuICBpZiAoIWZhY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcih1bml0cyArIFwiIHVuaXRzIGlzIGludmFsaWRcIik7XG4gIH1cblxuICByZXR1cm4gZGlzdGFuY2UgLyBmYWN0b3I7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gYSByZWFsLXdvcmxkIHVuaXQgaW50byBkZWdyZWVzXG4gKiBWYWxpZCB1bml0czogbWlsZXMsIG5hdXRpY2FsbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldGVycywgbWV0cmVzLCBjZW50aW1ldGVycywga2lsb21ldHJlcywgZmVldFxuICpcbiAqIEBuYW1lIGxlbmd0aFRvRGVncmVlc1xuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIGluIHJlYWwgdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9XCJraWxvbWV0ZXJzXCJdIGNhbiBiZSBkZWdyZWVzLCByYWRpYW5zLCBtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0cmVzLFxuICogbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gZGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGhUb0RlZ3JlZXMoZGlzdGFuY2UsIHVuaXRzKSB7XG4gIHJldHVybiByYWRpYW5zVG9EZWdyZWVzKGxlbmd0aFRvUmFkaWFucyhkaXN0YW5jZSwgdW5pdHMpKTtcbn1cbi8qKlxuICogQ29udmVydHMgYW55IGJlYXJpbmcgYW5nbGUgZnJvbSB0aGUgbm9ydGggbGluZSBkaXJlY3Rpb24gKHBvc2l0aXZlIGNsb2Nrd2lzZSlcbiAqIGFuZCByZXR1cm5zIGFuIGFuZ2xlIGJldHdlZW4gMC0zNjAgZGVncmVlcyAocG9zaXRpdmUgY2xvY2t3aXNlKSwgMCBiZWluZyB0aGUgbm9ydGggbGluZVxuICpcbiAqIEBuYW1lIGJlYXJpbmdUb0F6aW11dGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIGFuZ2xlLCBiZXR3ZWVuIC0xODAgYW5kICsxODAgZGVncmVlc1xuICogQHJldHVybnMge251bWJlcn0gYW5nbGUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZWFyaW5nVG9BemltdXRoKGJlYXJpbmcpIHtcbiAgdmFyIGFuZ2xlID0gYmVhcmluZyAlIDM2MDtcblxuICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgKz0gMzYwO1xuICB9XG5cbiAgcmV0dXJuIGFuZ2xlO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhbmdsZSBpbiByYWRpYW5zIHRvIGRlZ3JlZXNcbiAqXG4gKiBAbmFtZSByYWRpYW5zVG9EZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyBhbmdsZSBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBkZWdyZWVzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFkaWFuc1RvRGVncmVlcyhyYWRpYW5zKSB7XG4gIHZhciBkZWdyZWVzID0gcmFkaWFucyAlICgyICogTWF0aC5QSSk7XG4gIHJldHVybiBkZWdyZWVzICogMTgwIC8gTWF0aC5QSTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gYW5nbGUgaW4gZGVncmVlcyB0byByYWRpYW5zXG4gKlxuICogQG5hbWUgZGVncmVlc1RvUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGRlZ3JlZXMgYW5nbGUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlc1xuICogQHJldHVybnMge251bWJlcn0gYW5nbGUgaW4gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpIHtcbiAgdmFyIHJhZGlhbnMgPSBkZWdyZWVzICUgMzYwO1xuICByZXR1cm4gcmFkaWFucyAqIE1hdGguUEkgLyAxODA7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgbGVuZ3RoIHRvIHRoZSByZXF1ZXN0ZWQgdW5pdC5cbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGtpbG9tZXRlcnMsIGNlbnRpbWV0ZXJzLCBmZWV0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSB7VW5pdHN9IFtvcmlnaW5hbFVuaXQ9XCJraWxvbWV0ZXJzXCJdIG9mIHRoZSBsZW5ndGhcbiAqIEBwYXJhbSB7VW5pdHN9IFtmaW5hbFVuaXQ9XCJraWxvbWV0ZXJzXCJdIHJldHVybmVkIHVuaXRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjb252ZXJ0ZWQgbGVuZ3RoXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMZW5ndGgobGVuZ3RoLCBvcmlnaW5hbFVuaXQsIGZpbmFsVW5pdCkge1xuICBpZiAob3JpZ2luYWxVbml0ID09PSB2b2lkIDApIHtcbiAgICBvcmlnaW5hbFVuaXQgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIGlmIChmaW5hbFVuaXQgPT09IHZvaWQgMCkge1xuICAgIGZpbmFsVW5pdCA9IFwia2lsb21ldGVyc1wiO1xuICB9XG5cbiAgaWYgKCEobGVuZ3RoID49IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibGVuZ3RoIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cblxuICByZXR1cm4gcmFkaWFuc1RvTGVuZ3RoKGxlbmd0aFRvUmFkaWFucyhsZW5ndGgsIG9yaWdpbmFsVW5pdCksIGZpbmFsVW5pdCk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgYXJlYSB0byB0aGUgcmVxdWVzdGVkIHVuaXQuXG4gKiBWYWxpZCB1bml0czoga2lsb21ldGVycywga2lsb21ldHJlcywgbWV0ZXJzLCBtZXRyZXMsIGNlbnRpbWV0cmVzLCBtaWxsaW1ldGVycywgYWNyZXMsIG1pbGVzLCB5YXJkcywgZmVldCwgaW5jaGVzLCBoZWN0YXJlc1xuICogQHBhcmFtIHtudW1iZXJ9IGFyZWEgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge1VuaXRzfSBbb3JpZ2luYWxVbml0PVwibWV0ZXJzXCJdIG9mIHRoZSBkaXN0YW5jZVxuICogQHBhcmFtIHtVbml0c30gW2ZpbmFsVW5pdD1cImtpbG9tZXRlcnNcIl0gcmV0dXJuZWQgdW5pdFxuICogQHJldHVybnMge251bWJlcn0gdGhlIGNvbnZlcnRlZCBhcmVhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBcmVhKGFyZWEsIG9yaWdpbmFsVW5pdCwgZmluYWxVbml0KSB7XG4gIGlmIChvcmlnaW5hbFVuaXQgPT09IHZvaWQgMCkge1xuICAgIG9yaWdpbmFsVW5pdCA9IFwibWV0ZXJzXCI7XG4gIH1cblxuICBpZiAoZmluYWxVbml0ID09PSB2b2lkIDApIHtcbiAgICBmaW5hbFVuaXQgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIGlmICghKGFyZWEgPj0gMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cblxuICB2YXIgc3RhcnRGYWN0b3IgPSBhcmVhRmFjdG9yc1tvcmlnaW5hbFVuaXRdO1xuXG4gIGlmICghc3RhcnRGYWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yaWdpbmFsIHVuaXRzXCIpO1xuICB9XG5cbiAgdmFyIGZpbmFsRmFjdG9yID0gYXJlYUZhY3RvcnNbZmluYWxVbml0XTtcblxuICBpZiAoIWZpbmFsRmFjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaW5hbCB1bml0c1wiKTtcbiAgfVxuXG4gIHJldHVybiBhcmVhIC8gc3RhcnRGYWN0b3IgKiBmaW5hbEZhY3Rvcjtcbn1cbi8qKlxuICogaXNOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IG51bSBOdW1iZXIgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlL2ZhbHNlXG4gKiBAZXhhbXBsZVxuICogdHVyZi5pc051bWJlcigxMjMpXG4gKiAvLz10cnVlXG4gKiB0dXJmLmlzTnVtYmVyKCdmb28nKVxuICogLy89ZmFsc2VcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIobnVtKSB7XG4gIHJldHVybiAhaXNOYU4obnVtKSAmJiBudW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkobnVtKTtcbn1cbi8qKlxuICogaXNPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IGlucHV0IHZhcmlhYmxlIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZS9mYWxzZVxuICogQGV4YW1wbGVcbiAqIHR1cmYuaXNPYmplY3Qoe2VsZXZhdGlvbjogMTB9KVxuICogLy89dHJ1ZVxuICogdHVyZi5pc09iamVjdCgnZm9vJylcbiAqIC8vPWZhbHNlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gIHJldHVybiAhIWlucHV0ICYmIGlucHV0LmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG4vKipcbiAqIFZhbGlkYXRlIEJCb3hcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBiYm94IEJCb3ggdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHRocm93cyBFcnJvciBpZiBCQm94IGlzIG5vdCB2YWxpZFxuICogQGV4YW1wbGVcbiAqIHZhbGlkYXRlQkJveChbLTE4MCwgLTQwLCAxMTAsIDUwXSlcbiAqIC8vPU9LXG4gKiB2YWxpZGF0ZUJCb3goWy0xODAsIC00MF0pXG4gKiAvLz1FcnJvclxuICogdmFsaWRhdGVCQm94KCdGb28nKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlQkJveCg1KVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlQkJveChudWxsKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlQkJveCh1bmRlZmluZWQpXG4gKiAvLz1FcnJvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJCb3goYmJveCkge1xuICBpZiAoIWJib3gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYm94IGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGJib3gpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYmJveCBtdXN0IGJlIGFuIEFycmF5XCIpO1xuICB9XG5cbiAgaWYgKGJib3gubGVuZ3RoICE9PSA0ICYmIGJib3gubGVuZ3RoICE9PSA2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzXCIpO1xuICB9XG5cbiAgYmJveC5mb3JFYWNoKGZ1bmN0aW9uIChudW0pIHtcbiAgICBpZiAoIWlzTnVtYmVyKG51bSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVyc1wiKTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBJZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIElkIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEB0aHJvd3MgRXJyb3IgaWYgSWQgaXMgbm90IHZhbGlkXG4gKiBAZXhhbXBsZVxuICogdmFsaWRhdGVJZChbLTE4MCwgLTQwLCAxMTAsIDUwXSlcbiAqIC8vPUVycm9yXG4gKiB2YWxpZGF0ZUlkKFstMTgwLCAtNDBdKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlSWQoJ0ZvbycpXG4gKiAvLz1PS1xuICogdmFsaWRhdGVJZCg1KVxuICogLy89T0tcbiAqIHZhbGlkYXRlSWQobnVsbClcbiAqIC8vPUVycm9yXG4gKiB2YWxpZGF0ZUlkKHVuZGVmaW5lZClcbiAqIC8vPUVycm9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSWQoaWQpIHtcbiAgaWYgKCFpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImlkIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKFtcInN0cmluZ1wiLCBcIm51bWJlclwiXS5pbmRleE9mKHR5cGVvZiBpZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZ1wiKTtcbiAgfVxufSIsImltcG9ydCB7IGZlYXR1cmUsIGxpbmVTdHJpbmcsIGlzT2JqZWN0LCBwb2ludCB9IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuLyoqXG4gKiBDYWxsYmFjayBmb3IgY29vcmRFYWNoXG4gKlxuICogQGNhbGxiYWNrIGNvb3JkRWFjaENhbGxiYWNrXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGN1cnJlbnRDb29yZCBUaGUgY3VycmVudCBjb29yZGluYXRlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb29yZEluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBjb29yZGluYXRlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgY29vcmRpbmF0ZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LmZvckVhY2goKVxuICpcbiAqIEBuYW1lIGNvb3JkRWFjaFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHtib29sZWFufSBbZXhjbHVkZVdyYXBDb29yZD1mYWxzZV0gd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgZmluYWwgY29vcmRpbmF0ZSBvZiBMaW5lYXJSaW5ncyB0aGF0IHdyYXBzIHRoZSByaW5nIGluIGl0cyBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgdHVyZi5wb2ludChbMjYsIDM3XSwge1wiZm9vXCI6IFwiYmFyXCJ9KSxcbiAqICAgdHVyZi5wb2ludChbMzYsIDUzXSwge1wiaGVsbG9cIjogXCJ3b3JsZFwifSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuY29vcmRFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRDb29yZFxuICogICAvLz1jb29yZEluZGV4XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiB9KTtcbiAqL1xuXG5mdW5jdGlvbiBjb29yZEVhY2goZ2VvanNvbiwgY2FsbGJhY2ssIGV4Y2x1ZGVXcmFwQ29vcmQpIHtcbiAgLy8gSGFuZGxlcyBudWxsIEdlb21ldHJ5IC0tIFNraXBzIHRoaXMgR2VvSlNPTlxuICBpZiAoZ2VvanNvbiA9PT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgaixcbiAgICAgIGssXG4gICAgICBsLFxuICAgICAgZ2VvbWV0cnksXG4gICAgICBzdG9wRyxcbiAgICAgIGNvb3JkcyxcbiAgICAgIGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLFxuICAgICAgd3JhcFNocmluayA9IDAsXG4gICAgICBjb29yZEluZGV4ID0gMCxcbiAgICAgIGlzR2VvbWV0cnlDb2xsZWN0aW9uLFxuICAgICAgdHlwZSA9IGdlb2pzb24udHlwZSxcbiAgICAgIGlzRmVhdHVyZUNvbGxlY3Rpb24gPSB0eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICBpc0ZlYXR1cmUgPSB0eXBlID09PSBcIkZlYXR1cmVcIixcbiAgICAgIHN0b3AgPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGggOiAxOyAvLyBUaGlzIGxvZ2ljIG1heSBsb29rIGEgbGl0dGxlIHdlaXJkLiBUaGUgcmVhc29uIHdoeSBpdCBpcyB0aGF0IHdheVxuICAvLyBpcyBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIGJlIGZhc3QuIEdlb0pTT04gc3VwcG9ydHMgbXVsdGlwbGUga2luZHNcbiAgLy8gb2Ygb2JqZWN0cyBhdCBpdHMgcm9vdDogRmVhdHVyZUNvbGxlY3Rpb24sIEZlYXR1cmVzLCBHZW9tZXRyaWVzLlxuICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgaGFuZGxpbmcgYWxsIG9mIHRoZW0sIGFuZCB0aGF0XG4gIC8vIG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgYGZvcmAgbG9vcHMgeW91IHNlZSBiZWxvdyBhY3R1YWxseSBqdXN0IGRvbid0IGFwcGx5XG4gIC8vIHRvIGNlcnRhaW4gaW5wdXRzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBnaXZlIHRoaXMganVzdCBhXG4gIC8vIFBvaW50IGdlb21ldHJ5LCB0aGVuIGJvdGggbG9vcHMgYXJlIHNob3J0LWNpcmN1aXRlZCBhbmQgYWxsIHdlIGRvXG4gIC8vIGlzIGdyYWR1YWxseSByZW5hbWUgdGhlIGlucHV0IHVudGlsIGl0J3MgY2FsbGVkICdnZW9tZXRyeScuXG4gIC8vXG4gIC8vIFRoaXMgYWxzbyBhaW1zIHRvIGFsbG9jYXRlIGFzIGZldyByZXNvdXJjZXMgYXMgcG9zc2libGU6IGp1c3QgYVxuICAvLyBmZXcgbnVtYmVycyBhbmQgYm9vbGVhbnMsIHJhdGhlciB0aGFuIGFueSB0ZW1wb3JhcnkgYXJyYXlzIGFzIHdvdWxkXG4gIC8vIGJlIHJlcXVpcmVkIHdpdGggdGhlIG5vcm1hbGl6YXRpb24gYXBwcm9hY2guXG5cbiAgZm9yICh2YXIgZmVhdHVyZUluZGV4ID0gMDsgZmVhdHVyZUluZGV4IDwgc3RvcDsgZmVhdHVyZUluZGV4KyspIHtcbiAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbiA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF0uZ2VvbWV0cnkgOiBpc0ZlYXR1cmUgPyBnZW9qc29uLmdlb21ldHJ5IDogZ2VvanNvbjtcbiAgICBpc0dlb21ldHJ5Q29sbGVjdGlvbiA9IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24udHlwZSA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiA6IGZhbHNlO1xuICAgIHN0b3BHID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzLmxlbmd0aCA6IDE7XG5cbiAgICBmb3IgKHZhciBnZW9tSW5kZXggPSAwOyBnZW9tSW5kZXggPCBzdG9wRzsgZ2VvbUluZGV4KyspIHtcbiAgICAgIHZhciBtdWx0aUZlYXR1cmVJbmRleCA9IDA7XG4gICAgICB2YXIgZ2VvbWV0cnlJbmRleCA9IDA7XG4gICAgICBnZW9tZXRyeSA9IGlzR2VvbWV0cnlDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24uZ2VvbWV0cmllc1tnZW9tSW5kZXhdIDogZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb247IC8vIEhhbmRsZXMgbnVsbCBHZW9tZXRyeSAtLSBTa2lwcyB0aGlzIGdlb21ldHJ5XG5cbiAgICAgIGlmIChnZW9tZXRyeSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgIHZhciBnZW9tVHlwZSA9IGdlb21ldHJ5LnR5cGU7XG4gICAgICB3cmFwU2hyaW5rID0gZXhjbHVkZVdyYXBDb29yZCAmJiAoZ2VvbVR5cGUgPT09IFwiUG9seWdvblwiIHx8IGdlb21UeXBlID09PSBcIk11bHRpUG9seWdvblwiKSA/IDEgOiAwO1xuXG4gICAgICBzd2l0Y2ggKGdlb21UeXBlKSB7XG4gICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICAgICAgICBpZiAoY2FsbGJhY2soY29vcmRzLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBjb29yZEluZGV4Kys7XG4gICAgICAgICAgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhjb29yZHNbal0sIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29vcmRJbmRleCsrO1xuICAgICAgICAgICAgaWYgKGdlb21UeXBlID09PSBcIk11bHRpUG9pbnRcIikgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSBtdWx0aUZlYXR1cmVJbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY29vcmRzW2pdLmxlbmd0aCAtIHdyYXBTaHJpbms7IGsrKykge1xuICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soY29vcmRzW2pdW2tdLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29vcmRJbmRleCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIG11bHRpRmVhdHVyZUluZGV4Kys7XG4gICAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiUG9seWdvblwiKSBnZW9tZXRyeUluZGV4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGdlb21UeXBlID09PSBcIlBvbHlnb25cIikgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZ2VvbWV0cnlJbmRleCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb29yZHNbal0ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IGNvb3Jkc1tqXVtrXS5sZW5ndGggLSB3cmFwU2hyaW5rOyBsKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soY29vcmRzW2pdW2tdW2xdLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb29yZEluZGV4Kys7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBnZW9tZXRyeUluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG11bHRpRmVhdHVyZUluZGV4Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiOlxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tZXRyeS5nZW9tZXRyaWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoY29vcmRFYWNoKGdlb21ldHJ5Lmdlb21ldHJpZXNbal0sIGNhbGxiYWNrLCBleGNsdWRlV3JhcENvb3JkKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gR2VvbWV0cnkgVHlwZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGNvb3JkUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgY29vcmRSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gY3VycmVudENvb3JkIFRoZSBjdXJyZW50IGNvb3JkaW5hdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvb3JkSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGNvb3JkaW5hdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICogU3RhcnRzIGF0IGluZGV4IDAsIGlmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCwgYW5kIGF0IGluZGV4IDEgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbXVsdGlGZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIE11bHRpLUZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBjb29yZGluYXRlcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkucmVkdWNlKClcbiAqXG4gKiBAbmFtZSBjb29yZFJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxHZW9tZXRyeXxGZWF0dXJlfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudENvb3JkLCBjb29yZEluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4Y2x1ZGVXcmFwQ29vcmQ9ZmFsc2VdIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIGZpbmFsIGNvb3JkaW5hdGUgb2YgTGluZWFyUmluZ3MgdGhhdCB3cmFwcyB0aGUgcmluZyBpbiBpdHMgaXRlcmF0aW9uLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICB0dXJmLnBvaW50KFsyNiwgMzddLCB7XCJmb29cIjogXCJiYXJcIn0pLFxuICogICB0dXJmLnBvaW50KFszNiwgNTNdLCB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9KVxuICogXSk7XG4gKlxuICogdHVyZi5jb29yZFJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRDb29yZCwgY29vcmRJbmRleCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRDb29yZFxuICogICAvLz1jb29yZEluZGV4XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50Q29vcmQ7XG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGNvb3JkUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUsIGV4Y2x1ZGVXcmFwQ29vcmQpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGNvb3JkRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gICAgaWYgKGNvb3JkSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50Q29vcmQ7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KTtcbiAgfSwgZXhjbHVkZVdyYXBDb29yZCk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgcHJvcEVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgcHJvcEVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtPYmplY3R9IGN1cnJlbnRQcm9wZXJ0aWVzIFRoZSBjdXJyZW50IFByb3BlcnRpZXMgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgcHJvcGVydGllcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKlxuICogQG5hbWUgcHJvcEVhY2hcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRQcm9wZXJ0aWVzLCBmZWF0dXJlSW5kZXgpXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLnByb3BFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1jdXJyZW50UHJvcGVydGllc1xuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gcHJvcEVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgdmFyIGk7XG5cbiAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHtcbiAgICBjYXNlIFwiRmVhdHVyZUNvbGxlY3Rpb25cIjpcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjYWxsYmFjayhnZW9qc29uLmZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGkpID09PSBmYWxzZSkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZlYXR1cmVcIjpcbiAgICAgIGNhbGxiYWNrKGdlb2pzb24ucHJvcGVydGllcywgMCk7XG4gICAgICBicmVhaztcbiAgfVxufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgcHJvcFJlZHVjZVxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzIGRlcGVuZFxuICogb24gd2hldGhlciB0aGUgcmVkdWNlIG1ldGhvZCBoYXMgYW4gaW5pdGlhbFZhbHVlIGFyZ3VtZW50LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCB0byB0aGUgcmVkdWNlIG1ldGhvZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIGluaXRpYWxWYWx1ZS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBub3QgcHJvdmlkZWQ6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogQGNhbGxiYWNrIHByb3BSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7Kn0gY3VycmVudFByb3BlcnRpZXMgVGhlIGN1cnJlbnQgUHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBwcm9wZXJ0aWVzIGluIGFueSBHZW9KU09OIG9iamVjdCBpbnRvIGEgc2luZ2xlIHZhbHVlLFxuICogc2ltaWxhciB0byBob3cgQXJyYXkucmVkdWNlIHdvcmtzLiBIb3dldmVyLCBpbiB0aGlzIGNhc2Ugd2UgbGF6aWx5IHJ1blxuICogdGhlIHJlZHVjdGlvbiwgc28gYW4gYXJyYXkgb2YgYWxsIHByb3BlcnRpZXMgaXMgdW5uZWNlc3NhcnkuXG4gKlxuICogQG5hbWUgcHJvcFJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleClcbiAqIEBwYXJhbSB7Kn0gW2luaXRpYWxWYWx1ZV0gVmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSByZWR1Y3Rpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgICB0dXJmLnBvaW50KFszNiwgNTNdLCB7aGVsbG86ICd3b3JsZCd9KVxuICogXSk7XG4gKlxuICogdHVyZi5wcm9wUmVkdWNlKGZlYXR1cmVzLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSwgY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRQcm9wZXJ0aWVzXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICByZXR1cm4gY3VycmVudFByb3BlcnRpZXNcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gcHJvcFJlZHVjZShnZW9qc29uLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICBwcm9wRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50UHJvcGVydGllcztlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50UHJvcGVydGllcywgZmVhdHVyZUluZGV4KTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgZmVhdHVyZUVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgZmVhdHVyZUVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtGZWF0dXJlPGFueT59IGN1cnJlbnRGZWF0dXJlIFRoZSBjdXJyZW50IEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvXG4gKiBBcnJheS5mb3JFYWNoLlxuICpcbiAqIEBuYW1lIGZlYXR1cmVFYWNoXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4KVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmZlYXR1cmVFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZmVhdHVyZUVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgaWYgKGdlb2pzb24udHlwZSA9PT0gXCJGZWF0dXJlXCIpIHtcbiAgICBjYWxsYmFjayhnZW9qc29uLCAwKTtcbiAgfSBlbHNlIGlmIChnZW9qc29uLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrKGdlb2pzb24uZmVhdHVyZXNbaV0sIGkpID09PSBmYWxzZSkgYnJlYWs7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBmZWF0dXJlUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgZmVhdHVyZVJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtGZWF0dXJlfSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICovXG5cbi8qKlxuICogUmVkdWNlIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlUmVkdWNlXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgdHVyZi5wb2ludChbMjYsIDM3XSwge1wiZm9vXCI6IFwiYmFyXCJ9KSxcbiAqICAgdHVyZi5wb2ludChbMzYsIDUzXSwge1wiaGVsbG9cIjogXCJ3b3JsZFwifSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZmVhdHVyZVJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRGZWF0dXJlXG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGZlYXR1cmVSZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgZmVhdHVyZUVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgpIHtcbiAgICBpZiAoZmVhdHVyZUluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSBwcmV2aW91c1ZhbHVlID0gY3VycmVudEZlYXR1cmU7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCk7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogR2V0IGFsbCBjb29yZGluYXRlcyBmcm9tIGFueSBHZW9KU09OIG9iamVjdC5cbiAqXG4gKiBAbmFtZSBjb29yZEFsbFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHJldHVybnMge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlIHBvc2l0aW9uIGFycmF5XG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB2YXIgY29vcmRzID0gdHVyZi5jb29yZEFsbChmZWF0dXJlcyk7XG4gKiAvLz0gW1syNiwgMzddLCBbMzYsIDUzXV1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvb3JkQWxsKGdlb2pzb24pIHtcbiAgdmFyIGNvb3JkcyA9IFtdO1xuICBjb29yZEVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGNvb3JkKSB7XG4gICAgY29vcmRzLnB1c2goY29vcmQpO1xuICB9KTtcbiAgcmV0dXJuIGNvb3Jkcztcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGdlb21FYWNoXG4gKlxuICogQGNhbGxiYWNrIGdlb21FYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7R2VvbWV0cnl9IGN1cnJlbnRHZW9tZXRyeSBUaGUgY3VycmVudCBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlUHJvcGVydGllcyBUaGUgY3VycmVudCBGZWF0dXJlIFByb3BlcnRpZXMgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBmZWF0dXJlQkJveCBUaGUgY3VycmVudCBGZWF0dXJlIEJCb3ggYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmZWF0dXJlSWQgVGhlIGN1cnJlbnQgRmVhdHVyZSBJZCBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBnZW9tZXRyeSBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKlxuICogQG5hbWUgZ2VvbUVhY2hcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRHZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZClcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgICAgdHVyZi5wb2ludChbMzYsIDUzXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZ2VvbUVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50R2VvbWV0cnksIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpIHtcbiAqICAgLy89Y3VycmVudEdlb21ldHJ5XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1mZWF0dXJlUHJvcGVydGllc1xuICogICAvLz1mZWF0dXJlQkJveFxuICogICAvLz1mZWF0dXJlSWRcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZ2VvbUVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgdmFyIGksXG4gICAgICBqLFxuICAgICAgZyxcbiAgICAgIGdlb21ldHJ5LFxuICAgICAgc3RvcEcsXG4gICAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbixcbiAgICAgIGlzR2VvbWV0cnlDb2xsZWN0aW9uLFxuICAgICAgZmVhdHVyZVByb3BlcnRpZXMsXG4gICAgICBmZWF0dXJlQkJveCxcbiAgICAgIGZlYXR1cmVJZCxcbiAgICAgIGZlYXR1cmVJbmRleCA9IDAsXG4gICAgICBpc0ZlYXR1cmVDb2xsZWN0aW9uID0gZ2VvanNvbi50eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICBpc0ZlYXR1cmUgPSBnZW9qc29uLnR5cGUgPT09IFwiRmVhdHVyZVwiLFxuICAgICAgc3RvcCA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aCA6IDE7IC8vIFRoaXMgbG9naWMgbWF5IGxvb2sgYSBsaXR0bGUgd2VpcmQuIFRoZSByZWFzb24gd2h5IGl0IGlzIHRoYXQgd2F5XG4gIC8vIGlzIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gYmUgZmFzdC4gR2VvSlNPTiBzdXBwb3J0cyBtdWx0aXBsZSBraW5kc1xuICAvLyBvZiBvYmplY3RzIGF0IGl0cyByb290OiBGZWF0dXJlQ29sbGVjdGlvbiwgRmVhdHVyZXMsIEdlb21ldHJpZXMuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBoYW5kbGluZyBhbGwgb2YgdGhlbSwgYW5kIHRoYXRcbiAgLy8gbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBgZm9yYCBsb29wcyB5b3Ugc2VlIGJlbG93IGFjdHVhbGx5IGp1c3QgZG9uJ3QgYXBwbHlcbiAgLy8gdG8gY2VydGFpbiBpbnB1dHMuIEZvciBpbnN0YW5jZSwgaWYgeW91IGdpdmUgdGhpcyBqdXN0IGFcbiAgLy8gUG9pbnQgZ2VvbWV0cnksIHRoZW4gYm90aCBsb29wcyBhcmUgc2hvcnQtY2lyY3VpdGVkIGFuZCBhbGwgd2UgZG9cbiAgLy8gaXMgZ3JhZHVhbGx5IHJlbmFtZSB0aGUgaW5wdXQgdW50aWwgaXQncyBjYWxsZWQgJ2dlb21ldHJ5Jy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGFpbXMgdG8gYWxsb2NhdGUgYXMgZmV3IHJlc291cmNlcyBhcyBwb3NzaWJsZToganVzdCBhXG4gIC8vIGZldyBudW1iZXJzIGFuZCBib29sZWFucywgcmF0aGVyIHRoYW4gYW55IHRlbXBvcmFyeSBhcnJheXMgYXMgd291bGRcbiAgLy8gYmUgcmVxdWlyZWQgd2l0aCB0aGUgbm9ybWFsaXphdGlvbiBhcHByb2FjaC5cblxuICBmb3IgKGkgPSAwOyBpIDwgc3RvcDsgaSsrKSB7XG4gICAgZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24gPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlc1tpXS5nZW9tZXRyeSA6IGlzRmVhdHVyZSA/IGdlb2pzb24uZ2VvbWV0cnkgOiBnZW9qc29uO1xuICAgIGZlYXR1cmVQcm9wZXJ0aWVzID0gaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGdlb2pzb24uZmVhdHVyZXNbaV0ucHJvcGVydGllcyA6IGlzRmVhdHVyZSA/IGdlb2pzb24ucHJvcGVydGllcyA6IHt9O1xuICAgIGZlYXR1cmVCQm94ID0gaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGdlb2pzb24uZmVhdHVyZXNbaV0uYmJveCA6IGlzRmVhdHVyZSA/IGdlb2pzb24uYmJveCA6IHVuZGVmaW5lZDtcbiAgICBmZWF0dXJlSWQgPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlc1tpXS5pZCA6IGlzRmVhdHVyZSA/IGdlb2pzb24uaWQgOiB1bmRlZmluZWQ7XG4gICAgaXNHZW9tZXRyeUNvbGxlY3Rpb24gPSBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbiA/IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCIgOiBmYWxzZTtcbiAgICBzdG9wRyA9IGlzR2VvbWV0cnlDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24uZ2VvbWV0cmllcy5sZW5ndGggOiAxO1xuXG4gICAgZm9yIChnID0gMDsgZyA8IHN0b3BHOyBnKyspIHtcbiAgICAgIGdlb21ldHJ5ID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzW2ddIDogZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb247IC8vIEhhbmRsZSBudWxsIEdlb21ldHJ5XG5cbiAgICAgIGlmIChnZW9tZXRyeSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoY2FsbGJhY2sobnVsbCwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGdlb21ldHJ5LnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhnZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tZXRyeS5nZW9tZXRyaWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChjYWxsYmFjayhnZW9tZXRyeS5nZW9tZXRyaWVzW2pdLCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBHZW9tZXRyeSBUeXBlXCIpO1xuICAgICAgfVxuICAgIH0gLy8gT25seSBpbmNyZWFzZSBgZmVhdHVyZUluZGV4YCBwZXIgZWFjaCBmZWF0dXJlXG5cblxuICAgIGZlYXR1cmVJbmRleCsrO1xuICB9XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBnZW9tUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgZ2VvbVJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtHZW9tZXRyeX0gY3VycmVudEdlb21ldHJ5IFRoZSBjdXJyZW50IEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtPYmplY3R9IGZlYXR1cmVQcm9wZXJ0aWVzIFRoZSBjdXJyZW50IEZlYXR1cmUgUHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGZlYXR1cmVCQm94IFRoZSBjdXJyZW50IEZlYXR1cmUgQkJveCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGZlYXR1cmVJZCBUaGUgY3VycmVudCBGZWF0dXJlIElkIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBnZW9tZXRyeSBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkucmVkdWNlKCkuXG4gKlxuICogQG5hbWUgZ2VvbVJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudEdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmdlb21SZWR1Y2UoZmVhdHVyZXMsIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50R2VvbWV0cnksIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50R2VvbWV0cnlcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPWZlYXR1cmVQcm9wZXJ0aWVzXG4gKiAgIC8vPWZlYXR1cmVCQm94XG4gKiAgIC8vPWZlYXR1cmVJZFxuICogICByZXR1cm4gY3VycmVudEdlb21ldHJ5XG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGdlb21SZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgZ2VvbUVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRHZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50R2VvbWV0cnk7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudEdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgZmxhdHRlbkVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgZmxhdHRlbkVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtGZWF0dXJlfSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBmbGF0dGVuZWQgZmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZmxhdHRlbmVkIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0b1xuICogQXJyYXkuZm9yRWFjaC5cbiAqXG4gKiBAbmFtZSBmbGF0dGVuRWFjaFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpXG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgICB0dXJmLm11bHRpUG9pbnQoW1s0MCwgMzBdLCBbMzYsIDUzXV0sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmZsYXR0ZW5FYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpIHtcbiAqICAgLy89Y3VycmVudEZlYXR1cmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5FYWNoKGdlb2pzb24sIGNhbGxiYWNrKSB7XG4gIGdlb21FYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChnZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBwcm9wZXJ0aWVzLCBiYm94LCBpZCkge1xuICAgIC8vIENhbGxiYWNrIGZvciBzaW5nbGUgZ2VvbWV0cnlcbiAgICB2YXIgdHlwZSA9IGdlb21ldHJ5ID09PSBudWxsID8gbnVsbCA6IGdlb21ldHJ5LnR5cGU7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgbnVsbDpcbiAgICAgIGNhc2UgXCJQb2ludFwiOlxuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgIGlmIChjYWxsYmFjayhmZWF0dXJlKGdlb21ldHJ5LCBwcm9wZXJ0aWVzLCB7XG4gICAgICAgICAgYmJveDogYmJveCxcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSksIGZlYXR1cmVJbmRleCwgMCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZ2VvbVR5cGU7IC8vIENhbGxiYWNrIGZvciBtdWx0aS1nZW9tZXRyeVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgICBnZW9tVHlwZSA9IFwiUG9pbnRcIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgICAgZ2VvbVR5cGUgPSBcIkxpbmVTdHJpbmdcIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgICAgZ2VvbVR5cGUgPSBcIlBvbHlnb25cIjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgbXVsdGlGZWF0dXJlSW5kZXggPSAwOyBtdWx0aUZlYXR1cmVJbmRleCA8IGdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aDsgbXVsdGlGZWF0dXJlSW5kZXgrKykge1xuICAgICAgdmFyIGNvb3JkaW5hdGUgPSBnZW9tZXRyeS5jb29yZGluYXRlc1ttdWx0aUZlYXR1cmVJbmRleF07XG4gICAgICB2YXIgZ2VvbSA9IHtcbiAgICAgICAgdHlwZTogZ2VvbVR5cGUsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlXG4gICAgICB9O1xuICAgICAgaWYgKGNhbGxiYWNrKGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcyksIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBmbGF0dGVuUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgZmxhdHRlblJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtGZWF0dXJlfSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBmbGF0dGVuZWQgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LnJlZHVjZSgpLlxuICpcbiAqIEBuYW1lIGZsYXR0ZW5SZWR1Y2VcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYubXVsdGlQb2ludChbWzQwLCAzMF0sIFszNiwgNTNdXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZmxhdHRlblJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudEZlYXR1cmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50RmVhdHVyZVxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBmbGF0dGVuUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGZsYXR0ZW5FYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgbXVsdGlGZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50RmVhdHVyZTtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCk7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIHNlZ21lbnRFYWNoXG4gKlxuICogQGNhbGxiYWNrIHNlZ21lbnRFYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudFNlZ21lbnQgVGhlIGN1cnJlbnQgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnRJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciAyLXZlcnRleCBsaW5lIHNlZ21lbnQgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LmZvckVhY2goKVxuICogKE11bHRpKVBvaW50IGdlb21ldHJpZXMgZG8gbm90IGNvbnRhaW4gc2VnbWVudHMgdGhlcmVmb3JlIHRoZXkgYXJlIGlnbm9yZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudFNlZ21lbnQsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgsIHNlZ21lbnRJbmRleClcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFtbWy01MCwgNV0sIFstNDAsIC0xMF0sIFstNTAsIC0xMF0sIFstNDAsIDVdLCBbLTUwLCA1XV1dKTtcbiAqXG4gKiAvLyBJdGVyYXRlIG92ZXIgR2VvSlNPTiBieSAyLXZlcnRleCBzZWdtZW50c1xuICogdHVyZi5zZWdtZW50RWFjaChwb2x5Z29uLCBmdW5jdGlvbiAoY3VycmVudFNlZ21lbnQsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgsIHNlZ21lbnRJbmRleCkge1xuICogICAvLz1jdXJyZW50U2VnbWVudFxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgLy89bXVsdGlGZWF0dXJlSW5kZXhcbiAqICAgLy89Z2VvbWV0cnlJbmRleFxuICogICAvLz1zZWdtZW50SW5kZXhcbiAqIH0pO1xuICpcbiAqIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzXG4gKiB2YXIgdG90YWwgPSAwO1xuICogdHVyZi5zZWdtZW50RWFjaChwb2x5Z29uLCBmdW5jdGlvbiAoKSB7XG4gKiAgICAgdG90YWwrKztcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gc2VnbWVudEVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgZmxhdHRlbkVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpIHtcbiAgICB2YXIgc2VnbWVudEluZGV4ID0gMDsgLy8gRXhjbHVkZSBudWxsIEdlb21ldHJpZXNcblxuICAgIGlmICghZmVhdHVyZS5nZW9tZXRyeSkgcmV0dXJuOyAvLyAoTXVsdGkpUG9pbnQgZ2VvbWV0cmllcyBkbyBub3QgY29udGFpbiBzZWdtZW50cyB0aGVyZWZvcmUgdGhleSBhcmUgaWdub3JlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uXG5cbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gXCJQb2ludFwiIHx8IHR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSByZXR1cm47IC8vIEdlbmVyYXRlIDItdmVydGV4IGxpbmUgc2VnbWVudHNcblxuICAgIHZhciBwcmV2aW91c0Nvb3JkcztcbiAgICB2YXIgcHJldmlvdXNGZWF0dXJlSW5kZXggPSAwO1xuICAgIHZhciBwcmV2aW91c011bHRpSW5kZXggPSAwO1xuICAgIHZhciBwcmV2R2VvbUluZGV4ID0gMDtcbiAgICBpZiAoY29vcmRFYWNoKGZlYXR1cmUsIGZ1bmN0aW9uIChjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleENvb3JkLCBtdWx0aVBhcnRJbmRleENvb3JkLCBnZW9tZXRyeUluZGV4KSB7XG4gICAgICAvLyBTaW11bGF0aW5nIGEgbWV0YS5jb29yZFJlZHVjZSgpIHNpbmNlIGByZWR1Y2VgIG9wZXJhdGlvbnMgY2Fubm90IGJlIHN0b3BwZWQgYnkgcmV0dXJuaW5nIGBmYWxzZWBcbiAgICAgIGlmIChwcmV2aW91c0Nvb3JkcyA9PT0gdW5kZWZpbmVkIHx8IGZlYXR1cmVJbmRleCA+IHByZXZpb3VzRmVhdHVyZUluZGV4IHx8IG11bHRpUGFydEluZGV4Q29vcmQgPiBwcmV2aW91c011bHRpSW5kZXggfHwgZ2VvbWV0cnlJbmRleCA+IHByZXZHZW9tSW5kZXgpIHtcbiAgICAgICAgcHJldmlvdXNDb29yZHMgPSBjdXJyZW50Q29vcmQ7XG4gICAgICAgIHByZXZpb3VzRmVhdHVyZUluZGV4ID0gZmVhdHVyZUluZGV4O1xuICAgICAgICBwcmV2aW91c011bHRpSW5kZXggPSBtdWx0aVBhcnRJbmRleENvb3JkO1xuICAgICAgICBwcmV2R2VvbUluZGV4ID0gZ2VvbWV0cnlJbmRleDtcbiAgICAgICAgc2VnbWVudEluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VycmVudFNlZ21lbnQgPSBsaW5lU3RyaW5nKFtwcmV2aW91c0Nvb3JkcywgY3VycmVudENvb3JkXSwgZmVhdHVyZS5wcm9wZXJ0aWVzKTtcbiAgICAgIGlmIChjYWxsYmFjayhjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZ21lbnRJbmRleCsrO1xuICAgICAgcHJldmlvdXNDb29yZHMgPSBjdXJyZW50Q29vcmQ7XG4gICAgfSkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIH0pO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3Igc2VnbWVudFJlZHVjZVxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzIGRlcGVuZFxuICogb24gd2hldGhlciB0aGUgcmVkdWNlIG1ldGhvZCBoYXMgYW4gaW5pdGlhbFZhbHVlIGFyZ3VtZW50LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCB0byB0aGUgcmVkdWNlIG1ldGhvZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIGluaXRpYWxWYWx1ZS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBub3QgcHJvdmlkZWQ6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogQGNhbGxiYWNrIHNlZ21lbnRSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudFNlZ21lbnQgVGhlIGN1cnJlbnQgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnRJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgU2VnbWVudCBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBSZWR1Y2UgMi12ZXJ0ZXggbGluZSBzZWdtZW50IGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKVxuICogKE11bHRpKVBvaW50IGdlb21ldHJpZXMgZG8gbm90IGNvbnRhaW4gc2VnbWVudHMgdGhlcmVmb3JlIHRoZXkgYXJlIGlnbm9yZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudFNlZ21lbnQsIGN1cnJlbnRJbmRleClcbiAqIEBwYXJhbSB7Kn0gW2luaXRpYWxWYWx1ZV0gVmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9seWdvbiA9IHR1cmYucG9seWdvbihbW1stNTAsIDVdLCBbLTQwLCAtMTBdLCBbLTUwLCAtMTBdLCBbLTQwLCA1XSwgWy01MCwgNV1dXSk7XG4gKlxuICogLy8gSXRlcmF0ZSBvdmVyIEdlb0pTT04gYnkgMi12ZXJ0ZXggc2VnbWVudHNcbiAqIHR1cmYuc2VnbWVudFJlZHVjZShwb2x5Z29uLCBmdW5jdGlvbiAocHJldmlvdXNTZWdtZW50LCBjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSB7XG4gKiAgIC8vPSBwcmV2aW91c1NlZ21lbnRcbiAqICAgLy89IGN1cnJlbnRTZWdtZW50XG4gKiAgIC8vPSBmZWF0dXJlSW5kZXhcbiAqICAgLy89IG11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPSBnZW9tZXRyeUluZGV4XG4gKiAgIC8vPSBzZWdtZW50SW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRTZWdtZW50XG4gKiB9KTtcbiAqXG4gKiAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50c1xuICogdmFyIGluaXRpYWxWYWx1ZSA9IDBcbiAqIHZhciB0b3RhbCA9IHR1cmYuc2VnbWVudFJlZHVjZShwb2x5Z29uLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSkge1xuICogICAgIHByZXZpb3VzVmFsdWUrKztcbiAqICAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbiAqIH0sIGluaXRpYWxWYWx1ZSk7XG4gKi9cblxuXG5mdW5jdGlvbiBzZWdtZW50UmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIHZhciBzdGFydGVkID0gZmFsc2U7XG4gIHNlZ21lbnRFYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSB7XG4gICAgaWYgKHN0YXJ0ZWQgPT09IGZhbHNlICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSBwcmV2aW91c1ZhbHVlID0gY3VycmVudFNlZ21lbnQ7ZWxzZSBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudFNlZ21lbnQsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgsIHNlZ21lbnRJbmRleCk7XG4gICAgc3RhcnRlZCA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGxpbmVFYWNoXG4gKlxuICogQGNhbGxiYWNrIGxpbmVFYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudExpbmUgVGhlIGN1cnJlbnQgTGluZVN0cmluZ3xMaW5lYXJSaW5nIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWRcbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBsaW5lIG9yIHJpbmcgY29vcmRpbmF0ZXMgaW4gTGluZVN0cmluZywgUG9seWdvbiwgTXVsdGlMaW5lU3RyaW5nLCBNdWx0aVBvbHlnb24gRmVhdHVyZXMgb3IgR2VvbWV0cmllcyxcbiAqIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaC5cbiAqXG4gKiBAbmFtZSBsaW5lRWFjaFxuICogQHBhcmFtIHtHZW9tZXRyeXxGZWF0dXJlPExpbmVTdHJpbmd8UG9seWdvbnxNdWx0aUxpbmVTdHJpbmd8TXVsdGlQb2x5Z29uPn0gZ2VvanNvbiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRMaW5lLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KVxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbXG4gKiAgIFtbMjYsIDM3XSwgWzM1LCA0NV1dLFxuICogICBbWzM2LCA1M10sIFszOCwgNTBdLCBbNDEsIDU1XV1cbiAqIF0pO1xuICpcbiAqIHR1cmYubGluZUVhY2gobXVsdGlMaW5lLCBmdW5jdGlvbiAoY3VycmVudExpbmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpIHtcbiAqICAgLy89Y3VycmVudExpbmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPWdlb21ldHJ5SW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gbGluZUVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgLy8gdmFsaWRhdGlvblxuICBpZiAoIWdlb2pzb24pIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgcmVxdWlyZWRcIik7XG4gIGZsYXR0ZW5FYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChmZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KSB7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT09IG51bGwpIHJldHVybjtcbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICB2YXIgY29vcmRzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgICAgaWYgKGNhbGxiYWNrKGZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIDAsIDApID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgZm9yICh2YXIgZ2VvbWV0cnlJbmRleCA9IDA7IGdlb21ldHJ5SW5kZXggPCBjb29yZHMubGVuZ3RoOyBnZW9tZXRyeUluZGV4KyspIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sobGluZVN0cmluZyhjb29yZHNbZ2VvbWV0cnlJbmRleF0sIGZlYXR1cmUucHJvcGVydGllcyksIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGxpbmVSZWR1Y2VcbiAqXG4gKiBUaGUgZmlyc3QgdGltZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgdmFsdWVzIHByb3ZpZGVkIGFzIGFyZ3VtZW50cyBkZXBlbmRcbiAqIG9uIHdoZXRoZXIgdGhlIHJlZHVjZSBtZXRob2QgaGFzIGFuIGluaXRpYWxWYWx1ZSBhcmd1bWVudC5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQgdG8gdGhlIHJlZHVjZSBtZXRob2Q6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyBpbml0aWFsVmFsdWUuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgbm90IHByb3ZpZGVkOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIEBjYWxsYmFjayBsaW5lUmVkdWNlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gcHJldmlvdXNWYWx1ZSBUaGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uXG4gKiBvZiB0aGUgY2FsbGJhY2ssIG9yIGluaXRpYWxWYWx1ZSwgaWYgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0ZlYXR1cmU8TGluZVN0cmluZz59IGN1cnJlbnRMaW5lIFRoZSBjdXJyZW50IExpbmVTdHJpbmd8TGluZWFyUmluZyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZFxuICovXG5cbi8qKlxuICogUmVkdWNlIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKS5cbiAqXG4gKiBAbmFtZSBsaW5lUmVkdWNlXG4gKiBAcGFyYW0ge0dlb21ldHJ5fEZlYXR1cmU8TGluZVN0cmluZ3xQb2x5Z29ufE11bHRpTGluZVN0cmluZ3xNdWx0aVBvbHlnb24+fSBnZW9qc29uIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudExpbmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpXG4gKiBAcGFyYW0geyp9IFtpbml0aWFsVmFsdWVdIFZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aVBvbHkgPSB0dXJmLm11bHRpUG9seWdvbihbXG4gKiAgIHR1cmYucG9seWdvbihbW1sxMiw0OF0sWzIsNDFdLFsyNCwzOF0sWzEyLDQ4XV0sIFtbOSw0NF0sWzEzLDQxXSxbMTMsNDVdLFs5LDQ0XV1dKSxcbiAqICAgdHVyZi5wb2x5Z29uKFtbWzUsIDVdLCBbMCwgMF0sIFsyLCAyXSwgWzQsIDRdLCBbNSwgNV1dXSlcbiAqIF0pO1xuICpcbiAqIHR1cmYubGluZVJlZHVjZShtdWx0aVBvbHksIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRMaW5lXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50TGluZVxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBsaW5lUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGxpbmVFYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50TGluZTtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCk7XG4gIH0pO1xuICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbi8qKlxuICogRmluZHMgYSBwYXJ0aWN1bGFyIDItdmVydGV4IExpbmVTdHJpbmcgU2VnbWVudCBmcm9tIGEgR2VvSlNPTiB1c2luZyBgQHR1cmYvbWV0YWAgaW5kZXhlcy5cbiAqXG4gKiBOZWdhdGl2ZSBpbmRleGVzIGFyZSBwZXJtaXR0ZWQuXG4gKiBQb2ludCAmIE11bHRpUG9pbnQgd2lsbCBhbHdheXMgcmV0dXJuIG51bGwuXG4gKlxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIEFueSBHZW9KU09OIEZlYXR1cmUgb3IgR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmZlYXR1cmVJbmRleD0wXSBGZWF0dXJlIEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubXVsdGlGZWF0dXJlSW5kZXg9MF0gTXVsdGktRmVhdHVyZSBJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmdlb21ldHJ5SW5kZXg9MF0gR2VvbWV0cnkgSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zZWdtZW50SW5kZXg9MF0gU2VnbWVudCBJbmRleFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb3BlcnRpZXM9e31dIFRyYW5zbGF0ZSBQcm9wZXJ0aWVzIHRvIG91dHB1dCBMaW5lU3RyaW5nXG4gKiBAcGFyYW0ge0JCb3h9IFtvcHRpb25zLmJib3g9e31dIFRyYW5zbGF0ZSBCQm94IHRvIG91dHB1dCBMaW5lU3RyaW5nXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtvcHRpb25zLmlkPXt9XSBUcmFuc2xhdGUgSWQgdG8gb3V0cHV0IExpbmVTdHJpbmdcbiAqIEByZXR1cm5zIHtGZWF0dXJlPExpbmVTdHJpbmc+fSAyLXZlcnRleCBHZW9KU09OIEZlYXR1cmUgTGluZVN0cmluZ1xuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbXG4gKiAgICAgW1sxMCwgMTBdLCBbNTAsIDMwXSwgWzMwLCA0MF1dLFxuICogICAgIFtbLTEwLCAtMTBdLCBbLTUwLCAtMzBdLCBbLTMwLCAtNDBdXVxuICogXSk7XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCAoZGVmYXVsdHMgYXJlIDApXG4gKiB0dXJmLmZpbmRTZWdtZW50KG11bHRpTGluZSk7XG4gKiAvLyA9PiBGZWF0dXJlPExpbmVTdHJpbmc8W1sxMCwgMTBdLCBbNTAsIDMwXV0+PlxuICpcbiAqIC8vIEZpcnN0IFNlZ21lbnQgb2YgMm5kIE11bHRpIEZlYXR1cmVcbiAqIHR1cmYuZmluZFNlZ21lbnQobXVsdGlMaW5lLCB7bXVsdGlGZWF0dXJlSW5kZXg6IDF9KTtcbiAqIC8vID0+IEZlYXR1cmU8TGluZVN0cmluZzxbWy0xMCwgLTEwXSwgWy01MCwgLTMwXV0+PlxuICpcbiAqIC8vIExhc3QgU2VnbWVudCBvZiBMYXN0IE11bHRpIEZlYXR1cmVcbiAqIHR1cmYuZmluZFNlZ21lbnQobXVsdGlMaW5lLCB7bXVsdGlGZWF0dXJlSW5kZXg6IC0xLCBzZWdtZW50SW5kZXg6IC0xfSk7XG4gKiAvLyA9PiBGZWF0dXJlPExpbmVTdHJpbmc8W1stNTAsIC0zMF0sIFstMzAsIC00MF1dPj5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRTZWdtZW50KGdlb2pzb24sIG9wdGlvbnMpIHtcbiAgLy8gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFpc09iamVjdChvcHRpb25zKSkgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBpcyBpbnZhbGlkXCIpO1xuICB2YXIgZmVhdHVyZUluZGV4ID0gb3B0aW9ucy5mZWF0dXJlSW5kZXggfHwgMDtcbiAgdmFyIG11bHRpRmVhdHVyZUluZGV4ID0gb3B0aW9ucy5tdWx0aUZlYXR1cmVJbmRleCB8fCAwO1xuICB2YXIgZ2VvbWV0cnlJbmRleCA9IG9wdGlvbnMuZ2VvbWV0cnlJbmRleCB8fCAwO1xuICB2YXIgc2VnbWVudEluZGV4ID0gb3B0aW9ucy5zZWdtZW50SW5kZXggfHwgMDsgLy8gRmluZCBGZWF0dXJlSW5kZXhcblxuICB2YXIgcHJvcGVydGllcyA9IG9wdGlvbnMucHJvcGVydGllcztcbiAgdmFyIGdlb21ldHJ5O1xuXG4gIHN3aXRjaCAoZ2VvanNvbi50eXBlKSB7XG4gICAgY2FzZSBcIkZlYXR1cmVDb2xsZWN0aW9uXCI6XG4gICAgICBpZiAoZmVhdHVyZUluZGV4IDwgMCkgZmVhdHVyZUluZGV4ID0gZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGggKyBmZWF0dXJlSW5kZXg7XG4gICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCBnZW9qc29uLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF0ucHJvcGVydGllcztcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbi5mZWF0dXJlc1tmZWF0dXJlSW5kZXhdLmdlb21ldHJ5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmVhdHVyZVwiOlxuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwgZ2VvanNvbi5wcm9wZXJ0aWVzO1xuICAgICAgZ2VvbWV0cnkgPSBnZW9qc29uLmdlb21ldHJ5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbjtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgaW52YWxpZFwiKTtcbiAgfSAvLyBGaW5kIFNlZ21lbnRJbmRleFxuXG5cbiAgaWYgKGdlb21ldHJ5ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNvb3JkcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuXG4gIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xuICAgIGNhc2UgXCJQb2ludFwiOlxuICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICBpZiAoc2VnbWVudEluZGV4IDwgMCkgc2VnbWVudEluZGV4ID0gY29vcmRzLmxlbmd0aCArIHNlZ21lbnRJbmRleCAtIDE7XG4gICAgICByZXR1cm4gbGluZVN0cmluZyhbY29vcmRzW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1tzZWdtZW50SW5kZXggKyAxXV0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgIGlmIChnZW9tZXRyeUluZGV4IDwgMCkgZ2VvbWV0cnlJbmRleCA9IGNvb3Jkcy5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IDApIHNlZ21lbnRJbmRleCA9IGNvb3Jkc1tnZW9tZXRyeUluZGV4XS5sZW5ndGggKyBzZWdtZW50SW5kZXggLSAxO1xuICAgICAgcmV0dXJuIGxpbmVTdHJpbmcoW2Nvb3Jkc1tnZW9tZXRyeUluZGV4XVtzZWdtZW50SW5kZXhdLCBjb29yZHNbZ2VvbWV0cnlJbmRleF1bc2VnbWVudEluZGV4ICsgMV1dLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IDApIHNlZ21lbnRJbmRleCA9IGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF0ubGVuZ3RoICsgc2VnbWVudEluZGV4IC0gMTtcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKFtjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bc2VnbWVudEluZGV4ICsgMV1dLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKGdlb21ldHJ5SW5kZXggPCAwKSBnZW9tZXRyeUluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XS5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IDApIHNlZ21lbnRJbmRleCA9IGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF0ubGVuZ3RoIC0gc2VnbWVudEluZGV4IC0gMTtcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKFtjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW2dlb21ldHJ5SW5kZXhdW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF1bc2VnbWVudEluZGV4ICsgMV1dLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgaW52YWxpZFwiKTtcbn1cbi8qKlxuICogRmluZHMgYSBwYXJ0aWN1bGFyIFBvaW50IGZyb20gYSBHZW9KU09OIHVzaW5nIGBAdHVyZi9tZXRhYCBpbmRleGVzLlxuICpcbiAqIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBlcm1pdHRlZC5cbiAqXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gQW55IEdlb0pTT04gRmVhdHVyZSBvciBHZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZmVhdHVyZUluZGV4PTBdIEZlYXR1cmUgSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tdWx0aUZlYXR1cmVJbmRleD0wXSBNdWx0aS1GZWF0dXJlIEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZ2VvbWV0cnlJbmRleD0wXSBHZW9tZXRyeSBJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNvb3JkSW5kZXg9MF0gQ29vcmQgSW5kZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcm9wZXJ0aWVzPXt9XSBUcmFuc2xhdGUgUHJvcGVydGllcyB0byBvdXRwdXQgUG9pbnRcbiAqIEBwYXJhbSB7QkJveH0gW29wdGlvbnMuYmJveD17fV0gVHJhbnNsYXRlIEJCb3ggdG8gb3V0cHV0IFBvaW50XG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtvcHRpb25zLmlkPXt9XSBUcmFuc2xhdGUgSWQgdG8gb3V0cHV0IFBvaW50XG4gKiBAcmV0dXJucyB7RmVhdHVyZTxQb2ludD59IDItdmVydGV4IEdlb0pTT04gRmVhdHVyZSBQb2ludFxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbXG4gKiAgICAgW1sxMCwgMTBdLCBbNTAsIDMwXSwgWzMwLCA0MF1dLFxuICogICAgIFtbLTEwLCAtMTBdLCBbLTUwLCAtMzBdLCBbLTMwLCAtNDBdXVxuICogXSk7XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCAoZGVmYXVsdHMgYXJlIDApXG4gKiB0dXJmLmZpbmRQb2ludChtdWx0aUxpbmUpO1xuICogLy8gPT4gRmVhdHVyZTxQb2ludDxbMTAsIDEwXT4+XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCBvZiB0aGUgMm5kIE11bHRpLUZlYXR1cmVcbiAqIHR1cmYuZmluZFBvaW50KG11bHRpTGluZSwge211bHRpRmVhdHVyZUluZGV4OiAxfSk7XG4gKiAvLyA9PiBGZWF0dXJlPFBvaW50PFstMTAsIC0xMF0+PlxuICpcbiAqIC8vIExhc3QgU2VnbWVudCBvZiBsYXN0IE11bHRpLUZlYXR1cmVcbiAqIHR1cmYuZmluZFBvaW50KG11bHRpTGluZSwge211bHRpRmVhdHVyZUluZGV4OiAtMSwgY29vcmRJbmRleDogLTF9KTtcbiAqIC8vID0+IEZlYXR1cmU8UG9pbnQ8Wy0zMCwgLTQwXT4+XG4gKi9cblxuXG5mdW5jdGlvbiBmaW5kUG9pbnQoZ2VvanNvbiwgb3B0aW9ucykge1xuICAvLyBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGlzIGludmFsaWRcIik7XG4gIHZhciBmZWF0dXJlSW5kZXggPSBvcHRpb25zLmZlYXR1cmVJbmRleCB8fCAwO1xuICB2YXIgbXVsdGlGZWF0dXJlSW5kZXggPSBvcHRpb25zLm11bHRpRmVhdHVyZUluZGV4IHx8IDA7XG4gIHZhciBnZW9tZXRyeUluZGV4ID0gb3B0aW9ucy5nZW9tZXRyeUluZGV4IHx8IDA7XG4gIHZhciBjb29yZEluZGV4ID0gb3B0aW9ucy5jb29yZEluZGV4IHx8IDA7IC8vIEZpbmQgRmVhdHVyZUluZGV4XG5cbiAgdmFyIHByb3BlcnRpZXMgPSBvcHRpb25zLnByb3BlcnRpZXM7XG4gIHZhciBnZW9tZXRyeTtcblxuICBzd2l0Y2ggKGdlb2pzb24udHlwZSkge1xuICAgIGNhc2UgXCJGZWF0dXJlQ29sbGVjdGlvblwiOlxuICAgICAgaWYgKGZlYXR1cmVJbmRleCA8IDApIGZlYXR1cmVJbmRleCA9IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoICsgZmVhdHVyZUluZGV4O1xuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwgZ2VvanNvbi5mZWF0dXJlc1tmZWF0dXJlSW5kZXhdLnByb3BlcnRpZXM7XG4gICAgICBnZW9tZXRyeSA9IGdlb2pzb24uZmVhdHVyZXNbZmVhdHVyZUluZGV4XS5nZW9tZXRyeTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZlYXR1cmVcIjpcbiAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IGdlb2pzb24ucHJvcGVydGllcztcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbi5nZW9tZXRyeTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlBvaW50XCI6XG4gICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICBjYXNlIFwiUG9seWdvblwiOlxuICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICBnZW9tZXRyeSA9IGdlb2pzb247XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnZW9qc29uIGlzIGludmFsaWRcIik7XG4gIH0gLy8gRmluZCBDb29yZCBJbmRleFxuXG5cbiAgaWYgKGdlb21ldHJ5ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNvb3JkcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuXG4gIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xuICAgIGNhc2UgXCJQb2ludFwiOlxuICAgICAgcmV0dXJuIHBvaW50KGNvb3JkcywgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgaWYgKG11bHRpRmVhdHVyZUluZGV4IDwgMCkgbXVsdGlGZWF0dXJlSW5kZXggPSBjb29yZHMubGVuZ3RoICsgbXVsdGlGZWF0dXJlSW5kZXg7XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzW211bHRpRmVhdHVyZUluZGV4XSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgaWYgKGNvb3JkSW5kZXggPCAwKSBjb29yZEluZGV4ID0gY29vcmRzLmxlbmd0aCArIGNvb3JkSW5kZXg7XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzW2Nvb3JkSW5kZXhdLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICBpZiAoZ2VvbWV0cnlJbmRleCA8IDApIGdlb21ldHJ5SW5kZXggPSBjb29yZHMubGVuZ3RoICsgZ2VvbWV0cnlJbmRleDtcbiAgICAgIGlmIChjb29yZEluZGV4IDwgMCkgY29vcmRJbmRleCA9IGNvb3Jkc1tnZW9tZXRyeUluZGV4XS5sZW5ndGggKyBjb29yZEluZGV4O1xuICAgICAgcmV0dXJuIHBvaW50KGNvb3Jkc1tnZW9tZXRyeUluZGV4XVtjb29yZEluZGV4XSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6XG4gICAgICBpZiAobXVsdGlGZWF0dXJlSW5kZXggPCAwKSBtdWx0aUZlYXR1cmVJbmRleCA9IGNvb3Jkcy5sZW5ndGggKyBtdWx0aUZlYXR1cmVJbmRleDtcbiAgICAgIGlmIChjb29yZEluZGV4IDwgMCkgY29vcmRJbmRleCA9IGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF0ubGVuZ3RoICsgY29vcmRJbmRleDtcbiAgICAgIHJldHVybiBwb2ludChjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW2Nvb3JkSW5kZXhdLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKGdlb21ldHJ5SW5kZXggPCAwKSBnZW9tZXRyeUluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XS5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKGNvb3JkSW5kZXggPCAwKSBjb29yZEluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XVtnZW9tZXRyeUluZGV4XS5sZW5ndGggLSBjb29yZEluZGV4O1xuICAgICAgcmV0dXJuIHBvaW50KGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF1bY29vcmRJbmRleF0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiZ2VvanNvbiBpcyBpbnZhbGlkXCIpO1xufVxuXG5leHBvcnQgeyBjb29yZEFsbCwgY29vcmRFYWNoLCBjb29yZFJlZHVjZSwgZmVhdHVyZUVhY2gsIGZlYXR1cmVSZWR1Y2UsIGZpbmRQb2ludCwgZmluZFNlZ21lbnQsIGZsYXR0ZW5FYWNoLCBmbGF0dGVuUmVkdWNlLCBnZW9tRWFjaCwgZ2VvbVJlZHVjZSwgbGluZUVhY2gsIGxpbmVSZWR1Y2UsIHByb3BFYWNoLCBwcm9wUmVkdWNlLCBzZWdtZW50RWFjaCwgc2VnbWVudFJlZHVjZSB9OyIsImltcG9ydCB7IGNvb3JkRWFjaCB9IGZyb20gXCJAdHVyZi9tZXRhXCI7XG4vKipcbiAqIFRha2VzIGEgc2V0IG9mIGZlYXR1cmVzLCBjYWxjdWxhdGVzIHRoZSBiYm94IG9mIGFsbCBpbnB1dCBmZWF0dXJlcywgYW5kIHJldHVybnMgYSBib3VuZGluZyBib3guXG4gKlxuICogQG5hbWUgYmJveFxuICogQHBhcmFtIHtHZW9KU09OfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHJldHVybnMge0JCb3h9IGJib3ggZXh0ZW50IGluIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBvcmRlclxuICogQGV4YW1wbGVcbiAqIHZhciBsaW5lID0gdHVyZi5saW5lU3RyaW5nKFtbLTc0LCA0MF0sIFstNzgsIDQyXSwgWy04MiwgMzVdXSk7XG4gKiB2YXIgYmJveCA9IHR1cmYuYmJveChsaW5lKTtcbiAqIHZhciBiYm94UG9seWdvbiA9IHR1cmYuYmJveFBvbHlnb24oYmJveCk7XG4gKlxuICogLy9hZGRUb01hcFxuICogdmFyIGFkZFRvTWFwID0gW2xpbmUsIGJib3hQb2x5Z29uXVxuICovXG5cbmZ1bmN0aW9uIGJib3goZ2VvanNvbikge1xuICB2YXIgcmVzdWx0ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICBjb29yZEVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGNvb3JkKSB7XG4gICAgaWYgKHJlc3VsdFswXSA+IGNvb3JkWzBdKSB7XG4gICAgICByZXN1bHRbMF0gPSBjb29yZFswXTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0WzFdID4gY29vcmRbMV0pIHtcbiAgICAgIHJlc3VsdFsxXSA9IGNvb3JkWzFdO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRbMl0gPCBjb29yZFswXSkge1xuICAgICAgcmVzdWx0WzJdID0gY29vcmRbMF07XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdFszXSA8IGNvb3JkWzFdKSB7XG4gICAgICByZXN1bHRbM10gPSBjb29yZFsxXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5iYm94W1wiZGVmYXVsdFwiXSA9IGJib3g7XG5leHBvcnQgZGVmYXVsdCBiYm94OyIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIHRlcnJpdG9yeUZvY3VzQnV0dG9uID0gXCJ0ZXJyaXRvcnlGb2N1c0NvbnRyb2wtbW9kdWxlLS10ZXJyaXRvcnlGb2N1c0J1dHRvbi0tM3dXb1ZcIjtcbmV4cG9ydCB2YXIgdGVycml0b3J5Rm9jdXNDb250YWluZXIgPSBcInRlcnJpdG9yeUZvY3VzQ29udHJvbC1tb2R1bGUtLXRlcnJpdG9yeUZvY3VzQ29udGFpbmVyLS0zTjBYTVwiOyIsImltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCBSZWFjdCwge01vdXNlRXZlbnRIYW5kbGVyfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge191c2VNYXBDb250cm9sIGFzIHVzZU1hcENvbnRyb2x9IGZyb20gJ3JlYWN0LW1hcC1nbCc7XG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi90ZXJyaXRvcnlGb2N1c0NvbnRyb2wubW9kdWxlLnNjc3MnO1xuXG5pbnRlcmZhY2UgSVRlcnJpdG9yeUZvY3VzQ29udHJvbCB7XG4gIG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbiA6IE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxCdXR0b25FbGVtZW50Pjtcbn1cblxuY29uc3QgVGVycml0b3J5Rm9jdXNDb250cm9sID0gKHtvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b259IDogSVRlcnJpdG9yeUZvY3VzQ29udHJvbCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIGNvbnN0IHtjb250YWluZXJSZWZ9ID0gdXNlTWFwQ29udHJvbCh7XG4gICAgLy8gQHRzLWlnbm9yZSAvLyBUeXBlcyBoYXZlIG5vdCBjYXVnaHQgdXAgeWV0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2dsL3JlYWN0LW1hcC1nbC9pc3N1ZXMvMTQ5MlxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbixcbiAgfSk7XG5cbiAgY29uc3QgdGVycml0b3JpZXMgPSBbXG4gICAge1xuICAgICAgc2hvcnQ6IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5sb3dlcjQ4LnNob3J0JyxcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnNDgnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgYWJicmV2aWF0ZWQgbmFtZSBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgdGhlIExvd2VyIDQ4IHN0YXRlcycsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgICBsb25nOiBpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMubG93ZXI0OC5sb25nJyxcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTG93ZXIgNDgnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbG9uZ2VyIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIHRoZSBMb3dlciA0OCBzdGF0ZXMnLFxuICAgICAgICAgIH0sXG4gICAgICApLFxuICAgIH0sXG4gICAge1xuICAgICAgc2hvcnQ6IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5hbGFza2Euc2hvcnQnLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdBSycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBhYmJyZXZpYXRlZCBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgQWxhc2thJyxcbiAgICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIGxvbmc6IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5hbGFza2EubG9uZycsXG4gICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0FsYXNrYScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdWxsIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEFsYXNrYScsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICB7XG4gICAgICBzaG9ydDogaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLmhhd2FpaS5zaG9ydCcsXG4gICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0hJJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFiYnJldmlhdGVkIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEhhd2FpaScsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgICBsb25nOiBpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMuaGF3YWlpLmxvbmcnLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdIYXdhaWknLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbG9uZ2VyIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEhhd2FpaScsXG4gICAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICB7XG4gICAgICBzaG9ydDogaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLnB1ZXJ0b19yaWNvLnNob3J0JyxcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnUFInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgYWJicmV2aWF0ZWQgbmFtZSBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgUHVlcnRvIFJpY28nLFxuICAgICAgICAgIH0sXG4gICAgICApLFxuICAgICAgbG9uZzogaW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLnB1ZXJ0b19yaWNvLmxvbmcnLFxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQdWVydG8gUmljbycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdWxsIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIFB1ZXJ0byBSaWNvJyxcbiAgICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9LFxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e2NvbnRhaW5lclJlZn0gY2xhc3NOYW1lPXtzdHlsZXMudGVycml0b3J5Rm9jdXNDb250YWluZXJ9PlxuICAgICAge3RlcnJpdG9yaWVzLm1hcCgodGVycml0b3J5KSA9PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgaWQ9e3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgICBrZXk9e3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b259XG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMudGVycml0b3J5Rm9jdXNCdXR0b259XG4gICAgICAgICAgYXJpYS1sYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMuZm9jdXNPbicsXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGb2N1cyBvbiB7dGVycml0b3J5fScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdGb2N1cyBvbiB0aGUgYm91bmRzIG9mIGEgc3BlY2lmaWMgdGVycml0b3J5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRlcnJpdG9yeTogdGVycml0b3J5LmxvbmcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgKX0+XG4gICAgICAgICAge3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgPC9idXR0b24+LFxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRlcnJpdG9yeUZvY3VzQ29udHJvbDtcblxuIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJR1Z1WVdKc1pTMWlZV05yWjNKdmRXNWtQU0p1WlhjZ01DQXdJREkwSURJMElpQm9aV2xuYUhROUlqSTBJaUIyYVdWM1FtOTRQU0l3SURBZ01qUWdNalFpSUhkcFpIUm9QU0l5TkNJK1BHYytQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BDOW5QanhuUGp4blBqeG5Qanh3WVhSb0lHUTlJazA1TERJeFl6QXNNQzQxTlN3d0xqUTFMREVzTVN3eGFEUmpNQzQxTlN3d0xERXRNQzQwTlN3eExURjJMVEZJT1ZZeU1Yb2dUVEV5TERKRE9DNHhOQ3d5TERVc05TNHhOQ3cxTERsak1Dd3lMak00TERFdU1Ua3NOQzQwTnl3ekxEVXVOelJXTVRjZ1l6QXNNQzQxTlN3d0xqUTFMREVzTVN3eGFEWmpNQzQxTlN3d0xERXRNQzQwTlN3eExURjJMVEl1TWpaak1TNDRNUzB4TGpJM0xETXRNeTR6Tml3ekxUVXVOelJETVRrc05TNHhOQ3d4TlM0NE5pd3lMREV5TERKNklFMHhOQ3d4TXk0M1ZqRTJhQzAwZGkweUxqTWdRemd1TkRnc01USXVOak1zTnl3eE1TNDFNeXczTERsak1DMHlMamMyTERJdU1qUXROU3cxTFRWek5Td3lMakkwTERVc05VTXhOeXd4TVM0ME9Td3hOUzQwT1N3eE1pNDJOU3d4TkN3eE15NDNlaUl2UGp3dlp6NDhMMmMrUEM5blBqd3ZjM1puUGc9PVwiIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIG1hcEludHJvQ29udGFpbmVyID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1tYXBJbnRyb0NvbnRhaW5lci0tMUs4ZHVcIjtcbmV4cG9ydCB2YXIgbWFwSW50cm9IZWFkZXIgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvSGVhZGVyLS0zMkxCc1wiO1xuZXhwb3J0IHZhciBtYXBJbnRyb1RleHQgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvVGV4dC0tVGliOExcIjtcbmV4cG9ydCB2YXIgbWFwSW50cm9MaWdodGJ1bGIgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvTGlnaHRidWxiLS0zTEJ4MFwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93Qm94ID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1kaWRZb3VLbm93Qm94LS0zenRFeVwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93ID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1kaWRZb3VLbm93LS0zX3ZfaVwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93VGV4dCA9IFwibWFwSW50cm9kdWN0aW9uLW1vZHVsZS0tZGlkWW91S25vd1RleHQtLTNzZ0hzXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgbGlnaHRidWxiSWNvbiBmcm9tICcvbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9saWdodGJ1bGJfb3V0bGluZS5zdmcnO1xuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vbWFwSW50cm9kdWN0aW9uLm1vZHVsZS5zY3NzJztcblxuY29uc3QgTWFwSW50cm9kdWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICBtYXBJbnRyb0hlYWRlcjoge1xuICAgICAgaWQ6ICdtYXBJbnRyby5tYXBJbnRyb0hlYWRlcicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1pvb20gYW5kIHNlbGVjdCBhIGNlbnN1cyBibG9jayBncm91cCB0byB2aWV3IGRhdGEnLFxuICAgICAgZGVzY3JpcHRpb246ICdpbnRyb2R1Y3RvcnkgdGV4dCBvZiB3YXlzIHRvIHVzZSB0aGUgbWFwJyxcbiAgICB9LFxuICAgIGRpZFlvdUtub3c6IHtcbiAgICAgIGlkOiAnbWFwSW50cm8uZGlkWW91S25vdycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJyBEaWQgeW91IGtub3c/JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAndGV4dCBwcm9tcHRpbmcgYSBjaXRlIHBhcmFncmFwaCcsXG4gICAgfSxcbiAgICBjZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbjoge1xuICAgICAgaWQ6ICdtYXBJbnRyby5jZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0EgY2Vuc3VzIGJsb2NrIGdyb3VwIGlzIGdlbmVyYWxseSBiZXR3ZWVuIDYwMCBhbmQgMywwMDAgcGVvcGxlLiAnICtcbiAgICAgICdJdCBpcyB0aGUgc21hbGxlc3QgZ2VvZ3JhcGhpY2FsIHVuaXQgZm9yIHdoaWNoIHRoZSBVLlMuIENlbnN1cyAnICtcbiAgICAgICdCdXJlYXUgcHVibGlzaGVzIHNhbXBsZSBkYXRhLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ2NpdGVzIHRoZSBkZWZpbml0aW9uIGFuZCBoZWxwZnVsIGluZm9ybWF0aW9uIGFib3V0IGNlbnN1cyBncm91cHMnLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPGFzaWRlIGNsYXNzTmFtZT17c3R5bGVzLm1hcEludHJvQ29udGFpbmVyfT5cbiAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtzdHlsZXMubWFwSW50cm9IZWFkZXJ9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubWFwSW50cm9IZWFkZXIpfTwvaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5tYXBJbnRyb1RleHR9PlxuICAgICAgICA8aW1nIGNsYXNzTmFtZT17c3R5bGVzLm1hcEludHJvTGlnaHRidWxifSBzcmM9e2xpZ2h0YnVsYkljb259IC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuZGlkWW91S25vd0JveH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kaWRZb3VLbm93fT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRpZFlvdUtub3cpfTwvZGl2PlxuICAgICAgICAgIDxjaXRlIGNsYXNzTmFtZT17c3R5bGVzLmRpZFlvdUtub3dUZXh0fT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmNlbnN1c0Jsb2NrR3JvdXBEZWZpbml0aW9uKX08L2NpdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9hc2lkZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hcEludHJvZHVjdGlvbjtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhcmVhRGV0YWlsQ29udGFpbmVyID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tYXJlYURldGFpbENvbnRhaW5lci0tWUZUaFJcIjtcbmV4cG9ydCB2YXIgdG9wUm93ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tdG9wUm93LS1tcnNmb1wiO1xuZXhwb3J0IHZhciBjdW11bGF0aXZlSW5kZXhTY29yZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWN1bXVsYXRpdmVJbmRleFNjb3JlLS0xTWpOLVwiO1xuZXhwb3J0IHZhciBjYXRlZ29yaXphdGlvbiA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWNhdGVnb3JpemF0aW9uLS1oQjlLOFwiO1xuZXhwb3J0IHZhciB0b3BSb3dUaXRsZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXRvcFJvd1RpdGxlLS11bXgzOVwiO1xuZXhwb3J0IHZhciBjZW5zdXNMYWJlbCA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWNlbnN1c0xhYmVsLS0zU0MtY1wiO1xuZXhwb3J0IHZhciB0b3BSb3dTdWJUaXRsZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXRvcFJvd1N1YlRpdGxlLS0zamU3clwiO1xuZXhwb3J0IHZhciBzY29yZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXNjb3JlLS0zYms5YlwiO1xuZXhwb3J0IHZhciBzY29yZVN1cGVyc2NyaXB0ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tc2NvcmVTdXBlcnNjcmlwdC0tM1ZJWVhcIjtcbmV4cG9ydCB2YXIgcHJpb3JpdHkgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1wcmlvcml0eS0tMzZ1STdcIjtcbmV4cG9ydCB2YXIgcHJpb3JpdGl6ZWQgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1wcmlvcml0aXplZC0tMVhkV1FcIjtcbmV4cG9ydCB2YXIgdGhyZXNob2xkID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tdGhyZXNob2xkLS0xWTJYb1wiO1xuZXhwb3J0IHZhciBub25Qcmlvcml0aXplZCA9IFwiYXJlYURldGFpbC1tb2R1bGUtLW5vblByaW9yaXRpemVkLS0xYlRKbFwiO1xuZXhwb3J0IHZhciBwcmlvcml0aXphdGlvbiA9IFwiYXJlYURldGFpbC1tb2R1bGUtLXByaW9yaXRpemF0aW9uLS0yTm1yQlwiO1xuZXhwb3J0IHZhciBjZW5zdXNSb3cgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1jZW5zdXNSb3ctLTE2OU84XCI7XG5leHBvcnQgdmFyIGNlbnN1c1RleHQgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1jZW5zdXNUZXh0LS0zajF4Z1wiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JEZXNjcmlwdGlvbiA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvckRlc2NyaXB0aW9uLS0yeEZEWVwiO1xuZXhwb3J0IHZhciBkaXZpZGVyID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tZGl2aWRlci0tM3l3OVVcIjtcbmV4cG9ydCB2YXIgaW5kaWNhdG9yQm94ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0taW5kaWNhdG9yQm94LS0yd0FVUFwiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JUaXRsZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvclRpdGxlLS0zSWpfaFwiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JWYWx1ZSA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvclZhbHVlLS0zRXRWUVwiOyIsImltcG9ydCB7TG5nTGF0Qm91bmRzTGlrZX0gZnJvbSAnbWFwbGlicmUtZ2wnO1xuaW1wb3J0IHtpc01vYmlsZSBhcyBpc01vYmlsZVJlYWN0RGV2aWNlRGV0ZWN0fSBmcm9tICdyZWFjdC1kZXZpY2UtZGV0ZWN0JztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG4vLyBVUkxTXG5leHBvcnQgY29uc3QgRE9XTkxPQURfWklQX1VSTCA9ICdodHRwczovL2p1c3RpY2U0MC1kYXRhLnMzLmFtYXpvbmF3cy5jb20vZGF0YS1waXBlbGluZS9kYXRhL3Njb3JlL2Rvd25sb2FkYWJsZS9TY3JlZW5pbmcrVG9vbCtEYXRhLnppcCc7XG5cbi8vIFRoaXMgaXMgdGhlIFVSTCBmb3IgdGhlIG9yaWdpbiBTMyBidWNrZXQ6XG4vLyBleHBvcnQgY29uc3QgT1JJR0lOX0JBU0VfVVJMID0gJ2h0dHBzOi8vanVzdGljZTQwLWRhdGEuczMuYW1hem9uYXdzLmNvbSc7XG5cbi8vIFRoaXMgaXMgdGhlIFVSTCBmb3IgdGhlIENETiB0aGF0IGRlbGl2ZXJzIHRoZSB0aWxlIGRhdGFcbmV4cG9ydCBjb25zdCBGRUFUVVJFX1RJTEVfQkFTRV9VUkwgPSAnaHR0cHM6Ly9kM2pxeXcxMGo4ZTdwOS5jbG91ZGZyb250Lm5ldCc7XG5jb25zdCBGRUFUVVJFX1RJTEVfUEFUSCA9ICdkYXRhLXBpcGVsaW5lL2RhdGEvc2NvcmUvdGlsZXMnO1xuXG4vLyBUaGlzIGlzIHRoZSBVUkwgZm9yIHRoZSBDRE4gdGhhdCBkZWxpdmVycyB0aGUgYXBwbGljYXRpb25cbi8vIGNvbnN0IEFQUF9CQVNFX1VSTCA9ICdodHRwczovL2QyemppZDZuNWphMnB0LmNsb3VkZnJvbnQubmV0JztcbmNvbnN0IFhZWl9TVUZGSVggPSAne3p9L3t4fS97eX0ucGJmJztcblxuZXhwb3J0IGNvbnN0IGZlYXR1cmVVUkxGb3JUaWxlc2V0TmFtZSA9ICh0aWxlc2V0TmFtZSA6c3RyaW5nICkgOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYCR7RkVBVFVSRV9USUxFX0JBU0VfVVJMfS8ke0ZFQVRVUkVfVElMRV9QQVRIfS8ke3RpbGVzZXROYW1lfS8ke1hZWl9TVUZGSVh9YDtcbn07XG5leHBvcnQgY29uc3QgRkVBVFVSRV9USUxFX0hJR0hfWk9PTV9VUkwgPSBmZWF0dXJlVVJMRm9yVGlsZXNldE5hbWUoJ2hpZ2gnKTtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX1RJTEVfTE9XX1pPT01fVVJMID0gZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lKCdsb3cnKTtcblxuXG4vLyBQZXJmb3JtYW5jZSBtYXJrZXJzXG5leHBvcnQgY29uc3QgUEVSRk9STUFOQ0VfTUFSS0VSX01BUF9JRExFID0gJ01BUF9JRExFJztcblxuLy8gUHJvcGVydGllc1xuZXhwb3J0IGNvbnN0IFNDT1JFX1BST1BFUlRZX0hJR0ggPSAnU2NvcmUgRSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IFNDT1JFX1BST1BFUlRZX0xPVyA9ICdFX1NDT1JFJztcbmV4cG9ydCBjb25zdCBHRU9JRF9QUk9QRVJUWSA9ICdHRU9JRDEwJztcbmV4cG9ydCBjb25zdCBISUdIX1NDT1JFX1NPVVJDRV9OQU1FID0gJ3Njb3JlLWhpZ2gnO1xuZXhwb3J0IGNvbnN0IEhJR0hfU0NPUkVfTEFZRVJfTkFNRSA9ICdzY29yZS1oaWdoLWxheWVyJztcbmV4cG9ydCBjb25zdCBMT1dfU0NPUkVfU09VUkNFX05BTUUgPSAnc2NvcmUtbG93JztcbmV4cG9ydCBjb25zdCBMT1dfU0NPUkVfTEFZRVJfTkFNRSA9ICdzY29yZS1sb3ctbGF5ZXInO1xuZXhwb3J0IGNvbnN0IFNFTEVDVEVEX1BST1BFUlRZID0gJ3NlbGVjdGVkJztcbmV4cG9ydCBjb25zdCBDVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9ISUdITElHSFRfTEFZRVJfTkFNRSA9ICdjdXJyZW50bHktc2VsZWN0ZWQtZmVhdHVyZS1oaWdobGlnaHQtbGF5ZXInO1xuZXhwb3J0IGNvbnN0IEJMT0NLX0dST1VQX0JPVU5EQVJZX0xBWUVSX05BTUUgPSAnYmxvY2stZ3JvdXAtYm91bmRhcnktbGF5ZXInO1xuXG5cbi8vIFByb3BlcnRpZXNcbmV4cG9ydCBjb25zdCBQT1ZFUlRZX1BST1BFUlRZX1BFUkNFTlRJTEUgPSAnUG92ZXJ0eSAoTGVzcyB0aGFuIDIwMCUgb2YgZmVkZXJhbCBwb3ZlcnR5IGxpbmUpIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgSE9VU0lOR19CVVJERU5fUFJPUEVSVFlfUEVSQ0VOVElMRSA9ICdIb3VzaW5nIGJ1cmRlbiAocGVyY2VudCkgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBMSU5HVUlTVElDX0lTT0xBVElPTl9QUk9QRVJUWV9QRVJDRU5USUxFID0gJ0xpbmd1aXN0aWMgaXNvbGF0aW9uIChwZXJjZW50KSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IFVORU1QTE9ZTUVOVF9QUk9QRVJUWV9QRVJDRU5USUxFID0gJ1VuZW1wbG95ZWQgY2l2aWxpYW5zIChwZXJjZW50KSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IFRPVEFMX1BPUFVMQVRJT04gPSAnVG90YWwgcG9wdWxhdGlvbic7XG5leHBvcnQgY29uc3QgRURVQ0FUSU9OX1BST1BFUlRZX1BFUkNFTlRJTEUgPVxuYFBlcmNlbnQgaW5kaXZpZHVhbHMgYWdlIDI1IG9yIG92ZXIgd2l0aCBsZXNzIHRoYW4gaGlnaCBzY2hvb2wgZGVncmVlIChwZXJjZW50aWxlKWA7XG5leHBvcnQgY29uc3QgQ09VTlRZX05BTUUgPSAnQ291bnR5IE5hbWUnO1xuZXhwb3J0IGNvbnN0IFNUQVRFX05BTUUgPSAnU3RhdGUgTmFtZSc7XG5cblxuLy8gVGhlIG5hbWUgb2YgdGhlIGxheWVyIHdpdGhpbiB0aGUgdGlsZXMgdGhhdCBjb250YWlucyB0aGUgc2NvcmVcbmV4cG9ydCBjb25zdCBTQ09SRV9TT1VSQ0VfTEFZRVIgPSAnYmxvY2tzJztcblxuZXhwb3J0IHR5cGUgSjQwUHJvcGVydGllcyA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8vIFpvb21cbmV4cG9ydCBjb25zdCBHTE9CQUxfTUlOX1pPT00gPSAzO1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTSA9IDIyO1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NSU5fWk9PTV9MT1cgPSAzO1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTV9MT1cgPSA3O1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NSU5fWk9PTV9ISUdITElHSFQgPSA4O1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTV9ISUdITElHSFQgPSAyMjtcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUlOX1pPT01fSElHSCA9IDc7XG5leHBvcnQgY29uc3QgR0xPQkFMX01BWF9aT09NX0hJR0ggPSAxMTtcblxuLy8gQm91bmRzXG5leHBvcnQgY29uc3QgR0xPQkFMX01BWF9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTE4MC4xMTgzMDYsIDUuNDk5NTUwXSxcbiAgWy02NS4wLCA4My4xNjIxMDJdLFxuXTtcblxuZXhwb3J0IGNvbnN0IExPV0VSXzQ4X0JPVU5EUyA6IExuZ0xhdEJvdW5kc0xpa2UgPSBbXG4gIFstMTI0Ljc4NDQwNzksIDI0Ljc0MzMxOTVdLFxuICBbLTY2Ljk1MTM4MTIsIDQ5LjM0NTc4NjhdLFxuXTtcblxuZXhwb3J0IGNvbnN0IEFMQVNLQV9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTE4My44NTY4ODgsIDUwLjg3NTMxMV0sXG4gIFstMTQwLjkzMjYxNywgNzEuOTU4Nzk3XSxcbl07XG5cbmV4cG9ydCBjb25zdCBIQVdBSUlfQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0xNjguMTE4MzA2LCAxOC43NDgxMTVdLFxuICBbLTE1NC43NTc4ODEsIDIyLjM3ODQxM10sXG5dO1xuXG5leHBvcnQgY29uc3QgUFVFUlRPX1JJQ09fQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy02Ny45NDU0MDQsIDE3Ljg4MzI4XSxcbiAgWy02NS4yMjA3MDMsIDE4LjUxNTY4M10sXG5dO1xuXG5leHBvcnQgY29uc3QgR1VBTV9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTIxNS4zODk3MDksIDEzLjIyNTkwOV0sXG4gIFstMjE1LjA0MDg5NCwgMTMuNjYzMzM1XSxcbl07XG5cbmV4cG9ydCBjb25zdCBNQVJJQU5BX0lTTEFORF9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTIxNS4zMTM0NDksIDE0LjAwNzgwMV0sXG4gIFstMjEzLjc0MjQwNCwgMTkuNzUwMzI2XSxcbl07XG5cbmV4cG9ydCBjb25zdCBBTUVSSUNBTl9TQU1PQV9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTE3MS4wODk4NzQsIC0xNC41NDg2OTldLFxuICBbLTE2OC4xNDMzLCAtMTEuMDQ2OTM0XSxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NFTlRFUiA9IFszMi40Njg3MTI2LCAtODYuNTAyMTM2XTtcblxuLy8gT3BhY2l0eVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTEFZRVJfT1BBQ0lUWSA9IDAuNjtcblxuLy8gQ29sb3JzXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRMSU5FX0NPTE9SID0gJyM0RUE1Q0YnO1xuZXhwb3J0IGNvbnN0IE1JTl9DT0xPUiA9ICcjRkZGRkZGJztcbmV4cG9ydCBjb25zdCBNRURfQ09MT1IgPSAnI0QxREFFNic7XG5leHBvcnQgY29uc3QgTUFYX0NPTE9SID0gJyM3NjhGQjMnO1xuZXhwb3J0IGNvbnN0IEJPUkRFUl9ISUdITElHSFRfQ09MT1IgPSAnIzAwQkRFMyc7XG5leHBvcnQgY29uc3QgQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfT1BBQ0lUWSA9IDAuNTtcblxuLy8gV2lkdGhzXG5leHBvcnQgY29uc3QgSElHSExJR0hUX0JPUkRFUl9XSURUSCA9IDUuMDtcbmV4cG9ydCBjb25zdCBDVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9MQVlFUl9XSURUSCA9IDAuODtcblxuLy8gU2NvcmUgYm91bmRhcmllc1xuZXhwb3J0IGNvbnN0IFNDT1JFX0JPVU5EQVJZX0xPVyA9IDAuMDtcbmV4cG9ydCBjb25zdCBTQ09SRV9CT1VOREFSWV9USFJFU0hPTEQgPSAwLjY7XG5leHBvcnQgY29uc3QgU0NPUkVfQk9VTkRBUllfUFJJT1JJVElaRUQgPSAwLjc1O1xuXG5cbi8vIEV4cGxvcmUgdGhlIFRvb2w6XG5leHBvcnQgY29uc3QgRVhQTE9SRV9UT09MX1BBR0VfVEVYVCA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgUFJJT1JJVFlfTEFCRUw6IHtcbiAgICBpZDogJ2xlZ2VuZC5pbmZvLnByaW9yaXR5LmxhYmVsJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1ByaW9yaXRpemVkIGNvbW11bml0eScsXG4gICAgZGVzY3JpcHRpb246ICd0aGUgbGFiZWwgb2YgdGhlIHByaW9yaXRpemVkIGNvbW11bml0eSBsZWdlbmQnLFxuICB9LFxuICBUSFJFU0hPTERfTEFCRUw6IHtcbiAgICBpZDogJ2xlZ2VuZC5pbmZvLnRocmVzaG9sZC5sYWJlbCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaHJlc2hvbGQgY29tbXVuaXR5JyxcbiAgICBkZXNjcmlwdGlvbjogJ3RoZSBsYWJlbCBvZiB0aGUgdGhyZXNob2xkIGNvbW11bml0eSBsZWdlbmQnLFxuICB9LFxuICBMRUdFTkRfTEFCRUw6IHtcbiAgICBpZDogJ2xlZ2VuZC5jb2xvcmtleS5sYWJlbCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDT0xPUiBLRVknLFxuICAgIGRlc2NyaXB0aW9uOiAndGhlIGxhYmVsIG9mIHRoZSBrZXkgaW4gdGhlIGxlZ2VuZCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gaXNNb2JpbGVSZWFjdERldmljZURldGVjdDtcbiIsIi8vIEV4dGVybmFsIExpYnM6XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuLy8gQ29tcG9uZW50czpcblxuLy8gU3R5bGVzIGFuZCBjb25zdGFudHNcbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FyZWFEZXRhaWwubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcblxuZXhwb3J0IGNvbnN0IHJlYWRhYmxlUGVyY2VudCA9IChwZXJjZW50OiBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGAkeyhwZXJjZW50ICogMTAwKS50b0ZpeGVkKDEpfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2F0ZWdvcml6YXRpb24gPSAocGVyY2VudGlsZTogbnVtYmVyKSA9PiB7XG4gIGxldCBjYXRlZ29yaXphdGlvbjtcbiAgbGV0IGNhdGVnb3J5Q2lyY2xlU3R5bGU7XG5cbiAgaWYgKHBlcmNlbnRpbGUgPj0gY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVEICkge1xuICAgIGNhdGVnb3JpemF0aW9uID0gJ1ByaW9yaXRpemVkJztcbiAgICBjYXRlZ29yeUNpcmNsZVN0eWxlID0gc3R5bGVzLnByaW9yaXRpemVkO1xuICB9IGVsc2UgaWYgKGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9USFJFU0hPTEQgPD0gcGVyY2VudGlsZSAmJiBwZXJjZW50aWxlIDwgY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVEKSB7XG4gICAgY2F0ZWdvcml6YXRpb24gPSAnVGhyZXNob2xkJztcbiAgICBjYXRlZ29yeUNpcmNsZVN0eWxlID0gc3R5bGVzLnRocmVzaG9sZDtcbiAgfSBlbHNlIHtcbiAgICBjYXRlZ29yaXphdGlvbiA9ICdOb24tcHJpb3JpdGl6ZWQnO1xuICAgIGNhdGVnb3J5Q2lyY2xlU3R5bGUgPSBzdHlsZXMubm9uUHJpb3JpdGl6ZWQ7XG4gIH1cbiAgcmV0dXJuIFtjYXRlZ29yaXphdGlvbiwgY2F0ZWdvcnlDaXJjbGVTdHlsZV07XG59O1xuXG5pbnRlcmZhY2UgSUFyZWFEZXRhaWxQcm9wcyB7XG4gIHByb3BlcnRpZXM6IGNvbnN0YW50cy5KNDBQcm9wZXJ0aWVzLFxufVxuXG5jb25zdCBBcmVhRGV0YWlsID0gKHtwcm9wZXJ0aWVzfTpJQXJlYURldGFpbFByb3BzKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICAgIGN1bXVsYXRpdmVJbmRleFNjb3JlOiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwucHJpb3JpdHlJbmZvLmN1bXVsYXRpdmVJbmRleFNjb3JlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ3VtdWxhdGl2ZSBJbmRleCBTY29yZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBjdW11bGF0aXZlIHNjb3JlIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIHBlcmNlbnRpbGU6IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5wcmlvcml0eUluZm8ucGVyY2VudGlsZScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ3BlcmNlbnRpbGUnLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgcGVyY2VudGlsIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIGNhdGVnb3JpemF0aW9uOiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwucHJpb3JpdHlJbmZvLmNhdGVnb3JpemF0aW9uJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2F0ZWdvcml6YXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgY2F0ZWdvcml6YXRpb24gb2YgcHJpb3JpdGl6ZWQsIHRocmVzaG9sZCBvciBub24tcHJpb3JpdGl6ZWQnLFxuICAgIH0sXG4gICAgY2Vuc3VzQmxvY2tHcm91cDoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmdlb2dyYXBoaWNJbmZvLmNlbnN1c0Jsb2NrR3JvdXAnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDZW5zdXMgYmxvY2sgZ3JvdXA6JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAndGhlIGNlbnN1cyBibG9jayBncm91cCBpZCBudW1iZXIgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICAgIH0sXG4gICAgY291bnR5OiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuZ2VvZ3JhcGhpY0luZm8uY291bnR5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ291bnR5OicsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBjb3VudHkgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICAgIH0sXG4gICAgc3RhdGU6IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5nZW9ncmFwaGljSW5mby5zdGF0ZScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1N0YXRlOiAnLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgc3RhdGUgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICAgIH0sXG4gICAgcG9wdWxhdGlvbjoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmdlb2dyYXBoaWNJbmZvLnBvcHVsYXRpb24nLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQb3B1bGF0aW9uOicsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBwb3B1bGF0aW9uIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIGluZGljYXRvckNvbHVtbkhlYWRlcjoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvcnMuaW5kaWNhdG9yQ29sdW1uSGVhZGVyJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSU5ESUNBVE9SUycsXG4gICAgICBkZXNjcmlwdGlvbjogJ3RoZSBwb3B1bGF0aW9uIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgICB9LFxuICAgIHBlcmNlbnRpbGVDb2x1bW5IZWFkZXI6IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3JzLnBlcmNlbnRpbGVDb2x1bW5IZWFkZXInLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQRVJDRU5USUxFICgwLTEwMCknLFxuICAgICAgZGVzY3JpcHRpb246ICd0aGUgcG9wdWxhdGlvbiBvZiB0aGUgZmVhdHVyZSBzZWxlY3RlZCcsXG4gICAgfSxcbiAgICBwb3ZlcnR5OiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLnBvdmVydHknLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQb3ZlcnR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSG91c2Vob2xkIGluY29tZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdHdpY2UgdGhlIGZlZGVyYWwgXCJwb3ZlcnR5IGxldmVsXCInLFxuICAgIH0sXG4gICAgZWR1Y2F0aW9uOiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmVkdWNhdGlvbicsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0VkdWNhdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgcGVvcGxlIGFnZSAyNSBvciBvbGRlciB0aGF0IGRpZG7igJl0IGdldCBhIGhpZ2ggc2Nob29sIGRpcGxvbWEnLFxuICAgIH0sXG4gICAgbGluZ3Vpc3RpY0lzb2xhdGlvbjoge1xuICAgICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5saW5ndWlzdGljSXNvbGF0aW9uJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTGluZ3Vpc3RpYyBpc29sYXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdIb3VzZWhvbGRzIGluIHdoaWNoIGFsbCBtZW1iZXJzIHNwZWFrIGEgbm9uLUVuZ2xpc2ggbGFuZ3VhZ2UgYW5kICcgK1xuICAgICAgJ3NwZWFrIEVuZ2xpc2ggbGVzcyB0aGFuIFwidmVyeSB3ZWxsXCInLFxuICAgIH0sXG4gICAgdW5lbXBsb3ltZW50OiB7XG4gICAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLnVuZW1wbG95bWVudCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1VuZW1wbG95bWVudCByYXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHVuZW1wbG95ZWQgcGVvcGxlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbGFib3IgZm9yY2UnLFxuICAgIH0sXG4gICAgaG91c2VCdXJkZW46IHtcbiAgICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuaG91c2VCdXJkZW4nLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdIb3VzaW5nIEJ1cmRlbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0hvdXNlaG9sZHMgdGhhdCBhcmUgbG93IGluY29tZSBhbmQgc3BlbmQgbW9yZSB0aGFuIDMwJSBvZiB0aGVpciBpbmNvbWUgdG8gaG91c2luZyBjb3N0cycsXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgc2NvcmUgPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5TQ09SRV9QUk9QRVJUWV9ISUdIXSBhcyBudW1iZXI7XG4gIGNvbnN0IGJsb2NrR3JvdXAgPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5HRU9JRF9QUk9QRVJUWV07XG4gIGNvbnN0IHBvcHVsYXRpb24gPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5UT1RBTF9QT1BVTEFUSU9OXTtcbiAgY29uc3QgY291bnR5TmFtZSA9IHByb3BlcnRpZXNbY29uc3RhbnRzLkNPVU5UWV9OQU1FXTtcbiAgY29uc3Qgc3RhdGVOYW1lID0gcHJvcGVydGllc1tjb25zdGFudHMuU1RBVEVfTkFNRV07XG5cbiAgaW50ZXJmYWNlIGluZGljYXRvckluZm8ge1xuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICB9XG5cbiAgLy8gVG9kbzogVGlja2V0ICMzNjcgd2lsbCBiZSByZXBsYWNpbmcgZGVzY3JpcHRpb25zIHdpdGggWUFNTCBmaWxlXG4gIGNvbnN0IHBvdmVydHlJbmZvOmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5wb3ZlcnR5KSxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdXNlaG9sZCBpbmNvbWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHR3aWNlIHRoZSBmZWRlcmFsIFwicG92ZXJ0eSBsZXZlbFwiJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuUE9WRVJUWV9QUk9QRVJUWV9QRVJDRU5USUxFXSxcbiAgfTtcbiAgY29uc3QgZWR1SW5mbzppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZWR1Y2F0aW9uKSxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgcGVvcGxlIGFnZSAyNSBvciBvbGRlciB0aGF0IGRpZG7igJl0IGdldCBhIGhpZ2ggc2Nob29sIGRpcGxvbWEnLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5FRFVDQVRJT05fUFJPUEVSVFlfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IGxpbklzb0luZm86aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmxpbmd1aXN0aWNJc29sYXRpb24pLFxuICAgIGRlc2NyaXB0aW9uOiAnSG91c2Vob2xkcyBpbiB3aGljaCBhbGwgbWVtYmVycyBzcGVhayBhIG5vbi1FbmdsaXNoIGxhbmd1YWdlIGFuZCBzcGVhayBFbmdsaXNoIGxlc3MgdGhhbiBcInZlcnkgd2VsbFwiJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuTElOR1VJU1RJQ19JU09MQVRJT05fUFJPUEVSVFlfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IHVtZW1wbG95SW5mbzppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMudW5lbXBsb3ltZW50KSxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiB1bmVtcGxveWVkIHBlb3BsZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGxhYm9yIGZvcmNlJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuVU5FTVBMT1lNRU5UX1BST1BFUlRZX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBob3VzZUJ1cmRlbjppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuaG91c2VCdXJkZW4pLFxuICAgIGRlc2NyaXB0aW9uOiAnSG91c2Vob2xkcyB0aGF0IGFyZSBsb3cgaW5jb21lIGFuZCBzcGVuZCBtb3JlIHRoYW4gMzAlIG9mIHRoZWlyIGluY29tZSB0byBob3VzaW5nIGNvc3RzJyxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuSE9VU0lOR19CVVJERU5fUFJPUEVSVFlfUEVSQ0VOVElMRV0sXG4gIH07XG5cbiAgY29uc3QgaW5kaWNhdG9ycyA9IFtwb3ZlcnR5SW5mbywgZWR1SW5mbywgbGluSXNvSW5mbywgdW1lbXBsb3lJbmZvLCBob3VzZUJ1cmRlbl07XG5cbiAgY29uc3QgW2NhdGVnb3JpemF0aW9uLCBjYXRlZ29yeUNpcmNsZVN0eWxlXSA9IGdldENhdGVnb3JpemF0aW9uKHNjb3JlKTtcblxuICByZXR1cm4gKFxuICAgIDxhc2lkZSBjbGFzc05hbWU9e3N0eWxlcy5hcmVhRGV0YWlsQ29udGFpbmVyfSBkYXRhLWN5PXsnYXNpZGUnfT5cbiAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtzdHlsZXMudG9wUm93IH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3VtdWxhdGl2ZUluZGV4U2NvcmV9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMudG9wUm93VGl0bGV9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuY3VtdWxhdGl2ZUluZGV4U2NvcmUpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuc2NvcmV9IGRhdGEtY3k9eydzY29yZSd9PntgJHtyZWFkYWJsZVBlcmNlbnQoc2NvcmUpfWB9XG4gICAgICAgICAgICA8c3VwIGNsYXNzTmFtZT17c3R5bGVzLnNjb3JlU3VwZXJzY3JpcHR9PjxzcGFuPnRoPC9zcGFuPjwvc3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMudG9wUm93U3ViVGl0bGV9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucGVyY2VudGlsZSl9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmNhdGVnb3JpemF0aW9ufT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnRvcFJvd1RpdGxlfT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmNhdGVnb3JpemF0aW9uKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnByaW9yaXR5fT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYXRlZ29yeUNpcmNsZVN0eWxlfSAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5wcmlvcml0aXphdGlvbn0+e2NhdGVnb3JpemF0aW9ufTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaGVhZGVyPlxuICAgICAgPHVsIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c1Jvd30+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNMYWJlbH0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5jZW5zdXNCbG9ja0dyb3VwKX0gPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c1RleHR9PntibG9ja0dyb3VwfTwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c0xhYmVsfT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmNvdW50eSl9IDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNUZXh0fT57Y291bnR5TmFtZX08L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNMYWJlbH0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5zdGF0ZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c1RleHR9PntzdGF0ZU5hbWV9PC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuY2Vuc3VzTGFiZWx9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucG9wdWxhdGlvbil9IDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNUZXh0fT57cG9wdWxhdGlvbi50b0xvY2FsZVN0cmluZygpfTwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRpdmlkZXJ9PlxuICAgICAgICA8ZGl2PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuaW5kaWNhdG9yQ29sdW1uSGVhZGVyKX08L2Rpdj5cbiAgICAgICAgPGRpdj57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnBlcmNlbnRpbGVDb2x1bW5IZWFkZXIpfTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtpbmRpY2F0b3JzLm1hcCgoaW5kaWNhdG9yLCBpbmRleCkgPT4gKFxuICAgICAgICA8bGkga2V5PXtpbmRleH0gY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yQm94fSBkYXRhLWN5PXsnaW5kaWNhdG9yQm94J30+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yVGl0bGV9PntpbmRpY2F0b3IubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmluZGljYXRvckRlc2NyaXB0aW9ufT5cbiAgICAgICAgICAgICAge2luZGljYXRvci5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yVmFsdWV9PntyZWFkYWJsZVBlcmNlbnQoaW5kaWNhdG9yLnZhbHVlKX08L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICAgICkpfVxuXG4gICAgPC9hc2lkZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFyZWFEZXRhaWw7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1hcEludHJvZHVjdGlvbiBmcm9tICcuL21hcEludHJvZHVjdGlvbic7XG5pbXBvcnQgQXJlYURldGFpbCBmcm9tICcuL0FyZWFEZXRhaWwnO1xuXG5pbnRlcmZhY2UgSU1hcEluZm9QYW5lbFByb3BzIHtcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBmZWF0dXJlUHJvcGVydGllczogeyBba2V5OnN0cmluZ106IHN0cmluZyB8IG51bWJlciB9IHwgdW5kZWZpbmVkLFxuICAgIHNlbGVjdGVkRmVhdHVyZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWRcbiAgfVxuXG5jb25zdCBNYXBJbmZvUGFuZWwgPSAoe2NsYXNzTmFtZSwgZmVhdHVyZVByb3BlcnRpZXMsIHNlbGVjdGVkRmVhdHVyZUlkfTpJTWFwSW5mb1BhbmVsUHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSA+XG4gICAgICB7KGZlYXR1cmVQcm9wZXJ0aWVzICYmIHNlbGVjdGVkRmVhdHVyZUlkICkgP1xuICAgICAgICAgIDxBcmVhRGV0YWlsIHByb3BlcnRpZXM9e2ZlYXR1cmVQcm9wZXJ0aWVzfSAvPiA6XG4gICAgICAgICAgPE1hcEludHJvZHVjdGlvbiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFwSW5mb1BhbmVsO1xuIiwiaW1wb3J0IHtTdHlsZSwgRmlsbFBhaW50fSBmcm9tICdtYXBsaWJyZS1nbCc7XG5pbXBvcnQgY2hyb21hIGZyb20gJ2Nocm9tYS1qcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vZGF0YS9jb25zdGFudHMnO1xuaW1wb3J0IHtGbGFnQ29udGFpbmVyfSBmcm9tICcuLi9jb250ZXh0cy9GbGFnQ29udGV4dCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBoZXhUb0hTTEEoaGV4OnN0cmluZywgYWxwaGE6bnVtYmVyKSB7XG4gIHJldHVybiBjaHJvbWEoaGV4KS5hbHBoYShhbHBoYSkuY3NzKCdoc2wnKTtcbn1cblxuLyoqXG4gKiBgTWFrZVBhaW50YCBnZW5lcmF0ZXMgYSB6b29tLWZhZGVkIE1hcGxpYnJlIHN0eWxlIGZvcm1hdHRlZCBsYXllciBnaXZlbiBhIHNldCBvZiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZCA6IHRoZSBmaWVsZCB3aXRoaW4gdGhlIGRhdGEgdG8gY29uc3VsdFxuICogQHBhcmFtIHtudW1iZXJ9IG1pblJhbXAgOiB0aGUgbWluaW11bSB2YWx1ZSB0aGlzIGNhbiBhc3N1bWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtZWRSYW1wIDogdGhlIG1lZGl1bSB2YWx1ZSB0aGlzIGNhbiBhc3N1bWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSYW1wIDogdGhlIG1heGltdW0gdmFsdWUgdGhpcyBjYW4gYXNzdW1lXG4gKiBAcmV0dXJuIHtGaWxsUGFpbnR9IGEgbWFwbGlicmVnbCBmaWxsIGxheWVyXG4gKiovXG5mdW5jdGlvbiBtYWtlUGFpbnQoe1xuICBmaWVsZCxcbiAgbWluUmFtcCxcbiAgbWVkUmFtcCxcbiAgbWF4UmFtcCxcbn06IHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG1pblJhbXA6IG51bWJlcjtcbiAgICBtZWRSYW1wOiBudW1iZXI7XG4gICAgbWF4UmFtcDogbnVtYmVyO1xuICB9KTogRmlsbFBhaW50IHtcbiAgY29uc3QgcGFpbnREZXNjcmlwdG9yIDogRmlsbFBhaW50ID0ge1xuICAgICdmaWxsLWNvbG9yJzogW1xuICAgICAgJ3N0ZXAnLFxuICAgICAgWydnZXQnLCBmaWVsZF0sXG4gICAgICBoZXhUb0hTTEEoY29uc3RhbnRzLk1JTl9DT0xPUiwgY29uc3RhbnRzLkRFRkFVTFRfTEFZRVJfT1BBQ0lUWSApLFxuICAgICAgbWluUmFtcCxcbiAgICAgIGhleFRvSFNMQShjb25zdGFudHMuTUlOX0NPTE9SLCBjb25zdGFudHMuREVGQVVMVF9MQVlFUl9PUEFDSVRZICksXG4gICAgICBtZWRSYW1wLFxuICAgICAgaGV4VG9IU0xBKGNvbnN0YW50cy5NRURfQ09MT1IsIGNvbnN0YW50cy5ERUZBVUxUX0xBWUVSX09QQUNJVFkgKSxcbiAgICAgIG1heFJhbXAsXG4gICAgICBoZXhUb0hTTEEoY29uc3RhbnRzLk1BWF9DT0xPUiwgY29uc3RhbnRzLkRFRkFVTFRfTEFZRVJfT1BBQ0lUWSApLFxuICAgIF0sXG4gIH07XG4gIHJldHVybiBwYWludERlc2NyaXB0b3I7XG59XG5cbmNvbnN0IGltYWdlU3VmZml4ID0gY29uc3RhbnRzLmlzTW9iaWxlID8gJycgOiAnQDJ4JztcblxuZXhwb3J0IGNvbnN0IG1ha2VNYXBTdHlsZSA9IChmbGFnQ29udGFpbmVyOiBGbGFnQ29udGFpbmVyKSA6IFN0eWxlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAndmVyc2lvbic6IDgsXG4gICAgJ3NvdXJjZXMnOiB7XG4gICAgICAnY2FydG8nOiB7XG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICd0aWxlcyc6XG4gICAgICBbXG4gICAgICAgIGBodHRwczovL2EuYmFzZW1hcHMuY2FydG9jZG4uY29tL2xpZ2h0X25vbGFiZWxzL3t6fS97eH0ve3l9JHtpbWFnZVN1ZmZpeH0ucG5nYCxcbiAgICAgICAgYGh0dHBzOi8vYi5iYXNlbWFwcy5jYXJ0b2Nkbi5jb20vbGlnaHRfbm9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICBgaHR0cHM6Ly9jLmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9ub2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgIGBodHRwczovL2QuYmFzZW1hcHMuY2FydG9jZG4uY29tL2xpZ2h0X25vbGFiZWxzL3t6fS97eH0ve3l9JHtpbWFnZVN1ZmZpeH0ucG5nYCxcbiAgICAgIF0sXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NLFxuICAgICAgfSxcbiAgICAgICdnZW8nOiB7XG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICd0aWxlcyc6IFtcbiAgICAgICAgICAnaHR0cHM6Ly9tdDAuZ29vZ2xlLmNvbS92dC9seXJzPXAmaGw9ZW4meD17eH0meT17eX0mej17en0nLFxuICAgICAgICBdLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgICBbY29uc3RhbnRzLkhJR0hfU0NPUkVfU09VUkNFX05BTUVdOiB7XG4gICAgICAvLyBcIlNjb3JlLWhpZ2hcIiByZXByZXNlbnRzIHRoZSBmdWxsIHNldCBvZiBkYXRhXG4gICAgICAvLyBhdCB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGxldmVsLiBJdCBpcyBvbmx5IHNob3duXG4gICAgICAvLyBhdCBoaWdoIHpvb20gbGV2ZWxzIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGlzc3VlcyBhdCBsb3dlciB6b29tc1xuICAgICAgICAndHlwZSc6ICd2ZWN0b3InLFxuICAgICAgICAvLyBPdXIgY3VycmVudCB0aXBwZWNhbm9lIGNvbW1hbmQgZG9lcyBub3Qgc2V0IGFuIGlkLlxuICAgICAgICAvLyBUaGUgYmVsb3cgbGluZSBwcm9tb3RlcyB0aGUgR0VPSUQxMCBwcm9wZXJ0eSB0byB0aGUgSURcbiAgICAgICAgJ3Byb21vdGVJZCc6IGNvbnN0YW50cy5HRU9JRF9QUk9QRVJUWSxcbiAgICAgICAgJ3RpbGVzJzogW1xuICAgICAgICAgICdoaWdoX3RpbGVzJyBpbiBmbGFnQ29udGFpbmVyID9cbiAgICAgICAgICBjb25zdGFudHMuZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lKGZsYWdDb250YWluZXJbJ2hpZ2hfdGlsZXMnXSkgOlxuICAgICAgICAgIGNvbnN0YW50cy5GRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTCxcbiAgICAgICAgXSxcbiAgICAgICAgLy8gU2VldGluZyBtYXh6b29tIGhlcmUgZW5hYmxlcyAnb3Zlcnpvb21pbmcnXG4gICAgICAgIC8vIGUuZy4gY29udGludWVkIHpvb21pbmcgYmV5b25kIHRoZSBtYXggYm91bmRzLlxuICAgICAgICAvLyBNb3JlIGhlcmU6IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvb3Zlcnpvb20vXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdILFxuICAgICAgICAnbWF4em9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUFYX1pPT01fSElHSCxcbiAgICAgIH0sXG4gICAgICBbY29uc3RhbnRzLkxPV19TQ09SRV9TT1VSQ0VfTkFNRV06IHtcbiAgICAgIC8vIFwiU2NvcmUtbG93XCIgcmVwcmVzZW50cyBhIHRpbGVzZXQgYXQgdGhlIGxldmVsIG9mIGJ1Y2tldGVkIHRyYWN0cy5cbiAgICAgIC8vIGNlbnN1cyBibG9jayBncm91cCBpbmZvcm1hdGlvbiBpcyBgZGlzc29sdmVgZCBpbnRvIHRyYWN0cywgdGhlblxuICAgICAgLy8gZWFjaCB0cmFjdCBpcyBgZGlzc29sdmVgZCBpbnRvIG9uZSBvZiB0ZW4gYnVja2V0cy4gSXQgaXMgbWVhbnRcbiAgICAgIC8vIHRvIGdpdmUgdXMgYSBmYXZvcmFibGUgdHJhZGVvZmYgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQgZmlkZWxpdHkuXG4gICAgICAgICd0eXBlJzogJ3ZlY3RvcicsXG4gICAgICAgICdwcm9tb3RlSWQnOiBjb25zdGFudHMuR0VPSURfUFJPUEVSVFksXG4gICAgICAgICd0aWxlcyc6IFtcbiAgICAgICAgICAnbG93X3RpbGVzJyBpbiBmbGFnQ29udGFpbmVyID9cbiAgICAgICAgICBjb25zdGFudHMuZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lKGZsYWdDb250YWluZXJbJ2xvd190aWxlcyddKSA6XG4gICAgICAgICAgY29uc3RhbnRzLkZFQVRVUkVfVElMRV9MT1dfWk9PTV9VUkwsXG4gICAgICAgIC8vIEZvciBsb2NhbCBkZXZlbG9wbWVudCwgdXNlOlxuICAgICAgICAvLyAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL2RhdGEvdGxfMjAxMF9iZ193aXRoX2RhdGEve3p9L3t4fS97eX0ucGJmJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0xPVyxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0xPVyxcbiAgICAgIH0sXG4gICAgICAnbGFiZWxzJzoge1xuICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAndGlsZXMnOiBbXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1hLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1iLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1jLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgICAgYGh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy1kLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9vbmx5X2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgJ2xheWVycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ2lkJzogJ2NhcnRvJyxcbiAgICAgICAgJ3NvdXJjZSc6ICdjYXJ0bycsXG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ2lkJzogJ2dlbycsXG4gICAgICAgICdzb3VyY2UnOiAnZ2VvJyxcbiAgICAgICAgJ3R5cGUnOiAncmFzdGVyJyxcbiAgICAgICAgJ2xheW91dCc6IHtcbiAgICAgICAgLy8gTWFrZSB0aGUgbGF5ZXIgaW52aXNpYmxlIGJ5IGRlZmF1bHQuXG4gICAgICAgICAgJ3Zpc2liaWxpdHknOiAnbm9uZScsXG4gICAgICAgIH0sXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ2lkJzogY29uc3RhbnRzLkhJR0hfU0NPUkVfTEFZRVJfTkFNRSxcbiAgICAgICAgJ3NvdXJjZSc6IGNvbnN0YW50cy5ISUdIX1NDT1JFX1NPVVJDRV9OQU1FLFxuICAgICAgICAnc291cmNlLWxheWVyJzogY29uc3RhbnRzLlNDT1JFX1NPVVJDRV9MQVlFUixcbiAgICAgICAgJ3R5cGUnOiAnZmlsbCcsXG4gICAgICAgICdwYWludCc6IG1ha2VQYWludCh7XG4gICAgICAgICAgZmllbGQ6IGNvbnN0YW50cy5TQ09SRV9QUk9QRVJUWV9ISUdILFxuICAgICAgICAgIG1pblJhbXA6IGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9MT1csXG4gICAgICAgICAgbWVkUmFtcDogY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1RIUkVTSE9MRCxcbiAgICAgICAgICBtYXhSYW1wOiBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfUFJJT1JJVElaRUQsXG4gICAgICAgIH0pLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT01fSElHSCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdpZCc6IGNvbnN0YW50cy5MT1dfU0NPUkVfTEFZRVJfTkFNRSxcbiAgICAgICAgJ3NvdXJjZSc6IGNvbnN0YW50cy5MT1dfU0NPUkVfU09VUkNFX05BTUUsXG4gICAgICAgICdzb3VyY2UtbGF5ZXInOiBjb25zdGFudHMuU0NPUkVfU09VUkNFX0xBWUVSLFxuICAgICAgICAndHlwZSc6ICdmaWxsJyxcbiAgICAgICAgJ2ZpbHRlcic6IFsnYWxsJyxcbiAgICAgICAgICBbJz4nLCBjb25zdGFudHMuU0NPUkVfUFJPUEVSVFlfTE9XLCBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfVEhSRVNIT0xEXSxcbiAgICAgICAgXSxcbiAgICAgICAgJ3BhaW50JzogbWFrZVBhaW50KHtcbiAgICAgICAgICBmaWVsZDogY29uc3RhbnRzLlNDT1JFX1BST1BFUlRZX0xPVyxcbiAgICAgICAgICBtaW5SYW1wOiBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfTE9XLFxuICAgICAgICAgIG1lZFJhbXA6IGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9USFJFU0hPTEQsXG4gICAgICAgICAgbWF4UmFtcDogY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVELFxuICAgICAgICB9KSxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0xPVyxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0xPVyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAvLyBXZSBwdXQgbGFiZWxzIGxhc3QgdG8gZW5zdXJlIHByb21pbmVuY2VcbiAgICAgICAgJ2lkJzogJ2xhYmVscy1vbmx5LWxheWVyJyxcbiAgICAgICAgJ3R5cGUnOiAncmFzdGVyJyxcbiAgICAgICAgJ3NvdXJjZSc6ICdsYWJlbHMnLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn07XG5cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBtYXBBbmRJbmZvUGFuZWxDb250YWluZXIgPSBcIko0ME1hcC1tb2R1bGUtLW1hcEFuZEluZm9QYW5lbENvbnRhaW5lci0tcS1vZHlcIjtcbmV4cG9ydCB2YXIgajQwUG9wdXAgPSBcIko0ME1hcC1tb2R1bGUtLWo0MFBvcHVwLS0zeUpHclwiO1xuZXhwb3J0IHZhciBuYXZpZ2F0aW9uQ29udHJvbCA9IFwiSjQwTWFwLW1vZHVsZS0tbmF2aWdhdGlvbkNvbnRyb2wtLTJBeWJmXCI7XG5leHBvcnQgdmFyIGZ1bGxzY3JlZW5Db250cm9sID0gXCJKNDBNYXAtbW9kdWxlLS1mdWxsc2NyZWVuQ29udHJvbC0tMVVCS2VcIjtcbmV4cG9ydCB2YXIgZ2VvbG9jYXRlQ29udHJvbCA9IFwiSjQwTWFwLW1vZHVsZS0tZ2VvbG9jYXRlQ29udHJvbC0tM0tWQWtcIjtcbmV4cG9ydCB2YXIgbWFwSW5mb1BhbmVsID0gXCJKNDBNYXAtbW9kdWxlLS1tYXBJbmZvUGFuZWwtLUYzalI0XCI7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8vIEV4dGVybmFsIExpYnM6XG5pbXBvcnQgUmVhY3QsIHtNb3VzZUV2ZW50LCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge01hcCwgTWFwYm94R2VvSlNPTkZlYXR1cmUsIExuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJ21hcGxpYnJlLWdsJztcbmltcG9ydCBSZWFjdE1hcEdMLCB7XG4gIE1hcEV2ZW50LFxuICBWaWV3cG9ydFByb3BzLFxuICBXZWJNZXJjYXRvclZpZXdwb3J0LFxuICBOYXZpZ2F0aW9uQ29udHJvbCxcbiAgR2VvbG9jYXRlQ29udHJvbCxcbiAgUG9wdXAsXG4gIEZseVRvSW50ZXJwb2xhdG9yLFxuICBGdWxsc2NyZWVuQ29udHJvbCxcbiAgTWFwUmVmLCBTb3VyY2UsIExheWVyfSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IGJib3ggZnJvbSAnQHR1cmYvYmJveCc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMy1lYXNlJztcbmltcG9ydCB7aXNNb2JpbGV9IGZyb20gJ3JlYWN0LWRldmljZS1kZXRlY3QnO1xuXG4vLyBDb250ZXh0czpcbmltcG9ydCB7dXNlRmxhZ3N9IGZyb20gJy4uL2NvbnRleHRzL0ZsYWdDb250ZXh0JztcblxuLy8gQ29tcG9uZW50czpcbmltcG9ydCBUZXJyaXRvcnlGb2N1c0NvbnRyb2wgZnJvbSAnLi90ZXJyaXRvcnlGb2N1c0NvbnRyb2wnO1xuaW1wb3J0IE1hcEluZm9QYW5lbCBmcm9tICcuL21hcEluZm9QYW5lbCc7XG5pbXBvcnQgQXJlYURldGFpbCBmcm9tICcuL0FyZWFEZXRhaWwnO1xuXG4vLyBTdHlsZXMgYW5kIGNvbnN0YW50c1xuaW1wb3J0IHttYWtlTWFwU3R5bGV9IGZyb20gJy4uL2RhdGEvbWFwU3R5bGUnO1xuaW1wb3J0ICdtYXBsaWJyZS1nbC9kaXN0L21hcGxpYnJlLWdsLmNzcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vZGF0YS9jb25zdGFudHMnO1xuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vSjQwTWFwLm1vZHVsZS5zY3NzJztcblxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIEN5cHJlc3M/OiBvYmplY3Q7XG4gICAgdW5kZXJseWluZ01hcDogTWFwO1xuICB9XG59XG5cbmludGVyZmFjZSBJSjQwSW50ZXJmYWNlIHtcbiAgbG9jYXRpb246IExvY2F0aW9uO1xufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXRhaWxWaWV3SW50ZXJmYWNlIHtcbiAgbGF0aXR1ZGU6IG51bWJlclxuICBsb25naXR1ZGU6IG51bWJlclxuICB6b29tOiBudW1iZXJcbiAgcHJvcGVydGllczogY29uc3RhbnRzLko0MFByb3BlcnRpZXMsXG59O1xuXG5jb25zdCBKNDBNYXAgPSAoe2xvY2F0aW9ufTogSUo0MEludGVyZmFjZSkgPT4ge1xuICAvLyBIYXNoIHBvcnRpb24gb2YgVVJMIGlzIG9mIHRoZSBmb3JtICN6b29tL2xhdC9sbmdcbiAgY29uc3QgW3pvb20sIGxhdCwgbG5nXSA9IGxvY2F0aW9uLmhhc2guc2xpY2UoMSkuc3BsaXQoJy8nKTtcbiAgY29uc3QgW3ZpZXdwb3J0LCBzZXRWaWV3cG9ydF0gPSB1c2VTdGF0ZTxWaWV3cG9ydFByb3BzPih7XG4gICAgbGF0aXR1ZGU6IGxhdCAmJiBwYXJzZUZsb2F0KGxhdCkgfHwgY29uc3RhbnRzLkRFRkFVTFRfQ0VOVEVSWzBdLFxuICAgIGxvbmdpdHVkZTogbG5nICYmIHBhcnNlRmxvYXQobG5nKSB8fCBjb25zdGFudHMuREVGQVVMVF9DRU5URVJbMV0sXG4gICAgem9vbTogem9vbSAmJiBwYXJzZUZsb2F0KHpvb20pIHx8IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gIH0pO1xuXG4gIGNvbnN0IFtzZWxlY3RlZEZlYXR1cmUsIHNldFNlbGVjdGVkRmVhdHVyZV0gPSB1c2VTdGF0ZTxNYXBib3hHZW9KU09ORmVhdHVyZT4oKTtcbiAgY29uc3QgW2RldGFpbFZpZXdEYXRhLCBzZXREZXRhaWxWaWV3RGF0YV0gPSB1c2VTdGF0ZTxJRGV0YWlsVmlld0ludGVyZmFjZT4oKTtcbiAgY29uc3QgW3RyYW5zaXRpb25JblByb2dyZXNzLCBzZXRUcmFuc2l0aW9uSW5Qcm9ncmVzc10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtnZW9sb2NhdGlvbkluUHJvZ3Jlc3MsIHNldEdlb2xvY2F0aW9uSW5Qcm9ncmVzc10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtpc01vYmlsZU1hcFN0YXRlLCBzZXRJc01vYmlsZU1hcFN0YXRlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCBtYXBSZWYgPSB1c2VSZWY8TWFwUmVmPihudWxsKTtcbiAgY29uc3QgZmxhZ3MgPSB1c2VGbGFncygpO1xuXG4gIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUlkID0gKHNlbGVjdGVkRmVhdHVyZSAmJiBzZWxlY3RlZEZlYXR1cmUuaWQpIHx8ICcnO1xuICBjb25zdCBmaWx0ZXIgPSB1c2VNZW1vKCgpID0+IFsnaW4nLCBjb25zdGFudHMuR0VPSURfUFJPUEVSVFksIHNlbGVjdGVkRmVhdHVyZUlkXSwgW3NlbGVjdGVkRmVhdHVyZV0pO1xuXG4gIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQ6IE1hcEV2ZW50KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZSA9IGV2ZW50LmZlYXR1cmVzICYmIGV2ZW50LmZlYXR1cmVzWzBdO1xuICAgIGlmIChmZWF0dXJlKSB7XG4gICAgICBjb25zdCBbbWluTG5nLCBtaW5MYXQsIG1heExuZywgbWF4TGF0XSA9IGJib3goZmVhdHVyZSk7XG4gICAgICBjb25zdCBuZXdWaWV3UG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCEsIHdpZHRoOiB2aWV3cG9ydC53aWR0aCF9KTtcbiAgICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IG5ld1ZpZXdQb3J0LmZpdEJvdW5kcyhcbiAgICAgICAgICBbXG4gICAgICAgICAgICBbbWluTG5nLCBtaW5MYXRdLFxuICAgICAgICAgICAgW21heExuZywgbWF4TGF0XSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDQwLFxuICAgICAgICAgIH0sXG4gICAgICApO1xuICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IHNlbGVjdGVkRmVhdHVyZUlkKSB7XG4gICAgICAgIHNldFNlbGVjdGVkRmVhdHVyZShmZWF0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGVkRmVhdHVyZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcG9wdXBJbmZvID0ge1xuICAgICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICB9O1xuICAgICAgZ29Ub1BsYWNlKFtcbiAgICAgICAgW21pbkxuZywgbWluTGF0XSxcbiAgICAgICAgW21heExuZywgbWF4TGF0XSxcbiAgICAgIF0pO1xuICAgICAgc2V0RGV0YWlsVmlld0RhdGEocG9wdXBJbmZvKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25Mb2FkID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuQ3lwcmVzcyAmJiBtYXBSZWYuY3VycmVudCkge1xuICAgICAgd2luZG93LnVuZGVybHlpbmdNYXAgPSBtYXBSZWYuY3VycmVudC5nZXRNYXAoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNb2JpbGUpIHNldElzTW9iaWxlTWFwU3RhdGUodHJ1ZSk7XG4gIH07XG5cblxuICBjb25zdCBnb1RvUGxhY2UgPSAoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlICkgPT4ge1xuICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCEsIHdpZHRoOiB2aWV3cG9ydC53aWR0aCF9KVxuICAgICAgICAuZml0Qm91bmRzKGJvdW5kcyBhcyBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sIHtcbiAgICAgICAgICBwYWRkaW5nOiAyMCxcbiAgICAgICAgICBvZmZzZXQ6IFswLCAtMTAwXSxcbiAgICAgICAgfSk7XG4gICAgc2V0Vmlld3BvcnQoe1xuICAgICAgLi4udmlld3BvcnQsXG4gICAgICBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSxcbiAgICAgIHpvb20sXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb246IDEwMDAsXG4gICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgRmx5VG9JbnRlcnBvbGF0b3IoKSxcbiAgICAgIHRyYW5zaXRpb25FYXNpbmc6IGQzLmVhc2VDdWJpYyxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgYnV0dG9uSUQgPSBldmVudC50YXJnZXQgJiYgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQ7XG5cbiAgICBzd2l0Y2ggKGJ1dHRvbklEKSB7XG4gICAgICBjYXNlICc0OCc6XG4gICAgICAgIGdvVG9QbGFjZShjb25zdGFudHMuTE9XRVJfNDhfQk9VTkRTKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBSyc6XG4gICAgICAgIGdvVG9QbGFjZShjb25zdGFudHMuQUxBU0tBX0JPVU5EUyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSEknOlxuICAgICAgICBnb1RvUGxhY2UoY29uc3RhbnRzLkhBV0FJSV9CT1VORFMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BSJzpcbiAgICAgICAgZ29Ub1BsYWNlKGNvbnN0YW50cy5QVUVSVE9fUklDT19CT1VORFMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uVHJhbnNpdGlvblN0YXJ0ID0gKCkgPT4ge1xuICAgIHNldFRyYW5zaXRpb25JblByb2dyZXNzKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9ICgpID0+IHtcbiAgICBzZXRUcmFuc2l0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XG4gIH07XG5cbiAgY29uc3Qgb25HZW9sb2NhdGUgPSAoKSA9PiB7XG4gICAgc2V0R2VvbG9jYXRpb25JblByb2dyZXNzKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrR2VvbG9jYXRlID0gKCkgPT4ge1xuICAgIHNldEdlb2xvY2F0aW9uSW5Qcm9ncmVzcyh0cnVlKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubWFwQW5kSW5mb1BhbmVsQ29udGFpbmVyfT5cbiAgICAgIDxSZWFjdE1hcEdMXG4gICAgICAgIHsuLi52aWV3cG9ydH1cbiAgICAgICAgbWFwU3R5bGU9e21ha2VNYXBTdHlsZShmbGFncyl9XG4gICAgICAgIG1pblpvb209e2NvbnN0YW50cy5HTE9CQUxfTUlOX1pPT019XG4gICAgICAgIG1heFpvb209e2NvbnN0YW50cy5HTE9CQUxfTUFYX1pPT019XG4gICAgICAgIG1hcE9wdGlvbnM9e3toYXNoOiB0cnVlfX1cbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgaGVpZ2h0PXtpc01vYmlsZU1hcFN0YXRlID8gJzQ0dmgnIDogJzEwMCUnfVxuICAgICAgICBkcmFnUm90YXRlPXtmYWxzZX1cbiAgICAgICAgdG91Y2hSb3RhdGU9e2ZhbHNlfVxuICAgICAgICBpbnRlcmFjdGl2ZUxheWVySWRzPXtbY29uc3RhbnRzLkhJR0hfU0NPUkVfTEFZRVJfTkFNRV19XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2U9e3NldFZpZXdwb3J0fVxuICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICBvbkxvYWQ9e29uTG9hZH1cbiAgICAgICAgb25UcmFuc2l0aW9uU3RhcnQ9e29uVHJhbnNpdGlvblN0YXJ0fVxuICAgICAgICBvblRyYW5zaXRpb25FbmQ9e29uVHJhbnNpdGlvbkVuZH1cbiAgICAgICAgcmVmPXttYXBSZWZ9XG4gICAgICAgIGRhdGEtY3k9eydyZWFjdE1hcEdMJ31cbiAgICAgID5cbiAgICAgICAgPFNvdXJjZVxuICAgICAgICAgIGlkPXtjb25zdGFudHMuSElHSF9TQ09SRV9TT1VSQ0VfTkFNRX1cbiAgICAgICAgICB0eXBlPVwidmVjdG9yXCJcbiAgICAgICAgICBwcm9tb3RlSWQ9e2NvbnN0YW50cy5HRU9JRF9QUk9QRVJUWX1cbiAgICAgICAgICB0aWxlcz17W2NvbnN0YW50cy5GRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTF19XG4gICAgICAgICAgbWF4em9vbT17Y29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdIfVxuICAgICAgICAgIG1pbnpvb209e2NvbnN0YW50cy5HTE9CQUxfTUFYX1pPT01fSElHSH1cbiAgICAgICAgPlxuICAgICAgICAgIDxMYXllclxuICAgICAgICAgICAgaWQ9e2NvbnN0YW50cy5DVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9ISUdITElHSFRfTEFZRVJfTkFNRX1cbiAgICAgICAgICAgIHNvdXJjZS1sYXllcj17Y29uc3RhbnRzLlNDT1JFX1NPVVJDRV9MQVlFUn1cbiAgICAgICAgICAgIHR5cGU9J2xpbmUnXG4gICAgICAgICAgICBwYWludD17e1xuICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IGNvbnN0YW50cy5ERUZBVUxUX09VVExJTkVfQ09MT1IsXG4gICAgICAgICAgICAgICdsaW5lLXdpZHRoJzogY29uc3RhbnRzLkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX1dJRFRILFxuICAgICAgICAgICAgICAnbGluZS1vcGFjaXR5JzogY29uc3RhbnRzLkNVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX09QQUNJVFksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgbWluem9vbT17Y29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdITElHSFR9XG4gICAgICAgICAgICBtYXh6b29tPXtjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0hJR0hMSUdIVH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPExheWVyXG4gICAgICAgICAgICBpZD17Y29uc3RhbnRzLkJMT0NLX0dST1VQX0JPVU5EQVJZX0xBWUVSX05BTUV9XG4gICAgICAgICAgICB0eXBlPSdsaW5lJ1xuICAgICAgICAgICAgc291cmNlLWxheWVyPXtjb25zdGFudHMuU0NPUkVfU09VUkNFX0xBWUVSfVxuICAgICAgICAgICAgcGFpbnQ9e3tcbiAgICAgICAgICAgICAgJ2xpbmUtY29sb3InOiBjb25zdGFudHMuQk9SREVSX0hJR0hMSUdIVF9DT0xPUixcbiAgICAgICAgICAgICAgJ2xpbmUtd2lkdGgnOiBjb25zdGFudHMuSElHSExJR0hUX0JPUkRFUl9XSURUSCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgIG1pbnpvb209e2NvbnN0YW50cy5HTE9CQUxfTUlOX1pPT01fSElHSH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NvdXJjZT5cbiAgICAgICAgeygnZnMnIGluIGZsYWdzICYmIGRldGFpbFZpZXdEYXRhICYmICF0cmFuc2l0aW9uSW5Qcm9ncmVzcykgJiYgKFxuICAgICAgICAgIDxQb3B1cFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuajQwUG9wdXB9XG4gICAgICAgICAgICB0aXBTaXplPXs1fVxuICAgICAgICAgICAgYW5jaG9yPVwidG9wXCJcbiAgICAgICAgICAgIGxvbmdpdHVkZT17ZGV0YWlsVmlld0RhdGEubG9uZ2l0dWRlIX1cbiAgICAgICAgICAgIGxhdGl0dWRlPXtkZXRhaWxWaWV3RGF0YS5sYXRpdHVkZSF9XG4gICAgICAgICAgICBjbG9zZU9uQ2xpY2s9e3RydWV9XG4gICAgICAgICAgICBvbkNsb3NlPXtzZXREZXRhaWxWaWV3RGF0YX1cbiAgICAgICAgICAgIGNhcHR1cmVTY3JvbGw9e3RydWV9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFyZWFEZXRhaWwgcHJvcGVydGllcz17ZGV0YWlsVmlld0RhdGEucHJvcGVydGllc30gLz5cbiAgICAgICAgICA8L1BvcHVwPlxuICAgICAgICApfVxuICAgICAgICA8TmF2aWdhdGlvbkNvbnRyb2xcbiAgICAgICAgICBzaG93Q29tcGFzcz17ZmFsc2V9XG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMubmF2aWdhdGlvbkNvbnRyb2x9XG4gICAgICAgIC8+XG4gICAgICAgIHsnZ2wnIGluIGZsYWdzID8gPEdlb2xvY2F0ZUNvbnRyb2xcbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5nZW9sb2NhdGVDb250cm9sfVxuICAgICAgICAgIHBvc2l0aW9uT3B0aW9ucz17e2VuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZX19XG4gICAgICAgICAgb25HZW9sb2NhdGU9e29uR2VvbG9jYXRlfVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgLy8gVHlwZXMgaGF2ZSBub3QgY2F1Z2h0IHVwIHlldCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aXNnbC9yZWFjdC1tYXAtZ2wvaXNzdWVzLzE0OTJcbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrR2VvbG9jYXRlfVxuICAgICAgICAvPiA6ICcnfVxuICAgICAgICB7Z2VvbG9jYXRpb25JblByb2dyZXNzID8gPGRpdj5HZW9sb2NhdGlvbiBpbiBwcm9ncmVzcy4uLjwvZGl2PiA6ICcnfVxuICAgICAgICA8VGVycml0b3J5Rm9jdXNDb250cm9sIG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbj17b25DbGlja1RlcnJpdG9yeUZvY3VzQnV0dG9ufS8+XG4gICAgICAgIHsnZnMnIGluIGZsYWdzID8gPEZ1bGxzY3JlZW5Db250cm9sIGNsYXNzTmFtZT17c3R5bGVzLmZ1bGxzY3JlZW5Db250cm9sfS8+IDonJyB9XG4gICAgICA8L1JlYWN0TWFwR0w+XG4gICAgICA8TWFwSW5mb1BhbmVsXG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLm1hcEluZm9QYW5lbH1cbiAgICAgICAgZmVhdHVyZVByb3BlcnRpZXM9e2RldGFpbFZpZXdEYXRhPy5wcm9wZXJ0aWVzfVxuICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZD17c2VsZWN0ZWRGZWF0dXJlPy5pZH1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYXA7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgbWFwQ2FwdGlvblRleHRMaW5rID0gXCJtYXBXcmFwcGVyLW1vZHVsZS0tbWFwQ2FwdGlvblRleHRMaW5rLS0yM2IyblwiOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG5pbXBvcnQgSjQwTWFwIGZyb20gJy4uL0o0ME1hcCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL21hcFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcbmltcG9ydCBBbGVydFdyYXBwZXIgZnJvbSAnLi4vQWxlcnRXcmFwcGVyJztcblxuaW50ZXJmYWNlIElNYXBXcmFwcGVyUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbn1cblxuY29uc3QgTWFwV3JhcHBlciA9ICh7bG9jYXRpb259OiBJTWFwV3JhcHBlclByb3BzKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICAgIGRvd25sb2FkTGlua1RleHQ6IHtcbiAgICAgIGlkOiAnbWFwd3JhcHBlci5kb3dubG9hZC5saW5rJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRG93bmxvYWQgdGhlIGRyYWZ0IGxpc3Qgb2YgcHJpb3JpdGl6ZWQgY29tbXVuaXRpZXMgKHByZS1kZWNpc2lvbmFsKSBhbmQgZGF0YXNldHMgdXNlZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ2Rvd25sb2FkIGxpbmsgZm9yIGRhdGFzZXRzJyxcbiAgICB9LFxuICAgIGRvd25sb2FkQ29udGVudHM6IHtcbiAgICAgIGlkOiAnbWFwd3JhcHBlci5kb3dubG9hZC5jb250ZW50cycsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ1pJUCBmaWxlIHdpbGwgY29udGFpbiBvbmUgLnhsc3gsIG9uZSAuY3N2IGFuZCBvbmUgLnBkZiAoMzAgTUIpLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ2Rvd25sb2FkIGxpbmsgY29udGVudHMnLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e2ZhbHNlfSBzaG93TGltaXRlZERhdGFBbGVydD17dHJ1ZX0vPlxuICAgICAgPEo0ME1hcCBsb2NhdGlvbj17bG9jYXRpb259Lz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubWFwQ2FwdGlvblRleHRMaW5rfT5cbiAgICAgICAgPGEgaHJlZj17Y29uc3RhbnRzLkRPV05MT0FEX1pJUF9VUkx9PlxuICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZG93bmxvYWRMaW5rVGV4dCl9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRvd25sb2FkQ29udGVudHMpfTwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCBNYXBXcmFwcGVyO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGxlZ2VuZENvbnRhaW5lciA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kQ29udGFpbmVyLS0yRmFLSFwiO1xuZXhwb3J0IHZhciBsZWdlbmRUb29sdGlwVGV4dCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kVG9vbHRpcFRleHQtLTN3cTZmXCI7XG5leHBvcnQgdmFyIGxlZ2VuZEhlYWRlciA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kSGVhZGVyLS0yR1pLNlwiO1xuZXhwb3J0IHZhciBzd2F0Y2hDb250YWluZXIgPSBcIm1hcExlZ2VuZC1tb2R1bGUtLXN3YXRjaENvbnRhaW5lci0tMXZVMkpcIjtcbmV4cG9ydCB2YXIgbGVnZW5kSXRlbSA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kSXRlbS0tMlZ4VlpcIjtcbmV4cG9ydCB2YXIgaW5mb0ljb25XcmFwcGVyID0gXCJtYXBMZWdlbmQtbW9kdWxlLS1pbmZvSWNvbldyYXBwZXItLTJfMUtnXCI7XG5leHBvcnQgdmFyIGluZm9JY29uID0gXCJtYXBMZWdlbmQtbW9kdWxlLS1pbmZvSWNvbi0tM01SZThcIjtcbmV4cG9ydCB2YXIgY29sb3JTd2F0Y2ggPSBcIm1hcExlZ2VuZC1tb2R1bGUtLWNvbG9yU3dhdGNoLS1fU1F3VFwiO1xuZXhwb3J0IHZhciBwcmlvcml0aXplZCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tcHJpb3JpdGl6ZWQtLTJ2a1FHXCI7XG5leHBvcnQgdmFyIHRocmVzaG9sZCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tdGhyZXNob2xkLS0yLTFLcVwiO1xuZXhwb3J0IHZhciBub25Qcmlvcml0aXplZCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbm9uUHJpb3JpdGl6ZWQtLVhiR3pOXCI7XG5leHBvcnQgdmFyIGxlZ2VuZFRvb2x0aXBUaGVtZSA9IFwibWFwTGVnZW5kLW1vZHVsZS0tbGVnZW5kVG9vbHRpcFRoZW1lLS0zUEdEeVwiO1xuZXhwb3J0IHZhciBwbGFjZVRvcCA9IFwibWFwTGVnZW5kLW1vZHVsZS0tcGxhY2UtdG9wLS0ydF9lZFwiOyIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURJMElESTBJaUJvWldsbmFIUTlJakkwSWlCMmFXVjNRbTk0UFNJd0lEQWdNalFnTWpRaUlIZHBaSFJvUFNJeU5DSStQR2MrUEhCaGRHZ2daRDBpVFRBc01HZ3lOSFl5TkVnd1ZqQjZJaUJtYVd4c1BTSnViMjVsSWk4K1BIQmhkR2dnWkQwaVRURXhMRGRvTW5ZeWFDMHlWamQ2SUUweE1Td3hNV2d5ZGpab0xUSldNVEY2SUUweE1pd3lRell1TkRnc01pd3lMRFl1TkRnc01pd3hNbk0wTGpRNExERXdMREV3TERFd2N6RXdMVFF1TkRnc01UQXRNVEJUTVRjdU5USXNNaXd4TWl3eWVpQk5NVElzTWpBZ1l5MDBMalF4TERBdE9DMHpMalU1TFRndE9ITXpMalU1TFRnc09DMDRjemdzTXk0MU9TdzRMRGhUTVRZdU5ERXNNakFzTVRJc01qQjZJaTgrUEM5blBqd3ZjM1puUGc9PVwiIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcbmltcG9ydCB7VG9vbHRpcH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9tYXBMZWdlbmQubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IGluZm9JY29uIGZyb20gJy9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2luZm9fb3V0bGluZS5zdmcnO1xuXG4vLyBUb2RvIFZTOiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBpbiB0aGUgcmUtZGVzaWduIG9mIHRoZSB0b29sLXRpcFxuLy8gY29uc3QgZ2V0VG9vbFRpcENvbnRlbnQgPSAodHlwZTpzdHJpbmcpID0+IHtcbi8vICAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbi8vICAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4vLyAgICAgcHJpb3JpdHlIZWFkZXI6IHtcbi8vICAgICAgIGlkOiAndG9vbHRpcC5pbmZvLnByaW9yaXR5LmhlYWRlcicsXG4vLyAgICAgICBkZWZhdWx0TWVzc2FnZTogY29uc3RhbnRzLlBSSU9SSVRJWkVEX0NPTU1VTklUWSxcbi8vICAgICAgIGRlc2NyaXB0aW9uOiAndGhlIGhlYWRlciBvZiB0aGUgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IHRvb2x0aXAnLFxuLy8gICAgIH0sXG4vLyAgICAgdGhyZXNob2xkSGVhZGVyOiB7XG4vLyAgICAgICBpZDogJ3Rvb2x0aXAuaW5mby50aHJlc2hvbGQuaGVhZGVyJyxcbi8vICAgICAgIGRlZmF1bHRNZXNzYWdlOiBjb25zdGFudHMuVEhSRVNIT0xEX0NPTU1VTklUWSxcbi8vICAgICAgIGRlc2NyaXB0aW9uOiAndGhlIGhlYWRlciBvZiB0aGUgdGhyZXNob2xkIGNvbW11bml0eSB0b29sdGlwJyxcbi8vICAgICB9LFxuLy8gICAgIHByaW9yaXR5VGV4dDoge1xuLy8gICAgICAgaWQ6ICd0b29sdGlwLmluZm8ucHJpb3JpdHkudGV4dCcsXG4vLyAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0EgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IGlzIG9uZSB0aGF0IGhhcyBhIGN1bXVsYXRpdmUgaW5kZXggc2NvcmUgb2YgWHRoICcgK1xuLy8gICAgICAgJ3BlcmNlbnRpbGUgYW5kIGFib3ZlLiA0MCUgb2YgdGhlIGJlbmVmaXRzIGZyb20gaW52ZXN0bWVudHMgb3V0bGluZWQgYnkgdGhlICcgK1xuLy8gICAgICAgJ0p1c3RpY2U0MCBJbml0aWF0aXZlIHNob3VsZCBnbyB0byBwcmlvcml0aXplZCBjb21tdW5pdGllcy4nLFxuLy8gICAgICAgZGVzY3JpcHRpb246ICd0aGUgdGV4dCBvZiB0aGUgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IHRvb2x0aXAnLFxuLy8gICAgIH0sXG4vLyAgICAgdGhyZXNob2xkVGV4dDoge1xuLy8gICAgICAgaWQ6ICd0b29sdGlwLmluZm8udGhyZXNob2xkLnRleHQnLFxuLy8gICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDb21tdW5pdGllcyB3aXRoIGEgY3VtdWxhdGl2ZSBpbmRleCBzY29yZSBiZXR3ZWVuIFkgLSBYLjk5dGggcGVyY2VudGlsZSBhcmUgJyArXG4vLyAgICAgICdjb25zaWRlcmVkIHRocmVzaG9sZCBjb21tdW5pdGllcy4gV2hpbGUgdGhlc2UgY29tbXVuaXRpZXMgYXJlIGN1cnJlbnRseSBub3QgY29uc2lkZXJlZCBhICcgK1xuLy8gICAgICAncHJpb3JpdGl6ZWQgY29tbXVuaXR5LCB0aGlzIG1heSBjaGFuZ2UgYmFzZWQgb24gdXBkYXRlcyB0byB0aGUgc2NvcmluZyBtZXRob2QuJyxcbi8vICAgICAgIGRlc2NyaXB0aW9uOiAndGhlIHRleHQgb2YgdGhlIHRocmVzaG9sZCBjb21tdW5pdHkgdG9vbHRpcCcsXG4vLyAgICAgfSxcbi8vICAgfSk7XG5cbi8vICAgcmV0dXJuICh0eXBlID09PSAncHJpb3JpdGl6ZWQnKSA/XG4vLyAgICAgKFxuLy8gICAgIDxkaXY+XG4vLyAgICAgICA8aDI+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5wcmlvcml0eUhlYWRlcil9PC9oMj5cbi8vICAgICAgIDxwIGNsYXNzTmFtZT17c3R5bGVzLmxlZ2VuZFRvb2x0aXBUZXh0fT57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnByaW9yaXR5VGV4dCl9PC9wPlxuLy8gICAgIDwvZGl2PlxuLy8gICAgICkgOlxuLy8gICAgIChcbi8vICAgICAgIDxkaXY+XG4vLyAgICAgICAgIDxoMj57aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnRocmVzaG9sZEhlYWRlcil9PC9oMj5cbi8vICAgICAgICAgPHAgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kVG9vbHRpcFRleHR9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMudGhyZXNob2xkVGV4dCl9PC9wPlxuLy8gICAgICAgPC9kaXY+XG4vLyAgICAgKTtcbi8vIH07XG5cbmNvbnN0IE1hcExlZ2VuZCA9ICgpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuICAvLyBUeXBlIGRlZmluaXRpb25zIHJlcXVpcmVkIGZvciBAdHJ1c3N3b3JrcyB0b29sdGlwLiBUaGlzIHR5cGUgZGVmaW5lcyB0aGUgZGl2IHRoYXQgd3JhcHMgdGhlIGljb24uXG4gIC8vIFRoaXMgYWxsb3dzIHRvIHBhc3MgY2hpbGRyZW4gYW5kIG90aGVyIGF0dHJpYnV0ZXMuXG4gIHR5cGUgSWNvbldyYXBwZXJQcm9wcyA9IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHtcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgfT4gJlxuICAgIEpTWC5JbnRyaW5zaWNFbGVtZW50c1snZGl2J10gJlxuICAgIFJlYWN0LlJlZkF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4gIGNvbnN0IEljb25XcmFwcGVyOiBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PEljb25XcmFwcGVyUHJvcHM+ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAgICh7Y2xhc3NOYW1lLCBjaGlsZHJlbiwgLi4udG9vbHRpcFByb3BzfTogSWNvbldyYXBwZXJQcm9wcywgcmVmKSA9PiAoXG4gICAgICAgIDxkaXYgcmVmPXtyZWZ9IGNsYXNzTmFtZT17c3R5bGVzLmluZm9JY29uV3JhcHBlcn0gey4uLnRvb2x0aXBQcm9wc30+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICk7XG4gIEljb25XcmFwcGVyLmRpc3BsYXlOYW1lID0gJ2N1c3RvbSBpbmZvIHdyYXBwZXInO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5sZWdlbmRDb250YWluZXJ9PlxuICAgICAgPGgzIGNsYXNzTmFtZT17c3R5bGVzLmxlZ2VuZEhlYWRlcn0+e2ludGwuZm9ybWF0TWVzc2FnZShjb25zdGFudHMuRVhQTE9SRV9UT09MX1BBR0VfVEVYVC5MRUdFTkRfTEFCRUwpfTwvaDM+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnN3YXRjaENvbnRhaW5lcn0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kSXRlbX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jb2xvclN3YXRjaH0gaWQ9e3N0eWxlcy5wcmlvcml0aXplZH0gLz5cbiAgICAgICAgICA8c3Bhbj57aW50bC5mb3JtYXRNZXNzYWdlKGNvbnN0YW50cy5FWFBMT1JFX1RPT0xfUEFHRV9URVhULlBSSU9SSVRZX0xBQkVMKX08L3NwYW4+XG5cbiAgICAgICAgICB7LyogVXNpbmcgQHRydXNzd29ya3MgdG9vbHRpcCAqL31cbiAgICAgICAgICA8VG9vbHRpcDxJY29uV3JhcHBlclByb3BzPlxuICAgICAgICAgICAgbGFiZWw9e2BcbiAgICAgICAgICAgIENvbW11bml0aWVzIHRoYXQgaGF2ZSBjdW11bGF0aXZlIFxuICAgICAgICAgICAgaW5kZXggc2NvcmUgb2YgWHRoIHBlcmNlbnRpbGVcbiAgICAgICAgICAgIGFuZCBhYm92ZVxuICAgICAgICAgICAgICBgfVxuICAgICAgICAgICAgcG9zaXRpb249J2xlZnQnXG4gICAgICAgICAgICBhc0N1c3RvbT17SWNvbldyYXBwZXJ9PlxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9e3N0eWxlcy5pbmZvSWNvbn0gc3JjPXtpbmZvSWNvbn0gLz5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kSXRlbX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jb2xvclN3YXRjaH0gaWQ9e3N0eWxlcy50aHJlc2hvbGR9IC8+XG4gICAgICAgICAgPHNwYW4+e2ludGwuZm9ybWF0TWVzc2FnZShjb25zdGFudHMuRVhQTE9SRV9UT09MX1BBR0VfVEVYVC5USFJFU0hPTERfTEFCRUwpfTwvc3Bhbj5cblxuICAgICAgICAgIHsvKiBVc2luZyBAdHJ1c3N3b3JrcyB0b29sdGlwICovfVxuICAgICAgICAgIDxUb29sdGlwPEljb25XcmFwcGVyUHJvcHM+XG4gICAgICAgICAgICBsYWJlbD17YFxuICAgICAgICAgICAgIENvbW11bml0aWVzIHdpdGggYSBjdW11bGF0aXZlIFxuICAgICAgICAgICAgIGluZGV4IHNjb3JlIGJldHdlZW4gWSAtIFguOTl0aFxuICAgICAgICAgICAgIHBlcmNlbnRpbGVcbiAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgIHBvc2l0aW9uPSdsZWZ0J1xuICAgICAgICAgICAgYXNDdXN0b209e0ljb25XcmFwcGVyfT5cbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPXtzdHlsZXMuaW5mb0ljb259IHNyYz17aW5mb0ljb259IC8+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFwTGVnZW5kO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGV4cGxvcmVQYWdlSGVhZGVyID0gXCJjZWpzdC1tb2R1bGUtLWV4cGxvcmVQYWdlSGVhZGVyLS0yVHdEelwiO1xuZXhwb3J0IHZhciBleHBsb3JlUGFnZVN1YkhlYWRlciA9IFwiY2Vqc3QtbW9kdWxlLS1leHBsb3JlUGFnZVN1YkhlYWRlci0tU0YtMUpcIjtcbmV4cG9ydCB2YXIgZXhwbG9yZVBhZ2VIZWFkZXJUZXh0ID0gXCJjZWpzdC1tb2R1bGUtLWV4cGxvcmVQYWdlSGVhZGVyVGV4dC0tUlNwVUxcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWxlcnRXcmFwcGVyJztcbmltcG9ydCBIb3dZb3VDYW5IZWxwIGZyb20gJy4uL2NvbXBvbmVudHMvSG93WW91Q2FuSGVscCc7XG5pbXBvcnQgSjQwTWFpbkdyaWRDb250YWluZXIgZnJvbSAnLi4vY29tcG9uZW50cy9KNDBNYWluR3JpZENvbnRhaW5lcic7XG5pbXBvcnQgTGF5b3V0IGZyb20gJy4uL2NvbXBvbmVudHMvbGF5b3V0JztcbmltcG9ydCBNYXBXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWFwV3JhcHBlcic7XG5pbXBvcnQgTWFwTGVnZW5kIGZyb20gJy4uL2NvbXBvbmVudHMvTWFwTGVnZW5kJztcblxuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vY2Vqc3QubW9kdWxlLnNjc3MnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cblxuaW50ZXJmYWNlIElNYXBQYWdlUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb247XG59XG5cbmNvbnN0IENFSlNUUGFnZSA9ICh7bG9jYXRpb259OiBJTWFwUGFnZVByb3BzKSA9PiB7XG4gIC8vIFdlIHRlbXBvcmFyaWx5IHJlbW92ZWQgTWFwQ29udHJvbHMsIHdoaWNoIHdvdWxkIGVuYWJsZSB5b3UgdG8gYHNldEZlYXR1cmVzYCBhbHNvLCBmb3Igbm93XG4gIC8vICAgV2Ugd2lsbCBicmluZyBiYWNrIGxhdGVyIHdoZW4gd2UgaGF2ZSBpbnRlcmFjdGl2ZSBjb250cm9scy5cbiAgcmV0dXJuICg8TGF5b3V0IGxvY2F0aW9uPXtsb2NhdGlvbn0+XG4gICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXt0cnVlfSBzaG93TGltaXRlZERhdGFBbGVydD17ZmFsc2V9Lz5cbiAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgPEo0ME1haW5HcmlkQ29udGFpbmVyIGNsYXNzTmFtZT17J2o0MC1tYWluLWNvbnRlbnQnfT5cbiAgICAgIDxHcmlkIHJvdz48R3JpZCBjb2w+XG4gICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgIDxoMSBjbGFzc05hbWU9e3N0eWxlcy5leHBsb3JlUGFnZUhlYWRlcn0+RXhwbG9yZSB0aGUgdG9vbDwvaDE+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5leHBsb3JlUGFnZVN1YkhlYWRlcn0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmV4cGxvcmVQYWdlSGVhZGVyVGV4dH0+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICBab29tIGludG8gdGhlIG1hcCB0byBzZWUgd2hpY2ggY29tbXVuaXRpZXMgdGhlIHRvb2wgaGFzIGN1cnJlbnRseVxuICAgICAgICAgICAgICBpZGVudGlmaWVkIGFzIHByaW9yaXRpemVkICh0aGUgdG9wIDI1JSBvZiBjb21tdW5pdGllcykgb3Igb24gdGhlXG4gICAgICAgICAgICAgIHRocmVzaG9sZC4gTGVhcm4gbW9yZSBhYm91dCB0aGUgZm9ybXVsYSBhbmQgZGF0YXNldHMgdGhhdCB3ZXJlXG4gICAgICAgICAgICAgIHVzZWQgdG8gcHJpb3JpdGl6ZSB0aGVzZSBjb21tdW5pdGllcyBvbiB0aGVcbiAgICAgICAgICAgICAgICB7YCBgfVxuICAgICAgICAgICAgICAgIDxMaW5rIHRvPXsnL21ldGhvZG9sb2d5J30+RGF0YSAmIG1ldGhvZG9sb2d5PC9MaW5rPlxuICAgICAgICAgICAgICAgIHtgIGB9XG4gICAgICAgICAgICAgIHBhZ2UuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPE1hcExlZ2VuZCAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L0dyaWQ+PC9HcmlkPlxuXG4gICAgICA8R3JpZCByb3c+PEdyaWQgY29sPlxuICAgICAgICA8c2VjdGlvbj5cbiAgICAgICAgICA8TWFwV3JhcHBlciBsb2NhdGlvbj17bG9jYXRpb259Lz5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9HcmlkPjwvR3JpZD5cblxuICAgICAgPEdyaWQgcm93PjxHcmlkIGNvbD5cbiAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgPEhvd1lvdUNhbkhlbHAvPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L0dyaWQ+PC9HcmlkPlxuICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gIDwvTGF5b3V0Pik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDRUpTVFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6666\n")}}]); \ No newline at end of file diff --git a/main/component---src-pages-contact-tsx-08cf4a56d94a01466036.js b/main/component---src-pages-contact-tsx-08cf4a56d94a01466036.js new file mode 100644 index 00000000..0fdae08a --- /dev/null +++ b/main/component---src-pages-contact-tsx-08cf4a56d94a01466036.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[650],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},440: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 _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9703);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_AlertWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6780);\n/* harmony import */ var _components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6445);\n/* harmony import */ var _components_layout__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(828);\nvar ContactPage=function ContactPage(_ref){var location=_ref.location;var generalEmail='screeningtool.feedback@usds.gov';return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_layout__WEBPACK_IMPORTED_MODULE_5__/* .default */ .Z,{location:location},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__/* .default */ .Z,null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_AlertWrapper__WEBPACK_IMPORTED_MODULE_3__/* .default */ .Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__/* .default */ .Z,{className:'usa-prose'},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.Grid,{row:true},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.Grid,{col:true},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h2\",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:'contact.pageheader',description:'H2 header for contact page',defaultMessage:'Contact'})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h3\",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:'contact.sectionheader',description:'Heading for page to allow users to contact project maintainers',defaultMessage:'Email us'})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:'contact.general',description:'Contact page body text',defaultMessage:\"For general feedback, email {general_email_address}\",values:{general_email_address:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\",{href:\"mailto:\"+generalEmail},generalEmail)}}))))));};/* harmony default export */ __webpack_exports__[\"default\"] = (ContactPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9jb250YWN0LnRzeD9kMDA4Il0sIm5hbWVzIjpbIkNvbnRhY3RQYWdlIiwibG9jYXRpb24iLCJnZW5lcmFsRW1haWwiLCJnZW5lcmFsX2VtYWlsX2FkZHJlc3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBLEdBQU1BLFlBQVcsQ0FBRyxRQUFkQSxZQUFjLE1BQWtDLElBQWhDQyxTQUFnQyxNQUFoQ0EsUUFBZ0MsQ0FDcEQsR0FBTUMsYUFBWSxDQUFHLGlDQUFyQixDQUVBLG1CQUNFLGlEQUFDLGdFQUFELEVBQVEsUUFBUSxDQUFFRCxRQUFsQixlQUVFLGlEQUFDLDhFQUFELG1CQUNFLGlEQUFDLHNFQUFELEVBQWMsYUFBYSxDQUFFLElBQTdCLENBQW1DLG9CQUFvQixDQUFFLEtBQXpELEVBREYsQ0FGRixjQU1FLGlEQUFDLDhFQUFELEVBQXNCLFNBQVMsQ0FBRSxXQUFqQyxlQUNFLGlEQUFDLHlEQUFELEVBQU0sR0FBRyxLQUFULGVBQVUsaURBQUMseURBQUQsRUFBTSxHQUFHLEtBQVQsZUFDUix3RUFBSSxpREFBQyxnRUFBRCxFQUNGLEVBQUUsQ0FBRSxvQkFERixDQUVGLFdBQVcsQ0FBRSw0QkFGWCxDQUdGLGNBQWMsQ0FBRSxTQUhkLEVBQUosQ0FEUSxjQUtSLHdFQUFJLGlEQUFDLGdFQUFELEVBQ0YsRUFBRSxDQUFFLHVCQURGLENBRUYsV0FBVyxDQUFFLGdFQUZYLENBR0YsY0FBYyxDQUFFLFVBSGQsRUFBSixDQUxRLGNBVVIsdUVBQ0UsaURBQUMsZ0VBQUQsRUFDRSxFQUFFLENBQUUsaUJBRE4sQ0FFRSxXQUFXLENBQUUsd0JBRmYsQ0FHRSxjQUFjLHNEQUhoQixDQUlFLE1BQU0sQ0FBRSxDQUNORSxxQkFBcUIsY0FDakIsc0RBQUcsSUFBSSxXQUFZRCxZQUFuQixFQUFvQ0EsWUFBcEMsQ0FGRSxDQUpWLEVBREYsQ0FWUSxDQUFWLENBREYsQ0FORixDQURGLENBZ0NELENBbkNELENBcUNBLCtEQUFlRixXQUFmIiwiZmlsZSI6IjQ0MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWxlcnRXcmFwcGVyJztcbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyJztcbmltcG9ydCBMYXlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuXG5pbnRlcmZhY2UgQ29udGFjdFBhZ2VQcm9wcyB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvbjtcbn1cblxuY29uc3QgQ29udGFjdFBhZ2UgPSAoe2xvY2F0aW9ufTogQ29udGFjdFBhZ2VQcm9wcykgPT4ge1xuICBjb25zdCBnZW5lcmFsRW1haWwgPSAnc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdic7XG5cbiAgcmV0dXJuIChcbiAgICA8TGF5b3V0IGxvY2F0aW9uPXtsb2NhdGlvbn0+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXt0cnVlfSBzaG93TGltaXRlZERhdGFBbGVydD17ZmFsc2V9Lz5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lciBjbGFzc05hbWU9eyd1c2EtcHJvc2UnfT5cbiAgICAgICAgPEdyaWQgcm93PjxHcmlkIGNvbD5cbiAgICAgICAgICA8aDI+PEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgIGlkPXsnY29udGFjdC5wYWdlaGVhZGVyJ31cbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPXsnSDIgaGVhZGVyIGZvciBjb250YWN0IHBhZ2UnfVxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9eydDb250YWN0J30vPjwvaDI+XG4gICAgICAgICAgPGgzPjxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICBpZD17J2NvbnRhY3Quc2VjdGlvbmhlYWRlcid9XG4gICAgICAgICAgICBkZXNjcmlwdGlvbj17J0hlYWRpbmcgZm9yIHBhZ2UgdG8gYWxsb3cgdXNlcnMgdG8gY29udGFjdCBwcm9qZWN0IG1haW50YWluZXJzJ31cbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPXsnRW1haWwgdXMnfS8+PC9oMz5cblxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9eydjb250YWN0LmdlbmVyYWwnfVxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17J0NvbnRhY3QgcGFnZSBib2R5IHRleHQnfVxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17YEZvciBnZW5lcmFsIGZlZWRiYWNrLCBlbWFpbCB7Z2VuZXJhbF9lbWFpbF9hZGRyZXNzfWB9XG4gICAgICAgICAgICAgIHZhbHVlcz17e1xuICAgICAgICAgICAgICAgIGdlbmVyYWxfZW1haWxfYWRkcmVzczpcbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj17YG1haWx0bzoke2dlbmVyYWxFbWFpbH1gfT57Z2VuZXJhbEVtYWlsfTwvYT4sXG4gICAgICAgICAgICAgIH19Lz5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvR3JpZD48L0dyaWQ+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgIDwvTGF5b3V0PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29udGFjdFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///440\n")}}]); \ No newline at end of file diff --git a/main/component---src-pages-contact-tsx-266f3c657ad2540a2a94.js b/main/component---src-pages-contact-tsx-266f3c657ad2540a2a94.js deleted file mode 100644 index 883002c5..00000000 --- a/main/component---src-pages-contact-tsx-266f3c657ad2540a2a94.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[650],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},6445:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n// Trussworks GridContainer won't allow it to span 100% of the page, so\n// this works around it and tries to hide the complexity in component\nvar J40MainGridContainer=function J40MainGridContainer(_ref){var children=_ref.children,_ref$fullWidth=_ref.fullWidth,fullWidth=_ref$fullWidth===void 0?false:_ref$fullWidth,_ref$blueBackground=_ref.blueBackground,blueBackground=_ref$blueBackground===void 0?false:_ref$blueBackground,_ref$className=_ref.className,className=_ref$className===void 0?'j40-grid-container ':_ref$className;// is it a blue background strip?\nclassName+=blueBackground?'j40-main-grid-blue-bk ':'';return fullWidth?/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\",{className:'j40-grid-container '+className},children):/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.GridContainer,{containerSize:'desktop-lg',className:'j40-grid-container '+className},children);};/* harmony default export */ __webpack_exports__[\"Z\"] = (J40MainGridContainer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyLnRzeD84ODk4Il0sIm5hbWVzIjpbIko0ME1haW5HcmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJmdWxsV2lkdGgiLCJibHVlQmFja2dyb3VuZCIsImNsYXNzTmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQVdBLEdBQU1BLHFCQUFvQixDQUFHLFFBQXZCQSxxQkFBdUIsTUFJMEIsSUFIckRDLFNBR3FELE1BSHJEQSxRQUdxRCxxQkFGckRDLFNBRXFELENBRnJEQSxTQUVxRCx5QkFGekMsS0FFeUMseUNBRHJEQyxjQUNxRCxDQURyREEsY0FDcUQsOEJBRHBDLEtBQ29DLHlDQUFyREMsU0FBcUQsQ0FBckRBLFNBQXFELHlCQUF6QyxxQkFBeUMsZ0JBQ3JEO0FBQ0FBLFNBQVMsRUFBS0QsY0FBYyxDQUFHLHdCQUFILENBQThCLEVBQTFELENBRUEsTUFBT0QsVUFBUyxjQUNkLHdEQUNFLFNBQVMsQ0FBRSxzQkFBd0JFLFNBRHJDLEVBRUdILFFBRkgsQ0FEYyxjQU1kLGlEQUFDLGtFQUFELEVBQ0UsYUFBYSxDQUFFLFlBRGpCLENBRUUsU0FBUyxDQUFFLHNCQUF3QkcsU0FGckMsRUFHR0gsUUFISCxDQU5GLENBWUQsQ0FwQkQsQ0FzQkEseURBQWVELG9CQUFmIiwiZmlsZSI6IjY0NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUcnVzc3dvcmtzIEdyaWRDb250YWluZXIgd29uJ3QgYWxsb3cgaXQgdG8gc3BhbiAxMDAlIG9mIHRoZSBwYWdlLCBzb1xuLy8gdGhpcyB3b3JrcyBhcm91bmQgaXQgYW5kIHRyaWVzIHRvIGhpZGUgdGhlIGNvbXBsZXhpdHkgaW4gY29tcG9uZW50XG5pbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lcn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbnRlcmZhY2UgSUxheW91dFByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgZnVsbFdpZHRoPzogYm9vbGVhbixcbiAgIGJsdWVCYWNrZ3JvdW5kPzogYm9vbGVhbixcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IEo0ME1haW5HcmlkQ29udGFpbmVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGZ1bGxXaWR0aCA9IGZhbHNlLFxuICBibHVlQmFja2dyb3VuZCA9IGZhbHNlLFxuICBjbGFzc05hbWUgPSAnajQwLWdyaWQtY29udGFpbmVyICd9OiBJTGF5b3V0UHJvcHMpID0+IHtcbiAgLy8gaXMgaXQgYSBibHVlIGJhY2tncm91bmQgc3RyaXA/XG4gIGNsYXNzTmFtZSArPSAoYmx1ZUJhY2tncm91bmQgPyAnajQwLW1haW4tZ3JpZC1ibHVlLWJrICcgOiAnJyk7XG5cbiAgcmV0dXJuIGZ1bGxXaWR0aCA/IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9eydqNDAtZ3JpZC1jb250YWluZXIgJyArIGNsYXNzTmFtZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICkgOiAoXG4gICAgPEdyaWRDb250YWluZXJcbiAgICAgIGNvbnRhaW5lclNpemU9eydkZXNrdG9wLWxnJ31cbiAgICAgIGNsYXNzTmFtZT17J2o0MC1ncmlkLWNvbnRhaW5lciAnICsgY2xhc3NOYW1lfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0dyaWRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYWluR3JpZENvbnRhaW5lcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6445\n")},440: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 _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9703);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_AlertWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6780);\n/* harmony import */ var _components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6445);\n/* harmony import */ var _components_layout__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(828);\nvar ContactPage=function ContactPage(_ref){var location=_ref.location;var generalEmail='screeningtool.feedback@usds.gov';return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_layout__WEBPACK_IMPORTED_MODULE_5__/* .default */ .Z,{location:location},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__/* .default */ .Z,null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_AlertWrapper__WEBPACK_IMPORTED_MODULE_3__/* .default */ .Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__/* .default */ .Z,{className:'usa-prose'},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.Grid,{row:true},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.Grid,{col:true},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h2\",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:'contact.pageheader',description:'H2 header for contact page',defaultMessage:'Contact'})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h3\",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:'contact.sectionheader',description:'Heading for page to allow users to contact project maintainers',defaultMessage:'Email us'})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"p\",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:'contact.general',description:'Contact page body text',defaultMessage:\"For general feedback, email {general_email_address}\",values:{general_email_address:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\",{href:\"mailto:\"+generalEmail},generalEmail)}}))))));};/* harmony default export */ __webpack_exports__[\"default\"] = (ContactPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9jb250YWN0LnRzeD9kMDA4Il0sIm5hbWVzIjpbIkNvbnRhY3RQYWdlIiwibG9jYXRpb24iLCJnZW5lcmFsRW1haWwiLCJnZW5lcmFsX2VtYWlsX2FkZHJlc3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBLEdBQU1BLFlBQVcsQ0FBRyxRQUFkQSxZQUFjLE1BQWtDLElBQWhDQyxTQUFnQyxNQUFoQ0EsUUFBZ0MsQ0FDcEQsR0FBTUMsYUFBWSxDQUFHLGlDQUFyQixDQUVBLG1CQUNFLGlEQUFDLGdFQUFELEVBQVEsUUFBUSxDQUFFRCxRQUFsQixlQUVFLGlEQUFDLDhFQUFELG1CQUNFLGlEQUFDLHNFQUFELEVBQWMsYUFBYSxDQUFFLElBQTdCLENBQW1DLG9CQUFvQixDQUFFLEtBQXpELEVBREYsQ0FGRixjQU1FLGlEQUFDLDhFQUFELEVBQXNCLFNBQVMsQ0FBRSxXQUFqQyxlQUNFLGlEQUFDLHlEQUFELEVBQU0sR0FBRyxLQUFULGVBQVUsaURBQUMseURBQUQsRUFBTSxHQUFHLEtBQVQsZUFDUix3RUFBSSxpREFBQyxnRUFBRCxFQUNGLEVBQUUsQ0FBRSxvQkFERixDQUVGLFdBQVcsQ0FBRSw0QkFGWCxDQUdGLGNBQWMsQ0FBRSxTQUhkLEVBQUosQ0FEUSxjQUtSLHdFQUFJLGlEQUFDLGdFQUFELEVBQ0YsRUFBRSxDQUFFLHVCQURGLENBRUYsV0FBVyxDQUFFLGdFQUZYLENBR0YsY0FBYyxDQUFFLFVBSGQsRUFBSixDQUxRLGNBVVIsdUVBQ0UsaURBQUMsZ0VBQUQsRUFDRSxFQUFFLENBQUUsaUJBRE4sQ0FFRSxXQUFXLENBQUUsd0JBRmYsQ0FHRSxjQUFjLHNEQUhoQixDQUlFLE1BQU0sQ0FBRSxDQUNORSxxQkFBcUIsY0FDakIsc0RBQUcsSUFBSSxXQUFZRCxZQUFuQixFQUFvQ0EsWUFBcEMsQ0FGRSxDQUpWLEVBREYsQ0FWUSxDQUFWLENBREYsQ0FORixDQURGLENBZ0NELENBbkNELENBcUNBLCtEQUFlRixXQUFmIiwiZmlsZSI6IjQ0MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWxlcnRXcmFwcGVyJztcbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyJztcbmltcG9ydCBMYXlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuXG5pbnRlcmZhY2UgQ29udGFjdFBhZ2VQcm9wcyB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvbjtcbn1cblxuY29uc3QgQ29udGFjdFBhZ2UgPSAoe2xvY2F0aW9ufTogQ29udGFjdFBhZ2VQcm9wcykgPT4ge1xuICBjb25zdCBnZW5lcmFsRW1haWwgPSAnc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdic7XG5cbiAgcmV0dXJuIChcbiAgICA8TGF5b3V0IGxvY2F0aW9uPXtsb2NhdGlvbn0+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXt0cnVlfSBzaG93TGltaXRlZERhdGFBbGVydD17ZmFsc2V9Lz5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lciBjbGFzc05hbWU9eyd1c2EtcHJvc2UnfT5cbiAgICAgICAgPEdyaWQgcm93PjxHcmlkIGNvbD5cbiAgICAgICAgICA8aDI+PEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgIGlkPXsnY29udGFjdC5wYWdlaGVhZGVyJ31cbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPXsnSDIgaGVhZGVyIGZvciBjb250YWN0IHBhZ2UnfVxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9eydDb250YWN0J30vPjwvaDI+XG4gICAgICAgICAgPGgzPjxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICBpZD17J2NvbnRhY3Quc2VjdGlvbmhlYWRlcid9XG4gICAgICAgICAgICBkZXNjcmlwdGlvbj17J0hlYWRpbmcgZm9yIHBhZ2UgdG8gYWxsb3cgdXNlcnMgdG8gY29udGFjdCBwcm9qZWN0IG1haW50YWluZXJzJ31cbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPXsnRW1haWwgdXMnfS8+PC9oMz5cblxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9eydjb250YWN0LmdlbmVyYWwnfVxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17J0NvbnRhY3QgcGFnZSBib2R5IHRleHQnfVxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17YEZvciBnZW5lcmFsIGZlZWRiYWNrLCBlbWFpbCB7Z2VuZXJhbF9lbWFpbF9hZGRyZXNzfWB9XG4gICAgICAgICAgICAgIHZhbHVlcz17e1xuICAgICAgICAgICAgICAgIGdlbmVyYWxfZW1haWxfYWRkcmVzczpcbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj17YG1haWx0bzoke2dlbmVyYWxFbWFpbH1gfT57Z2VuZXJhbEVtYWlsfTwvYT4sXG4gICAgICAgICAgICAgIH19Lz5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvR3JpZD48L0dyaWQ+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgIDwvTGF5b3V0PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29udGFjdFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///440\n")}}]); \ No newline at end of file diff --git a/main/component---src-pages-index-tsx-1145e55e3ba8d5f93dea.js b/main/component---src-pages-index-tsx-1145e55e3ba8d5f93dea.js deleted file mode 100644 index c9fd4d61..00000000 --- a/main/component---src-pages-index-tsx-1145e55e3ba8d5f93dea.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[691],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},6445:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n// Trussworks GridContainer won't allow it to span 100% of the page, so\n// this works around it and tries to hide the complexity in component\nvar J40MainGridContainer=function J40MainGridContainer(_ref){var children=_ref.children,_ref$fullWidth=_ref.fullWidth,fullWidth=_ref$fullWidth===void 0?false:_ref$fullWidth,_ref$blueBackground=_ref.blueBackground,blueBackground=_ref$blueBackground===void 0?false:_ref$blueBackground,_ref$className=_ref.className,className=_ref$className===void 0?'j40-grid-container ':_ref$className;// is it a blue background strip?\nclassName+=blueBackground?'j40-main-grid-blue-bk ':'';return fullWidth?/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\",{className:'j40-grid-container '+className},children):/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.GridContainer,{containerSize:'desktop-lg',className:'j40-grid-container '+className},children);};/* harmony default export */ __webpack_exports__[\"Z\"] = (J40MainGridContainer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyLnRzeD84ODk4Il0sIm5hbWVzIjpbIko0ME1haW5HcmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJmdWxsV2lkdGgiLCJibHVlQmFja2dyb3VuZCIsImNsYXNzTmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQVdBLEdBQU1BLHFCQUFvQixDQUFHLFFBQXZCQSxxQkFBdUIsTUFJMEIsSUFIckRDLFNBR3FELE1BSHJEQSxRQUdxRCxxQkFGckRDLFNBRXFELENBRnJEQSxTQUVxRCx5QkFGekMsS0FFeUMseUNBRHJEQyxjQUNxRCxDQURyREEsY0FDcUQsOEJBRHBDLEtBQ29DLHlDQUFyREMsU0FBcUQsQ0FBckRBLFNBQXFELHlCQUF6QyxxQkFBeUMsZ0JBQ3JEO0FBQ0FBLFNBQVMsRUFBS0QsY0FBYyxDQUFHLHdCQUFILENBQThCLEVBQTFELENBRUEsTUFBT0QsVUFBUyxjQUNkLHdEQUNFLFNBQVMsQ0FBRSxzQkFBd0JFLFNBRHJDLEVBRUdILFFBRkgsQ0FEYyxjQU1kLGlEQUFDLGtFQUFELEVBQ0UsYUFBYSxDQUFFLFlBRGpCLENBRUUsU0FBUyxDQUFFLHNCQUF3QkcsU0FGckMsRUFHR0gsUUFISCxDQU5GLENBWUQsQ0FwQkQsQ0FzQkEseURBQWVELG9CQUFmIiwiZmlsZSI6IjY0NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUcnVzc3dvcmtzIEdyaWRDb250YWluZXIgd29uJ3QgYWxsb3cgaXQgdG8gc3BhbiAxMDAlIG9mIHRoZSBwYWdlLCBzb1xuLy8gdGhpcyB3b3JrcyBhcm91bmQgaXQgYW5kIHRyaWVzIHRvIGhpZGUgdGhlIGNvbXBsZXhpdHkgaW4gY29tcG9uZW50XG5pbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lcn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbnRlcmZhY2UgSUxheW91dFByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgZnVsbFdpZHRoPzogYm9vbGVhbixcbiAgIGJsdWVCYWNrZ3JvdW5kPzogYm9vbGVhbixcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IEo0ME1haW5HcmlkQ29udGFpbmVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGZ1bGxXaWR0aCA9IGZhbHNlLFxuICBibHVlQmFja2dyb3VuZCA9IGZhbHNlLFxuICBjbGFzc05hbWUgPSAnajQwLWdyaWQtY29udGFpbmVyICd9OiBJTGF5b3V0UHJvcHMpID0+IHtcbiAgLy8gaXMgaXQgYSBibHVlIGJhY2tncm91bmQgc3RyaXA/XG4gIGNsYXNzTmFtZSArPSAoYmx1ZUJhY2tncm91bmQgPyAnajQwLW1haW4tZ3JpZC1ibHVlLWJrICcgOiAnJyk7XG5cbiAgcmV0dXJuIGZ1bGxXaWR0aCA/IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9eydqNDAtZ3JpZC1jb250YWluZXIgJyArIGNsYXNzTmFtZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICkgOiAoXG4gICAgPEdyaWRDb250YWluZXJcbiAgICAgIGNvbnRhaW5lclNpemU9eydkZXNrdG9wLWxnJ31cbiAgICAgIGNsYXNzTmFtZT17J2o0MC1ncmlkLWNvbnRhaW5lciAnICsgY2xhc3NOYW1lfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0dyaWRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYWluR3JpZENvbnRhaW5lcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6445\n")},1265: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 */ pages; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar lib = __webpack_require__(4424);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 4 modules\nvar layout = __webpack_require__(828);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar react_uswds_lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/components/AboutCard/AboutCard.tsx\n// the \"body\" section is the child object to allow for html versus just text\nvar AboutCard=function AboutCard(props){if(props.size==='large'){// large are the cards on top\n// note it uses a top className='j40-aboutcard-lg-card'\nreturn/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:true},gap:'lg',className:props.className||''},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true,className:'j40-aboutcard-lg-card'},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:3},className:'j40-aboutpage-image-container'},/*#__PURE__*/react.createElement(\"img\",{className:'j40-aboutcard-image',alt:props.header,src:props.imgSrc})),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:9}},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h3\",{className:'j40-section-header'},props.header),/*#__PURE__*/react.createElement(\"div\",{className:'j40-section-body'},props.children)))));}else{// small are the cards on the bottom\n// note it uses a top className='j40-aboutcard-sm-card'\nreturn/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:true},gap:'lg',className:props.className||''},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true,className:'j40-aboutcard-sm-card'},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:2},className:'j40-aboutpage-image-container'},/*#__PURE__*/react.createElement(\"img\",{className:'j40-aboutcard-image',alt:props.header,src:props.imgSrc})),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:9}},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h3\",{className:'j40-section-header'},props.header),/*#__PURE__*/react.createElement(\"div\",{className:'j40-section-body'},props.children),/*#__PURE__*/react.createElement(\"div\",{className:'j40-section-footer'},props.actionOpenInNewTab?/*#__PURE__*/react.createElement(\"a\",{className:'j40-aboutcard-link',href:props.actionUrl,target:\"_blank\",rel:\"noreferrer\"},props.actionText):/*#__PURE__*/react.createElement(\"a\",{className:'j40-aboutcard-link',href:props.actionUrl},props.actionText)))),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:1},' ')));}};/* harmony default export */ var AboutCard_AboutCard = (AboutCard);\n;// CONCATENATED MODULE: ./src/images/about-usmap.svg\n/* harmony default export */ var about_usmap = (__webpack_require__.p + \"static/about-usmap-958107feab7ce45224df0f603908db2d.svg\");\n;// CONCATENATED MODULE: ./src/images/about-j40.svg\n/* harmony default export */ var about_j40 = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTU0LjcxIiBoZWlnaHQ9IjIyOTcuNDIiIHZpZXdCb3g9IjAgMCAyMTU0LjcxIDIyOTcuNDIiPjxkZWZzPjxzdHlsZT4uYXtmaWxsOiNjMWMxYzE7fS5ie2ZvbnQtc2l6ZTo1ODAuMjRweDtmaWxsOiMxYzUwN2Y7Zm9udC1mYW1pbHk6QXJpYWwtQm9sZE1ULCBBcmlhbDtmb250LXdlaWdodDo3MDA7fS5je2ZpbGw6bm9uZTt9LmR7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48Y2lyY2xlIGNsYXNzPSJhIiBjeD0iMTA3Ny4zNiIgY3k9IjEyMjAuMDYiIHI9IjEwNzcuMzYiLz48dGV4dCBjbGFzcz0iYiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTg0Ljk0IDE4MTcuMTMpIj40MCU8L3RleHQ+PHJlY3QgY2xhc3M9ImMiIHg9IjMxNS4zIiB3aWR0aD0iMTU2OS43NCIgaGVpZ2h0PSIxNTY5Ljc0Ii8+PHBhdGggY2xhc3M9ImQiIGQ9Ik0xMTA1LjM0LDc1Mi4xNGMxMDYuNjEsMCwyMDAuOCwyNS41MSwyNzcuMzIsNTguODcsNzAuNjQsMzEuMzksMTE1LjEyLDEwMiwxMTUuMTIsMTc4LjU2djEwNS45NUg3MTIuOTFWOTkwLjIyQzcxMi45MSw5MTMsNzU3LjM4LDg0Mi40LDgyOCw4MTEuNjYsOTA0LjU1LDc3Ny42NSw5OTguNzMsNzUyLjE0LDExMDUuMzQsNzUyLjE0Wk01ODIuMDksNzY4LjVjNzEuOTUsMCwxMzAuODItNTguODcsMTMwLjgyLTEzMC44MlM2NTQsNTA2Ljg3LDU4Mi4wOSw1MDYuODcsNDUxLjI4LDU2NS43NCw0NTEuMjgsNjM3LjY4LDUxMC4xNSw3NjguNSw1ODIuMDksNzY4LjVaTTY1Niw4NDAuNDRjLTI0LjItMy45Mi00OC40LTYuNTQtNzMuOTEtNi41NGE0NTQuNTYsNDU0LjU2LDAsMCwwLTE4MS44MiwzNy45NCwxMzEuNTIsMTMxLjUyLDAsMCwwLTc5LjgsMTIxdjEwMi42OEg2MTQuOFY5OTAuMjJDNjE0LjgsOTM1LjkzLDYyOS44NCw4ODQuOTIsNjU2LDg0MC40NFptOTcyLjU5LTcxLjk0YzcxLjk0LDAsMTMwLjgxLTU4Ljg3LDEzMC44MS0xMzAuODJzLTU4Ljg3LTEzMC44MS0xMzAuODEtMTMwLjgxLTEzMC44MSw1OC44Ny0xMzAuODEsMTMwLjgxUzE1NTYuNjQsNzY4LjUsMTYyOC41OSw3NjguNVptMjYxLjYyLDIyNC4zNGExMzEuNTEsMTMxLjUxLDAsMCwwLTc5LjgtMTIxLDQ1NC41Niw0NTQuNTYsMCwwLDAtMTgxLjgyLTM3Ljk0Yy0yNS41MSwwLTQ5LjcxLDIuNjItNzMuOTEsNi41NCwyNi4xNiw0NC40OCw0MS4yLDk1LjQ5LDQxLjIsMTQ5Ljc4djEwNS4zaDI5NC4zM1pNMTEwNS4zNCwzMTAuNjVBMTk2LjIyLDE5Ni4yMiwwLDEsMSw5MDkuMTIsNTA2Ljg3LDE5NiwxOTYsMCwwLDEsMTEwNS4zNCwzMTAuNjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjcuOTggMTI0LjU0KSIvPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/account_balance.svg\n/* harmony default export */ var account_balance = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxnPjxyZWN0IGhlaWdodD0iNyIgd2lkdGg9IjMiIHg9IjQiIHk9IjEwIi8+PHJlY3QgaGVpZ2h0PSI3IiB3aWR0aD0iMyIgeD0iMTAuNSIgeT0iMTAiLz48cmVjdCBoZWlnaHQ9IjMiIHdpZHRoPSIyMCIgeD0iMiIgeT0iMTkiLz48cmVjdCBoZWlnaHQ9IjciIHdpZHRoPSIzIiB4PSIxNyIgeT0iMTAiLz48cG9seWdvbiBwb2ludHM9IjEyLDEgMiw2IDIsOCAyMiw4IDIyLDYiLz48L2c+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/groups.svg\n/* harmony default export */ var groups = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PGc+PHBhdGggZD0iTTEyLDEyLjc1YzEuNjMsMCwzLjA3LDAuMzksNC4yNCwwLjljMS4wOCwwLjQ4LDEuNzYsMS41NiwxLjc2LDIuNzNMMTgsMThINmwwLTEuNjFjMC0xLjE4LDAuNjgtMi4yNiwxLjc2LTIuNzMgQzguOTMsMTMuMTQsMTAuMzcsMTIuNzUsMTIsMTIuNzV6IE00LDEzYzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMyLDEyLjEsMi45LDEzLDQsMTN6IE01LjEzLDE0LjEgQzQuNzYsMTQuMDQsNC4zOSwxNCw0LDE0Yy0wLjk5LDAtMS45MywwLjIxLTIuNzgsMC41OEMwLjQ4LDE0LjksMCwxNS42MiwwLDE2LjQzVjE4bDQuNSwwdi0xLjYxQzQuNSwxNS41Niw0LjczLDE0Ljc4LDUuMTMsMTQuMXogTTIwLDEzYzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMxOCwxMi4xLDE4LjksMTMsMjAsMTN6IE0yNCwxNi40M2MwLTAuODEtMC40OC0xLjUzLTEuMjItMS44NSBDMjEuOTMsMTQuMjEsMjAuOTksMTQsMjAsMTRjLTAuMzksMC0wLjc2LDAuMDQtMS4xMywwLjFjMC40LDAuNjgsMC42MywxLjQ2LDAuNjMsMi4yOVYxOGw0LjUsMFYxNi40M3ogTTEyLDZjMS42NiwwLDMsMS4zNCwzLDMgYzAsMS42Ni0xLjM0LDMtMywzcy0zLTEuMzQtMy0zQzksNy4zNCwxMC4zNCw2LDEyLDZ6Ii8+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/comment.svg\n/* harmony default export */ var comment = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTIxLjk5IDRjMC0xLjEtLjg5LTItMS45OS0ySDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTRsNCA0LS4wMS0xOHpNMTggMTRINnYtMmgxMnYyem0wLTNINlY5aDEydjJ6bTAtM0g2VjZoMTJ2MnoiLz48L3N2Zz4=\");\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/AboutCard/AboutCardsContainer.tsx\n// note: this assumes a J40MainGridContainer container!\nvar AboutCardsContainer=function AboutCardsContainer(props){return/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true,gap:'lg',className:'j40-aboutcard-container '+(props.className||'')},props.children);};/* harmony default export */ var AboutCard_AboutCardsContainer = (AboutCardsContainer);\n;// CONCATENATED MODULE: ./src/pages/index.tsx\n// @ts-ignore\n// @ts-ignore\n// markup\nvar IndexPage=function IndexPage(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({presidentalLinkUri:{id:'index.presidentalLinkUri',defaultMessage:'https://www.whitehouse.gov/briefing-room/'+'presidential-actions/2021/01/27/'+'executive-order-on-tackling-the-climate-'+'crisis-at-home-and-abroad/',description:'Link url to presidential actions executive order. Part of paragraph 3'},presidentalLinkLabel:{id:'index.presidentalLinkLabel',defaultMessage:'Executive Order on Tackling the Climate Crisis at Home and Abroad.',description:'Link url to presidential actions executive order. Part of paragraph 3'},transparentLabel:{id:'index.section3.transparentLabel',defaultMessage:'Transparent:',description:'Italic label for 1st paragraph of section 3 on index page'},inclusiveLabel:{id:'index.section3.inclusiveLabel',defaultMessage:'Inclusive:',description:'Italic label for 2nd paragraph of section 3 on index page'},iterativeLabel:{id:'index.section3.iterativeLabel',defaultMessage:'Iterative:',description:'Italic label for 3rd paragraph of section 3 on index page'}});return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-about-page'},/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'large',imgSrc:about_usmap,header:'About the screening tool'},/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'index.aboutContent.p1',description:'paragraph 1 of main content on index page',defaultMessage:\"\\n On January 27, 2021, President Biden directed the Council on\\n Environmental Quality (CEQ) to create a climate and economic\\n justice screening tool. The purpose of the tool is to provide\\n socioeconomic, environmental, and climate information and data to\\n help inform decisions that may affect disadvantaged communities.\\n The tool is designed to assist Federal agencies in identifying\\n disadvantaged communities for the purposes of the Justice40\\n Initiative. \\n \"}))),/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'large',imgSrc:about_j40,header:'About the Justice40 Initiative'},/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:\"index.aboutContent.p2\",description:'paragraph 2 of main content on index page',defaultMessage:\"\\n The goal of the Justice40 Initiative is for 40 percent of\\n benefits of Federal programs in seven key areas to flow to\\n disadvantaged communities. These seven key areas are: climate\\n change, clean energy and energy efficiency, clean transit,\\n affordable and sustainable housing, training and workforce\\n development, remediation of legacy pollution, and clean water\\n infrastructure.\\n \"}),/*#__PURE__*/react.createElement(\"p\",null,/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'index.aboutContent.p3',description:'paragraph 3 of main content on index page',defaultMessage:\"\\n Read more about the Justice40 Initiative in President Biden\\u2019s \\n {presidentLink}\\n \",values:{presidentLink:/*#__PURE__*/react.createElement(\"a\",{href:intl.formatMessage(messages.presidentalLinkUri),target:\"_blank\",rel:\"noreferrer\"},intl.formatMessage(messages.presidentalLinkLabel))}}))))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true,blueBackground:true},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-about-page'},/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:account_balance,header:'Federal program managers',actionText:'Go to data & methodology',actionUrl:'./methodology'},\"Download the screening tool\\u2019s draft list of prioritized communities and information on how to use it for your program in the future on the data and methodology page.\"),/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:groups,header:'Community members',actionText:'Explore the tool',actionUrl:'./cejst'},\"Find your community or communities that you may be familiar with and check their prioritization information on the map.\")))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-about-page'},/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:comment,header:'Send Feedback',actionText:'Email: screeningtool.feedback@usds.gov',actionUrl:'mailto:screeningtool.feedback@usds.gov'},\"Have ideas about how to acknowledge the on-the-ground experiences of your community?\"),/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:github,header:'Join the open source community',actionText:'Check it out on GitHub',actionUrl:'https://github.com/usds/justice40-tool',actionOpenInNewTab:true},\"The screening tool\\u2019s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.\"))));};/* harmony default export */ var pages = (IndexPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0Fib3V0Q2FyZC9BYm91dENhcmQudHN4PzUwM2YiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvaW1hZ2VzL2Fib3V0LXVzbWFwLnN2Zz82OTIyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2ltYWdlcy9hYm91dC1qNDAuc3ZnPzU0YmIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2FjY291bnRfYmFsYW5jZS5zdmc/NzU4NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ3JvdXBzLnN2Zz8wMGUwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9jb21tZW50LnN2Zz9mYWIyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9naXRodWIuc3ZnPzZiNDQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9BYm91dENhcmQvQWJvdXRDYXJkc0NvbnRhaW5lci50c3g/N2IzMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9pbmRleC50c3g/NDFlMCJdLCJuYW1lcyI6WyJBYm91dENhcmQiLCJwcm9wcyIsInNpemUiLCJjb2wiLCJjbGFzc05hbWUiLCJoZWFkZXIiLCJpbWdTcmMiLCJjaGlsZHJlbiIsImFjdGlvbk9wZW5Jbk5ld1RhYiIsImFjdGlvblVybCIsImFjdGlvblRleHQiLCJBYm91dENhcmRzQ29udGFpbmVyIiwiSW5kZXhQYWdlIiwibG9jYXRpb24iLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJwcmVzaWRlbnRhbExpbmtVcmkiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJwcmVzaWRlbnRhbExpbmtMYWJlbCIsInRyYW5zcGFyZW50TGFiZWwiLCJpbmNsdXNpdmVMYWJlbCIsIml0ZXJhdGl2ZUxhYmVsIiwiYWJvdXRVU01hcEltZyIsImFib3V0SjQwSW1nIiwicHJlc2lkZW50TGluayIsImZvcm1hdE1lc3NhZ2UiLCJhY2NvdW50QmFsYW5jZUljb24iLCJncm91cHNJY29uIiwiY29tbWVudEljb24iLCJnaXRodWJJY29uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBO0FBV0EsR0FBTUEsVUFBUyxDQUFHLFFBQVpBLFVBQVksQ0FBQ0MsS0FBRCxDQUFvRCxDQUNwRSxHQUFJQSxLQUFLLENBQUNDLElBQU4sR0FBZSxPQUFuQixDQUE0QixDQUMxQjtBQUNBO0FBQ0EsbUJBQ0Usb0JBQUMsb0JBQUQsRUFBTSxNQUFNLENBQUUsQ0FBQ0MsR0FBRyxDQUFFLElBQU4sQ0FBZCxDQUEyQixHQUFHLENBQUUsSUFBaEMsQ0FBc0MsU0FBUyxDQUFHRixLQUFLLENBQUNHLFNBQU4sRUFBbUIsRUFBckUsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxDQUFVLFNBQVMsQ0FBRSx1QkFBckIsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLE1BQU0sQ0FBRSxDQUFDRCxHQUFHLENBQUUsQ0FBTixDQUFkLENBQXdCLFNBQVMsQ0FBRSwrQkFBbkMsZUFDRSwyQkFDRSxTQUFTLENBQUUscUJBRGIsQ0FFRSxHQUFHLENBQUVGLEtBQUssQ0FBQ0ksTUFGYixDQUdFLEdBQUcsQ0FBRUosS0FBSyxDQUFDSyxNQUhiLEVBREYsQ0FERixjQVFFLG9CQUFDLG9CQUFELEVBQU0sTUFBTSxDQUFFLENBQUNILEdBQUcsQ0FBRSxDQUFOLENBQWQsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLDBCQUFJLFNBQVMsQ0FBRSxvQkFB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QUFNLENBQUUsZ0NBSFYsQ0FJRSxVQUFVLENBQUUsd0JBSmQsQ0FLRSxTQUFTLENBQUUsd0NBTGIsQ0FNRSxrQkFBa0IsQ0FBRSxJQU50QixtS0FYRixDQUZGLENBcEdGLENBREYsQ0FnSUQsQ0FqS0QsQ0FtS0EsMENBQWVyQixTQUFmIiwiZmlsZSI6IjEyNjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cbi8vIHRoZSBcImJvZHlcIiBzZWN0aW9uIGlzIHRoZSBjaGlsZCBvYmplY3QgdG8gYWxsb3cgZm9yIGh0bWwgdmVyc3VzIGp1c3QgdGV4dFxuaW50ZXJmYWNlIEFib3V0Q2FyZFByb3BzIHtcbiAgaW1nU3JjOiBzdHJpbmc7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBzaXplPzogJ3NtYWxsJyB8ICdsYXJnZSc7XG4gIGFjdGlvblRleHQ/OiBzdHJpbmc7XG4gIGFjdGlvblVybD86IHN0cmluZztcbiAgYWN0aW9uT3BlbkluTmV3VGFiPzogYm9vbGVhbjtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBBYm91dENhcmQgPSAocHJvcHM6IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPEFib3V0Q2FyZFByb3BzPikgPT4ge1xuICBpZiAocHJvcHMuc2l6ZSA9PT0gJ2xhcmdlJykge1xuICAgIC8vIGxhcmdlIGFyZSB0aGUgY2FyZHMgb24gdG9wXG4gICAgLy8gbm90ZSBpdCB1c2VzIGEgdG9wIGNsYXNzTmFtZT0najQwLWFib3V0Y2FyZC1sZy1jYXJkJ1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB0YWJsZXQ9e3tjb2w6IHRydWV9fSBnYXA9eydsZyd9IGNsYXNzTmFtZT17KHByb3BzLmNsYXNzTmFtZSB8fCAnJyl9PlxuICAgICAgICA8R3JpZCByb3cgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1sZy1jYXJkJ30+XG4gICAgICAgICAgPEdyaWQgdGFibGV0PXt7Y29sOiAzfX0gY2xhc3NOYW1lPXsnajQwLWFib3V0cGFnZS1pbWFnZS1jb250YWluZXInfT5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1pbWFnZSd9XG4gICAgICAgICAgICAgIGFsdD17cHJvcHMuaGVhZGVyfVxuICAgICAgICAgICAgICBzcmM9e3Byb3BzLmltZ1NyY30vPlxuICAgICAgICAgIDwvR3JpZD5cblxuICAgICAgICAgIDxHcmlkIHRhYmxldD17e2NvbDogOX19PlxuICAgICAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPXsnajQwLXNlY3Rpb24taGVhZGVyJ30+e3Byb3BzLmhlYWRlcn08L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1zZWN0aW9uLWJvZHknfT57cHJvcHMuY2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9HcmlkPlxuXG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIHNtYWxsIGFyZSB0aGUgY2FyZHMgb24gdGhlIGJvdHRvbVxuICAgIC8vIG5vdGUgaXQgdXNlcyBhIHRvcCBjbGFzc05hbWU9J2o0MC1hYm91dGNhcmQtc20tY2FyZCdcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgdGFibGV0PXt7Y29sOiB0cnVlfX0gZ2FwPXsnbGcnfSBjbGFzc05hbWU9eyhwcm9wcy5jbGFzc05hbWUgfHwgJycpfT5cbiAgICAgICAgPEdyaWQgcm93IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtc20tY2FyZCd9PlxuICAgICAgICAgIDxHcmlkIHRhYmxldD17e2NvbDogMn19IGNsYXNzTmFtZT17J2o0MC1hYm91dHBhZ2UtaW1hZ2UtY29udGFpbmVyJ30+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtaW1hZ2UnfVxuICAgICAgICAgICAgICBhbHQ9e3Byb3BzLmhlYWRlcn1cbiAgICAgICAgICAgICAgc3JjPXtwcm9wcy5pbWdTcmN9Lz5cbiAgICAgICAgICA8L0dyaWQ+XG5cbiAgICAgICAgICA8R3JpZCB0YWJsZXQ9e3tjb2w6IDl9fT5cbiAgICAgICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT17J2o0MC1zZWN0aW9uLWhlYWRlcid9Pntwcm9wcy5oZWFkZXJ9PC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9eydqNDAtc2VjdGlvbi1ib2R5J30+e3Byb3BzLmNoaWxkcmVufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1zZWN0aW9uLWZvb3Rlcid9PlxuICAgICAgICAgICAgICAgIHtwcm9wcy5hY3Rpb25PcGVuSW5OZXdUYWIgP1xuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1saW5rJ31cbiAgICAgICAgICAgICAgICAgICAgaHJlZj17cHJvcHMuYWN0aW9uVXJsfVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICByZWw9XCJub3JlZmVycmVyXCI+e3Byb3BzLmFjdGlvblRleHR9PC9hPiA6XG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydqNDAtYWJvdXRjYXJkLWxpbmsnfVxuICAgICAgICAgICAgICAgICAgICBocmVmPXtwcm9wcy5hY3Rpb25Vcmx9Pntwcm9wcy5hY3Rpb25UZXh0fTwvYT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICA8R3JpZCBjb2w9ezF9PnsnICd9PC9HcmlkPlxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWJvdXRDYXJkO1xuIiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9hYm91dC11c21hcC05NTgxMDdmZWFiN2NlNDUyMjRkZjBmNjAzOTA4ZGIyZC5zdmdcIjsiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJeU1UVTBMamN4SWlCb1pXbG5hSFE5SWpJeU9UY3VORElpSUhacFpYZENiM2c5SWpBZ01DQXlNVFUwTGpjeElESXlPVGN1TkRJaVBqeGtaV1p6UGp4emRIbHNaVDR1WVh0bWFXeHNPaU5qTVdNeFl6RTdmUzVpZTJadmJuUXRjMmw2WlRvMU9EQXVNalJ3ZUR0bWFXeHNPaU14WXpVd04yWTdabTl1ZEMxbVlXMXBiSGs2UVhKcFlXd3RRbTlzWkUxVUxDQkJjbWxoYkR0bWIyNTBMWGRsYVdkb2REbzNNREE3ZlM1amUyWnBiR3c2Ym05dVpUdDlMbVI3Wm1sc2JEb2pabVptTzMwOEwzTjBlV3hsUGp3dlpHVm1jejQ4WTJseVkyeGxJR05zWVhOelBTSmhJaUJqZUQwaU1UQTNOeTR6TmlJZ1kzazlJakV5TWpBdU1EWWlJSEk5SWpFd056Y3VNellpTHo0OGRHVjRkQ0JqYkdGemN6MGlZaUlnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb05UZzBMamswSURFNE1UY3VNVE1wSWo0ME1DVThMM1JsZUhRK1BISmxZM1FnWTJ4aGMzTTlJbU1pSUhnOUlqTXhOUzR6SWlCM2FXUjBhRDBpTVRVMk9TNDNOQ0lnYUdWcFoyaDBQU0l4TlRZNUxqYzBJaTgrUEhCaGRHZ2dZMnhoYzNNOUltUWlJR1E5SWsweE1UQTFMak0wTERjMU1pNHhOR014TURZdU5qRXNNQ3d5TURBdU9Dd3lOUzQxTVN3eU56Y3VNeklzTlRndU9EY3NOekF1TmpRc016RXVNemtzTVRFMUxqRXlMREV3TWl3eE1UVXVNVElzTVRjNExqVTJkakV3TlM0NU5VZzNNVEl1T1RGV09Ua3dMakl5UXpjeE1pNDVNU3c1TVRNc056VTNMak00TERnME1pNDBMRGd5T0N3NE1URXVOallzT1RBMExqVTFMRGMzTnk0Mk5TdzVPVGd1TnpNc056VXlMakUwTERFeE1EVXVNelFzTnpVeUxqRTBXazAxT0RJdU1Ea3NOelk0TGpWak56RXVPVFVzTUN3eE16QXVPREl0TlRndU9EY3NNVE13TGpneUxURXpNQzQ0TWxNMk5UUXNOVEEyTGpnM0xEVTRNaTR3T1N3MU1EWXVPRGNzTkRVeExqSTRMRFUyTlM0M05DdzBOVEV1TWpnc05qTTNMalk0TERVeE1DNHhOU3czTmpndU5TdzFPREl1TURrc056WTRMalZhVFRZMU5pdzROREF1TkRSakxUSTBMakl0TXk0NU1pMDBPQzQwTFRZdU5UUXROek11T1RFdE5pNDFOR0UwTlRRdU5UWXNORFUwTGpVMkxEQXNNQ3d3TFRFNE1TNDRNaXd6Tnk0NU5Dd3hNekV1TlRJc01UTXhMalV5TERBc01Dd3dMVGM1TGpnc01USXhkakV3TWk0Mk9FZzJNVFF1T0ZZNU9UQXVNakpETmpFMExqZ3NPVE0xTGprekxEWXlPUzQ0TkN3NE9EUXVPVElzTmpVMkxEZzBNQzQwTkZwdE9UY3lMalU1TFRjeExqazBZemN4TGprMExEQXNNVE13TGpneExUVTRMamczTERFek1DNDRNUzB4TXpBdU9ESnpMVFU0TGpnM0xURXpNQzQ0TVMweE16QXVPREV0TVRNd0xqZ3hMVEV6TUM0NE1TdzFPQzQ0TnkweE16QXVPREVzTVRNd0xqZ3hVekUxTlRZdU5qUXNOelk0TGpVc01UWXlPQzQxT1N3M05qZ3VOVnB0TWpZeExqWXlMREl5TkM0ek5HRXhNekV1TlRFc01UTXhMalV4TERBc01Dd3dMVGM1TGpndE1USXhMRFExTkM0MU5pdzBOVFF1TlRZc01Dd3dMREF0TVRneExqZ3lMVE0zTGprMFl5MHlOUzQxTVN3d0xUUTVMamN4TERJdU5qSXROek11T1RFc05pNDFOQ3d5Tmk0eE5pdzBOQzQwT0N3ME1TNHlMRGsxTGpRNUxEUXhMaklzTVRRNUxqYzRkakV3TlM0emFESTVOQzR6TTFwTk1URXdOUzR6TkN3ek1UQXVOalZCTVRrMkxqSXlMREU1Tmk0eU1pd3dMREVzTVN3NU1Ea3VNVElzTlRBMkxqZzNMREU1Tml3eE9UWXNNQ3d3TERFc01URXdOUzR6TkN3ek1UQXVOalZhSWlCMGNtRnVjMlp2Y20wOUluUnlZVzV6YkdGMFpTZ3RNamN1T1RnZ01USTBMalUwS1NJdlBqd3ZjM1puUGc9PVwiIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJR1Z1WVdKc1pTMWlZV05yWjNKdmRXNWtQU0p1WlhjZ01DQXdJREkwSURJMElpQm9aV2xuYUhROUlqSTBJaUIyYVdWM1FtOTRQU0l3SURBZ01qUWdNalFpSUhkcFpIUm9QU0l5TkNJK1BHYytQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BDOW5QanhuUGp4blBqeHlaV04wSUdobGFXZG9kRDBpTnlJZ2QybGtkR2c5SWpNaUlIZzlJalFpSUhrOUlqRXdJaTgrUEhKbFkzUWdhR1ZwWjJoMFBTSTNJaUIzYVdSMGFEMGlNeUlnZUQwaU1UQXVOU0lnZVQwaU1UQWlMejQ4Y21WamRDQm9aV2xuYUhROUlqTWlJSGRwWkhSb1BTSXlNQ0lnZUQwaU1pSWdlVDBpTVRraUx6NDhjbVZqZENCb1pXbG5hSFE5SWpjaUlIZHBaSFJvUFNJeklpQjRQU0l4TnlJZ2VUMGlNVEFpTHo0OGNHOXNlV2R2YmlCd2IybHVkSE05SWpFeUxERWdNaXcySURJc09DQXlNaXc0SURJeUxEWWlMejQ4TDJjK1BDOW5Qand2YzNablBnPT1cIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURJMElESTBJaUJvWldsbmFIUTlJakkwSWlCMmFXVjNRbTk0UFNJd0lEQWdNalFnTWpRaUlIZHBaSFJvUFNJeU5DSStQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BHYytQSEJoZEdnZ1pEMGlUVEV5TERFeUxqYzFZekV1TmpNc01Dd3pMakEzTERBdU16a3NOQzR5TkN3d0xqbGpNUzR3T0N3d0xqUTRMREV1TnpZc01TNDFOaXd4TGpjMkxESXVOek5NTVRnc01UaElObXd3TFRFdU5qRmpNQzB4TGpFNExEQXVOamd0TWk0eU5pd3hMamMyTFRJdU56TWdRemd1T1RNc01UTXVNVFFzTVRBdU16Y3NNVEl1TnpVc01USXNNVEl1TnpWNklFMDBMREV6WXpFdU1Td3dMREl0TUM0NUxESXRNbU13TFRFdU1TMHdMamt0TWkweUxUSnpMVElzTUM0NUxUSXNNa015TERFeUxqRXNNaTQ1TERFekxEUXNNVE42SUUwMUxqRXpMREUwTGpFZ1F6UXVOellzTVRRdU1EUXNOQzR6T1N3eE5DdzBMREUwWXkwd0xqazVMREF0TVM0NU15d3dMakl4TFRJdU56Z3NNQzQxT0VNd0xqUTRMREUwTGprc01Dd3hOUzQyTWl3d0xERTJMalF6VmpFNGJEUXVOU3d3ZGkweExqWXhRelF1TlN3eE5TNDFOaXcwTGpjekxERTBMamM0TERVdU1UTXNNVFF1TVhvZ1RUSXdMREV6WXpFdU1Td3dMREl0TUM0NUxESXRNbU13TFRFdU1TMHdMamt0TWkweUxUSnpMVElzTUM0NUxUSXNNa014T0N3eE1pNHhMREU0TGprc01UTXNNakFzTVRONklFMHlOQ3d4Tmk0ME0yTXdMVEF1T0RFdE1DNDBPQzB4TGpVekxURXVNakl0TVM0NE5TQkRNakV1T1RNc01UUXVNakVzTWpBdU9Ua3NNVFFzTWpBc01UUmpMVEF1TXprc01DMHdMamMyTERBdU1EUXRNUzR4TXl3d0xqRmpNQzQwTERBdU5qZ3NNQzQyTXl3eExqUTJMREF1TmpNc01pNHlPVll4T0d3MExqVXNNRll4Tmk0ME0zb2dUVEV5TERaak1TNDJOaXd3TERNc01TNHpOQ3d6TERNZ1l6QXNNUzQyTmkweExqTTBMRE10TXl3emN5MHpMVEV1TXpRdE15MHpRemtzTnk0ek5Dd3hNQzR6TkN3MkxERXlMRFo2SWk4K1BDOW5Qand2YzNablBnPT1cIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdobGFXZG9kRDBpTWpRaUlIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSWdkMmxrZEdnOUlqSTBJajQ4Y0dGMGFDQmtQU0pOTUNBd2FESTBkakkwU0RCNklpQm1hV3hzUFNKdWIyNWxJaTgrUEhCaGRHZ2daRDBpVFRJeExqazVJRFJqTUMweExqRXRMamc1TFRJdE1TNDVPUzB5U0RSakxURXVNU0F3TFRJZ0xqa3RNaUF5ZGpFeVl6QWdNUzR4TGprZ01pQXlJREpvTVRSc05DQTBMUzR3TVMweE9IcE5NVGdnTVRSSU5uWXRNbWd4TW5ZeWVtMHdMVE5JTmxZNWFERXlkako2YlRBdE0wZzJWalpvTVRKMk1ub2lMejQ4TDNOMlp6ND1cIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJK1BHUmxabk0rUEhOMGVXeGxQaTVqYkhNdE1YdG1hV3hzTFhKMWJHVTZaWFpsYm05a1pEdDlQQzl6ZEhsc1pUNDhMMlJsWm5NK1BIQmhkR2dnYVdROUlrZHBkR2gxWWlJZ1kyeGhjM005SW1Oc2N5MHhJaUJrUFNKTk1USXNNa0V4TUN3eE1Dd3dMREFzTUN3NExqZzBMREl4TGpRNVl5NDFMakE1TGpZNExTNHlNaTQyT0MwdU5EaHpNQzB1T0Rjc01DMHhMamRETmk0M015d3hPUzQ1TVN3MkxqRTBMREU0TERZdU1UUXNNVGhCTWk0Mk9Td3lMalk1TERBc01Dd3dMRFVzTVRZdU5XTXRMamt4TFM0Mk1pNHdOeTB1TmpFdU1EY3RMall4WVRJdU1UTXNNaTR4TXl3d0xEQXNNU3d4TGpVekxERXNNaTR4TkN3eUxqRTBMREFzTUN3d0xESXVPVEV1T0RNc01pNHhOaXd5TGpFMkxEQXNNQ3d4TEM0Mk15MHhMak0wUXpnc01UWXVNVGNzTlM0Mk1pd3hOUzR6TVN3MUxqWXlMREV4TGpRNFlUTXVPRGtzTXk0NE9Td3dMREFzTVN3eExUSXVOamtzTXk0MU55d3pMalUzTERBc01Dd3hMQzR4TFRJdU5qUnpMamcwTFM0eU55d3lMamMxTERGaE9TNDJNeXc1TGpZekxEQXNNQ3d4TERVc01HTXhMamt4TFRFdU1qa3NNaTQzTlMweExESXVOelV0TVdFekxqVTNMRE11TlRjc01Dd3dMREVzTGpFc01pNDJOQ3d6TGpnNUxETXVPRGtzTUN3d0xERXNNU3d5TGpZNVl6QXNNeTQ0TkMweUxqTTBMRFF1TmpndE5DNDFOeXcwTGprellUSXVNemtzTWk0ek9Td3dMREFzTVN3dU5qZ3NNUzQ0TldNd0xERXVNelFzTUN3eUxqUXlMREFzTWk0M05YTXVNVGd1TlRndU5qa3VORGhCTVRBc01UQXNNQ3d3TERBc01USXNNbG9pTHo0OEwzTjJaejQ9XCIiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cbnR5cGUgQWJvdXRDYXJkc0NvbnRhaW5lclByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuLy8gbm90ZTogdGhpcyBhc3N1bWVzIGEgSjQwTWFpbkdyaWRDb250YWluZXIgY29udGFpbmVyIVxuY29uc3QgQWJvdXRDYXJkc0NvbnRhaW5lciA9IChwcm9wczogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48QWJvdXRDYXJkc0NvbnRhaW5lclByb3BzPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHJvdyBnYXA9eydsZyd9IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtY29udGFpbmVyICcgKyAocHJvcHMuY2xhc3NOYW1lIHx8ICcnKX0+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWJvdXRDYXJkc0NvbnRhaW5lcjtcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlLCB1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWxlcnRXcmFwcGVyJztcbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyJztcbmltcG9ydCBMYXlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuaW1wb3J0IEFib3V0Q2FyZCBmcm9tICcuLi9jb21wb25lbnRzL0Fib3V0Q2FyZC9BYm91dENhcmQnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgYWJvdXRVU01hcEltZyBmcm9tICcuLi9pbWFnZXMvYWJvdXQtdXNtYXAuc3ZnJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBhYm91dEo0MEltZyBmcm9tICcuLi9pbWFnZXMvYWJvdXQtajQwLnN2Zyc7XG5pbXBvcnQgYWNjb3VudEJhbGFuY2VJY29uIC8vIEB0cy1pZ25vcmVcbiAgZnJvbSAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvYWNjb3VudF9iYWxhbmNlLnN2Zyc7XG5cbmltcG9ydCBncm91cHNJY29uIGZyb20gLy8gQHRzLWlnbm9yZVxuICAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ3JvdXBzLnN2Zyc7XG5cbmltcG9ydCBjb21tZW50SWNvbiBmcm9tIC8vIEB0cy1pZ25vcmVcbiAgJy9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2NvbW1lbnQuc3ZnJztcblxuaW1wb3J0IGdpdGh1Ykljb24gZnJvbSAvLyBAdHMtaWdub3JlXG4gICcvbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9naXRodWIuc3ZnJztcbmltcG9ydCBBYm91dENhcmRzQ29udGFpbmVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWJvdXRDYXJkL0Fib3V0Q2FyZHNDb250YWluZXInO1xuXG5cbmludGVyZmFjZSBJbmRleFBhZ2VQcm9wcyB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvbjtcbn1cblxuLy8gbWFya3VwXG5jb25zdCBJbmRleFBhZ2UgPSAoe2xvY2F0aW9ufTogSW5kZXhQYWdlUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgcHJlc2lkZW50YWxMaW5rVXJpOiB7XG4gICAgICBpZDogJ2luZGV4LnByZXNpZGVudGFsTGlua1VyaScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ2h0dHBzOi8vd3d3LndoaXRlaG91c2UuZ292L2JyaWVmaW5nLXJvb20vJyArXG4gICAgICAgICdwcmVzaWRlbnRpYWwtYWN0aW9ucy8yMDIxLzAxLzI3LycgK1xuICAgICAgICAnZXhlY3V0aXZlLW9yZGVyLW9uLXRhY2tsaW5nLXRoZS1jbGltYXRlLScgK1xuICAgICAgICAnY3Jpc2lzLWF0LWhvbWUtYW5kLWFicm9hZC8nLFxuICAgICAgZGVzY3JpcHRpb246ICdMaW5rIHVybCB0byBwcmVzaWRlbnRpYWwgYWN0aW9ucyBleGVjdXRpdmUgb3JkZXIuIFBhcnQgb2YgcGFyYWdyYXBoIDMnLFxuICAgIH0sXG4gICAgcHJlc2lkZW50YWxMaW5rTGFiZWw6IHtcbiAgICAgIGlkOiAnaW5kZXgucHJlc2lkZW50YWxMaW5rTGFiZWwnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdFeGVjdXRpdmUgT3JkZXIgb24gVGFja2xpbmcgdGhlIENsaW1hdGUgQ3Jpc2lzIGF0IEhvbWUgYW5kIEFicm9hZC4nLFxuICAgICAgZGVzY3JpcHRpb246ICdMaW5rIHVybCB0byBwcmVzaWRlbnRpYWwgYWN0aW9ucyBleGVjdXRpdmUgb3JkZXIuIFBhcnQgb2YgcGFyYWdyYXBoIDMnLFxuICAgIH0sXG4gICAgdHJhbnNwYXJlbnRMYWJlbDoge1xuICAgICAgaWQ6ICdpbmRleC5zZWN0aW9uMy50cmFuc3BhcmVudExhYmVsJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVHJhbnNwYXJlbnQ6JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSXRhbGljIGxhYmVsIGZvciAxc3QgcGFyYWdyYXBoIG9mIHNlY3Rpb24gMyBvbiBpbmRleCBwYWdlJyxcbiAgICB9LFxuICAgIGluY2x1c2l2ZUxhYmVsOiB7XG4gICAgICBpZDogJ2luZGV4LnNlY3Rpb24zLmluY2x1c2l2ZUxhYmVsJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSW5jbHVzaXZlOicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0l0YWxpYyBsYWJlbCBmb3IgMm5kIHBhcmFncmFwaCBvZiBzZWN0aW9uIDMgb24gaW5kZXggcGFnZScsXG4gICAgfSxcbiAgICBpdGVyYXRpdmVMYWJlbDoge1xuICAgICAgaWQ6ICdpbmRleC5zZWN0aW9uMy5pdGVyYXRpdmVMYWJlbCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0l0ZXJhdGl2ZTonLFxuICAgICAgZGVzY3JpcHRpb246ICdJdGFsaWMgbGFiZWwgZm9yIDNyZCBwYXJhZ3JhcGggb2Ygc2VjdGlvbiAzIG9uIGluZGV4IHBhZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPExheW91dCBsb2NhdGlvbj17bG9jYXRpb259PlxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e3RydWV9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXtmYWxzZX0vPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyIGNsYXNzTmFtZT17J2o0MC1hYm91dC1wYWdlJ30+XG5cbiAgICAgICAgPEFib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J2xhcmdlJ31cbiAgICAgICAgICAgIGltZ1NyYz17YWJvdXRVU01hcEltZ31cbiAgICAgICAgICAgIGhlYWRlcj17J0Fib3V0IHRoZSBzY3JlZW5pbmcgdG9vbCd9PlxuXG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD17J2luZGV4LmFib3V0Q29udGVudC5wMSd9XG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXsncGFyYWdyYXBoIDEgb2YgbWFpbiBjb250ZW50IG9uIGluZGV4IHBhZ2UnfVxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17YFxuICAgICAgICAgICAgICBPbiBKYW51YXJ5IDI3LCAyMDIxLCBQcmVzaWRlbnQgQmlkZW4gZGlyZWN0ZWQgdGhlIENvdW5jaWwgb25cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnRhbCBRdWFsaXR5IChDRVEpIHRvIGNyZWF0ZSBhIGNsaW1hdGUgYW5kIGVjb25vbWljXG4gICAgICAgICAgICAgIGp1c3RpY2Ugc2NyZWVuaW5nIHRvb2wuIFRoZSBwdXJwb3NlIG9mIHRoZSB0b29sIGlzIHRvIHByb3ZpZGVcbiAgICAgICAgICAgICAgc29jaW9lY29ub21pYywgZW52aXJvbm1lbnRhbCwgYW5kIGNsaW1hdGUgaW5mb3JtYXRpb24gYW5kIGRhdGEgdG9cbiAgICAgICAgICAgICAgaGVscCBpbmZvcm0gZGVjaXNpb25zIHRoYXQgbWF5IGFmZmVjdCBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzLlxuICAgICAgICAgICAgICBUaGUgdG9vbCBpcyBkZXNpZ25lZCB0byBhc3Npc3QgRmVkZXJhbCBhZ2VuY2llcyBpbiBpZGVudGlmeWluZ1xuICAgICAgICAgICAgICBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIEp1c3RpY2U0MFxuICAgICAgICAgICAgICBJbml0aWF0aXZlLiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgYH0vPlxuXG4gICAgICAgICAgPC9BYm91dENhcmQ+XG4gICAgICAgIDwvQWJvdXRDYXJkc0NvbnRhaW5lcj5cblxuICAgICAgICA8QWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgICAgICA8QWJvdXRDYXJkXG4gICAgICAgICAgICBzaXplPXsnbGFyZ2UnfVxuICAgICAgICAgICAgaW1nU3JjPXthYm91dEo0MEltZ31cbiAgICAgICAgICAgIGhlYWRlcj17J0Fib3V0IHRoZSBKdXN0aWNlNDAgSW5pdGlhdGl2ZSd9PlxuXG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD1cImluZGV4LmFib3V0Q29udGVudC5wMlwiXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXsncGFyYWdyYXBoIDIgb2YgbWFpbiBjb250ZW50IG9uIGluZGV4IHBhZ2UnfVxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17YFxuICAgICAgICAgICAgICAgIFRoZSBnb2FsIG9mIHRoZSBKdXN0aWNlNDAgSW5pdGlhdGl2ZSBpcyBmb3IgNDAgcGVyY2VudCBvZlxuICAgICAgICAgICAgICAgIGJlbmVmaXRzIG9mIEZlZGVyYWwgcHJvZ3JhbXMgaW4gc2V2ZW4ga2V5IGFyZWFzIHRvIGZsb3cgdG9cbiAgICAgICAgICAgICAgICBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzLiBUaGVzZSBzZXZlbiBrZXkgYXJlYXMgYXJlOiBjbGltYXRlXG4gICAgICAgICAgICAgICAgY2hhbmdlLCBjbGVhbiBlbmVyZ3kgYW5kIGVuZXJneSBlZmZpY2llbmN5LCBjbGVhbiB0cmFuc2l0LFxuICAgICAgICAgICAgICAgIGFmZm9yZGFibGUgYW5kIHN1c3RhaW5hYmxlIGhvdXNpbmcsIHRyYWluaW5nIGFuZCB3b3JrZm9yY2VcbiAgICAgICAgICAgICAgICBkZXZlbG9wbWVudCwgcmVtZWRpYXRpb24gb2YgbGVnYWN5IHBvbGx1dGlvbiwgYW5kIGNsZWFuIHdhdGVyXG4gICAgICAgICAgICAgICAgaW5mcmFzdHJ1Y3R1cmUuXG4gICAgICAgICAgICAgICAgICBgfS8+XG5cbiAgICAgICAgICAgIDxwPjxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgIGlkPXsnaW5kZXguYWJvdXRDb250ZW50LnAzJ31cbiAgICAgICAgICAgICAgZGVzY3JpcHRpb249eydwYXJhZ3JhcGggMyBvZiBtYWluIGNvbnRlbnQgb24gaW5kZXggcGFnZSd9XG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPXtgXG4gICAgICAgICAgICAgICAgICBSZWFkIG1vcmUgYWJvdXQgdGhlIEp1c3RpY2U0MCBJbml0aWF0aXZlIGluIFByZXNpZGVudCBCaWRlbuKAmXMgXG4gICAgICAgICAgICAgICAgICB7cHJlc2lkZW50TGlua31cbiAgICAgICAgICAgICAgICAgIGB9XG4gICAgICAgICAgICAgIHZhbHVlcz17e1xuICAgICAgICAgICAgICAgIHByZXNpZGVudExpbms6XG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBocmVmPXtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucHJlc2lkZW50YWxMaW5rVXJpKX1cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiPntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucHJlc2lkZW50YWxMaW5rTGFiZWwpfVxuICAgICAgICAgICAgICAgICAgPC9hPixcbiAgICAgICAgICAgICAgfX0vPlxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPC9BYm91dENhcmQ+XG4gICAgICAgIDwvQWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lclxuICAgICAgICBmdWxsV2lkdGg9e3RydWV9XG4gICAgICAgIGJsdWVCYWNrZ3JvdW5kPXt0cnVlfT5cbiAgICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0LXBhZ2UnfT5cbiAgICAgICAgICA8QWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgICAgICAgIDxBYm91dENhcmRcbiAgICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgICAgaW1nU3JjPXthY2NvdW50QmFsYW5jZUljb259XG4gICAgICAgICAgICAgIGhlYWRlcj17J0ZlZGVyYWwgcHJvZ3JhbSBtYW5hZ2Vycyd9XG4gICAgICAgICAgICAgIGFjdGlvblRleHQ9eydHbyB0byBkYXRhICYgbWV0aG9kb2xvZ3knfVxuICAgICAgICAgICAgICBhY3Rpb25Vcmw9eycuL21ldGhvZG9sb2d5J30+XG4gICAgICAgICAgICAgIERvd25sb2FkIHRoZSBzY3JlZW5pbmcgdG9vbOKAmXMgZHJhZnQgbGlzdCBvZiBwcmlvcml0aXplZFxuICAgICAgICAgICAgICBjb21tdW5pdGllcyBhbmQgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBpdCBmb3IgeW91ciBwcm9ncmFtIGluXG4gICAgICAgICAgICAgIHRoZSBmdXR1cmUgb24gdGhlIGRhdGEgYW5kIG1ldGhvZG9sb2d5IHBhZ2UuXG4gICAgICAgICAgICA8L0Fib3V0Q2FyZD5cblxuICAgICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgICBzaXplPXsnc21hbGwnfVxuICAgICAgICAgICAgICBpbWdTcmM9e2dyb3Vwc0ljb259XG4gICAgICAgICAgICAgIGhlYWRlcj17J0NvbW11bml0eSBtZW1iZXJzJ31cbiAgICAgICAgICAgICAgYWN0aW9uVGV4dD17J0V4cGxvcmUgdGhlIHRvb2wnfVxuICAgICAgICAgICAgICBhY3Rpb25Vcmw9eycuL2NlanN0J30+XG4gICAgICAgICAgICAgIEZpbmQgeW91ciBjb21tdW5pdHkgb3IgY29tbXVuaXRpZXMgdGhhdCB5b3UgbWF5IGJlIGZhbWlsaWFyIHdpdGhcbiAgICAgICAgICAgICAgYW5kIGNoZWNrIHRoZWlyIHByaW9yaXRpemF0aW9uIGluZm9ybWF0aW9uIG9uIHRoZSBtYXAuXG4gICAgICAgICAgICA8L0Fib3V0Q2FyZD5cbiAgICAgICAgICA8L0Fib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXJcbiAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0LXBhZ2UnfT5cbiAgICAgICAgPEFib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGltZ1NyYz17Y29tbWVudEljb259XG4gICAgICAgICAgICBoZWFkZXI9eydTZW5kIEZlZWRiYWNrJ31cbiAgICAgICAgICAgIGFjdGlvblRleHQ9eydFbWFpbDogc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdid9XG4gICAgICAgICAgICBhY3Rpb25Vcmw9eydtYWlsdG86c2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdid9PlxuICAgICAgICAgICAgSGF2ZSBpZGVhcyBhYm91dCBob3cgdG8gYWNrbm93bGVkZ2UgdGhlIG9uLXRoZS1ncm91bmQgZXhwZXJpZW5jZXNcbiAgICAgICAgICAgIG9mIHlvdXIgY29tbXVuaXR5P1xuICAgICAgICAgIDwvQWJvdXRDYXJkPlxuXG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGltZ1NyYz17Z2l0aHViSWNvbn1cbiAgICAgICAgICAgIGhlYWRlcj17J0pvaW4gdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSd9XG4gICAgICAgICAgICBhY3Rpb25UZXh0PXsnQ2hlY2sgaXQgb3V0IG9uIEdpdEh1Yid9XG4gICAgICAgICAgICBhY3Rpb25Vcmw9eydodHRwczovL2dpdGh1Yi5jb20vdXNkcy9qdXN0aWNlNDAtdG9vbCd9XG4gICAgICAgICAgICBhY3Rpb25PcGVuSW5OZXdUYWI9e3RydWV9PlxuICAgICAgICAgICAgVGhlIHNjcmVlbmluZyB0b29s4oCZcyBjb2RlIGlzIG9wZW4gc291cmNlLCB3aGljaCBtZWFucyBpdCBpc1xuICAgICAgICAgICAgYXZhaWxhYmxlIGZvciB0aGUgcHVibGljIHRvIHZpZXcgYW5kIGNvbnRyaWJ1dGUgdG8uIEFueW9uZSBjYW5cbiAgICAgICAgICAgIHZpZXcgYW5kIGNvbnRyaWJ1dGUgb24gR2l0SHViLlxuICAgICAgICAgIDwvQWJvdXRDYXJkPlxuICAgICAgICA8L0Fib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgIDwvTGF5b3V0Pik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbmRleFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1265\n")}}]); \ No newline at end of file diff --git a/main/component---src-pages-index-tsx-1cdcc7425e603bdf3264.js b/main/component---src-pages-index-tsx-1cdcc7425e603bdf3264.js new file mode 100644 index 00000000..9add8b72 --- /dev/null +++ b/main/component---src-pages-index-tsx-1cdcc7425e603bdf3264.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[691],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},1265: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 */ pages; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar lib = __webpack_require__(4424);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 4 modules\nvar layout = __webpack_require__(828);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar react_uswds_lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/components/AboutCard/AboutCard.tsx\n// the \"body\" section is the child object to allow for html versus just text\nvar AboutCard=function AboutCard(props){if(props.size==='large'){// large are the cards on top\n// note it uses a top className='j40-aboutcard-lg-card'\nreturn/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:true},gap:'lg',className:props.className||''},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true,className:'j40-aboutcard-lg-card'},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:3},className:'j40-aboutpage-image-container'},/*#__PURE__*/react.createElement(\"img\",{className:'j40-aboutcard-image',alt:props.header,src:props.imgSrc})),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:9}},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h3\",{className:'j40-section-header'},props.header),/*#__PURE__*/react.createElement(\"div\",{className:'j40-section-body'},props.children)))));}else{// small are the cards on the bottom\n// note it uses a top className='j40-aboutcard-sm-card'\nreturn/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:true},gap:'lg',className:props.className||''},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true,className:'j40-aboutcard-sm-card'},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:2},className:'j40-aboutpage-image-container'},/*#__PURE__*/react.createElement(\"img\",{className:'j40-aboutcard-image',alt:props.header,src:props.imgSrc})),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{tablet:{col:9}},/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h3\",{className:'j40-section-header'},props.header),/*#__PURE__*/react.createElement(\"div\",{className:'j40-section-body'},props.children),/*#__PURE__*/react.createElement(\"div\",{className:'j40-section-footer'},props.actionOpenInNewTab?/*#__PURE__*/react.createElement(\"a\",{className:'j40-aboutcard-link',href:props.actionUrl,target:\"_blank\",rel:\"noreferrer\"},props.actionText):/*#__PURE__*/react.createElement(\"a\",{className:'j40-aboutcard-link',href:props.actionUrl},props.actionText)))),/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{col:1},' ')));}};/* harmony default export */ var AboutCard_AboutCard = (AboutCard);\n;// CONCATENATED MODULE: ./src/images/about-usmap.svg\n/* harmony default export */ var about_usmap = (__webpack_require__.p + \"static/about-usmap-958107feab7ce45224df0f603908db2d.svg\");\n;// CONCATENATED MODULE: ./src/images/about-j40.svg\n/* harmony default export */ var about_j40 = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMTU0LjcxIiBoZWlnaHQ9IjIyOTcuNDIiIHZpZXdCb3g9IjAgMCAyMTU0LjcxIDIyOTcuNDIiPjxkZWZzPjxzdHlsZT4uYXtmaWxsOiNjMWMxYzE7fS5ie2ZvbnQtc2l6ZTo1ODAuMjRweDtmaWxsOiMxYzUwN2Y7Zm9udC1mYW1pbHk6QXJpYWwtQm9sZE1ULCBBcmlhbDtmb250LXdlaWdodDo3MDA7fS5je2ZpbGw6bm9uZTt9LmR7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48Y2lyY2xlIGNsYXNzPSJhIiBjeD0iMTA3Ny4zNiIgY3k9IjEyMjAuMDYiIHI9IjEwNzcuMzYiLz48dGV4dCBjbGFzcz0iYiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTg0Ljk0IDE4MTcuMTMpIj40MCU8L3RleHQ+PHJlY3QgY2xhc3M9ImMiIHg9IjMxNS4zIiB3aWR0aD0iMTU2OS43NCIgaGVpZ2h0PSIxNTY5Ljc0Ii8+PHBhdGggY2xhc3M9ImQiIGQ9Ik0xMTA1LjM0LDc1Mi4xNGMxMDYuNjEsMCwyMDAuOCwyNS41MSwyNzcuMzIsNTguODcsNzAuNjQsMzEuMzksMTE1LjEyLDEwMiwxMTUuMTIsMTc4LjU2djEwNS45NUg3MTIuOTFWOTkwLjIyQzcxMi45MSw5MTMsNzU3LjM4LDg0Mi40LDgyOCw4MTEuNjYsOTA0LjU1LDc3Ny42NSw5OTguNzMsNzUyLjE0LDExMDUuMzQsNzUyLjE0Wk01ODIuMDksNzY4LjVjNzEuOTUsMCwxMzAuODItNTguODcsMTMwLjgyLTEzMC44MlM2NTQsNTA2Ljg3LDU4Mi4wOSw1MDYuODcsNDUxLjI4LDU2NS43NCw0NTEuMjgsNjM3LjY4LDUxMC4xNSw3NjguNSw1ODIuMDksNzY4LjVaTTY1Niw4NDAuNDRjLTI0LjItMy45Mi00OC40LTYuNTQtNzMuOTEtNi41NGE0NTQuNTYsNDU0LjU2LDAsMCwwLTE4MS44MiwzNy45NCwxMzEuNTIsMTMxLjUyLDAsMCwwLTc5LjgsMTIxdjEwMi42OEg2MTQuOFY5OTAuMjJDNjE0LjgsOTM1LjkzLDYyOS44NCw4ODQuOTIsNjU2LDg0MC40NFptOTcyLjU5LTcxLjk0YzcxLjk0LDAsMTMwLjgxLTU4Ljg3LDEzMC44MS0xMzAuODJzLTU4Ljg3LTEzMC44MS0xMzAuODEtMTMwLjgxLTEzMC44MSw1OC44Ny0xMzAuODEsMTMwLjgxUzE1NTYuNjQsNzY4LjUsMTYyOC41OSw3NjguNVptMjYxLjYyLDIyNC4zNGExMzEuNTEsMTMxLjUxLDAsMCwwLTc5LjgtMTIxLDQ1NC41Niw0NTQuNTYsMCwwLDAtMTgxLjgyLTM3Ljk0Yy0yNS41MSwwLTQ5LjcxLDIuNjItNzMuOTEsNi41NCwyNi4xNiw0NC40OCw0MS4yLDk1LjQ5LDQxLjIsMTQ5Ljc4djEwNS4zaDI5NC4zM1pNMTEwNS4zNCwzMTAuNjVBMTk2LjIyLDE5Ni4yMiwwLDEsMSw5MDkuMTIsNTA2Ljg3LDE5NiwxOTYsMCwwLDEsMTEwNS4zNCwzMTAuNjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjcuOTggMTI0LjU0KSIvPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/account_balance.svg\n/* harmony default export */ var account_balance = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxnPjxyZWN0IGhlaWdodD0iNyIgd2lkdGg9IjMiIHg9IjQiIHk9IjEwIi8+PHJlY3QgaGVpZ2h0PSI3IiB3aWR0aD0iMyIgeD0iMTAuNSIgeT0iMTAiLz48cmVjdCBoZWlnaHQ9IjMiIHdpZHRoPSIyMCIgeD0iMiIgeT0iMTkiLz48cmVjdCBoZWlnaHQ9IjciIHdpZHRoPSIzIiB4PSIxNyIgeT0iMTAiLz48cG9seWdvbiBwb2ludHM9IjEyLDEgMiw2IDIsOCAyMiw4IDIyLDYiLz48L2c+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/groups.svg\n/* harmony default export */ var groups = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PGc+PHBhdGggZD0iTTEyLDEyLjc1YzEuNjMsMCwzLjA3LDAuMzksNC4yNCwwLjljMS4wOCwwLjQ4LDEuNzYsMS41NiwxLjc2LDIuNzNMMTgsMThINmwwLTEuNjFjMC0xLjE4LDAuNjgtMi4yNiwxLjc2LTIuNzMgQzguOTMsMTMuMTQsMTAuMzcsMTIuNzUsMTIsMTIuNzV6IE00LDEzYzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMyLDEyLjEsMi45LDEzLDQsMTN6IE01LjEzLDE0LjEgQzQuNzYsMTQuMDQsNC4zOSwxNCw0LDE0Yy0wLjk5LDAtMS45MywwLjIxLTIuNzgsMC41OEMwLjQ4LDE0LjksMCwxNS42MiwwLDE2LjQzVjE4bDQuNSwwdi0xLjYxQzQuNSwxNS41Niw0LjczLDE0Ljc4LDUuMTMsMTQuMXogTTIwLDEzYzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMxOCwxMi4xLDE4LjksMTMsMjAsMTN6IE0yNCwxNi40M2MwLTAuODEtMC40OC0xLjUzLTEuMjItMS44NSBDMjEuOTMsMTQuMjEsMjAuOTksMTQsMjAsMTRjLTAuMzksMC0wLjc2LDAuMDQtMS4xMywwLjFjMC40LDAuNjgsMC42MywxLjQ2LDAuNjMsMi4yOVYxOGw0LjUsMFYxNi40M3ogTTEyLDZjMS42NiwwLDMsMS4zNCwzLDMgYzAsMS42Ni0xLjM0LDMtMywzcy0zLTEuMzQtMy0zQzksNy4zNCwxMC4zNCw2LDEyLDZ6Ii8+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/comment.svg\n/* harmony default export */ var comment = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTIxLjk5IDRjMC0xLjEtLjg5LTItMS45OS0ySDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTRsNCA0LS4wMS0xOHpNMTggMTRINnYtMmgxMnYyem0wLTNINlY5aDEydjJ6bTAtM0g2VjZoMTJ2MnoiLz48L3N2Zz4=\");\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/AboutCard/AboutCardsContainer.tsx\n// note: this assumes a J40MainGridContainer container!\nvar AboutCardsContainer=function AboutCardsContainer(props){return/*#__PURE__*/react.createElement(react_uswds_lib.Grid,{row:true,gap:'lg',className:'j40-aboutcard-container '+(props.className||'')},props.children);};/* harmony default export */ var AboutCard_AboutCardsContainer = (AboutCardsContainer);\n;// CONCATENATED MODULE: ./src/pages/index.tsx\n// @ts-ignore\n// @ts-ignore\n// markup\nvar IndexPage=function IndexPage(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,lib/* defineMessages */.vU)({presidentalLinkUri:{id:'index.presidentalLinkUri',defaultMessage:'https://www.whitehouse.gov/briefing-room/'+'presidential-actions/2021/01/27/'+'executive-order-on-tackling-the-climate-'+'crisis-at-home-and-abroad/',description:'Link url to presidential actions executive order. Part of paragraph 3'},presidentalLinkLabel:{id:'index.presidentalLinkLabel',defaultMessage:'Executive Order on Tackling the Climate Crisis at Home and Abroad.',description:'Link url to presidential actions executive order. Part of paragraph 3'},transparentLabel:{id:'index.section3.transparentLabel',defaultMessage:'Transparent:',description:'Italic label for 1st paragraph of section 3 on index page'},inclusiveLabel:{id:'index.section3.inclusiveLabel',defaultMessage:'Inclusive:',description:'Italic label for 2nd paragraph of section 3 on index page'},iterativeLabel:{id:'index.section3.iterativeLabel',defaultMessage:'Iterative:',description:'Italic label for 3rd paragraph of section 3 on index page'}});return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-about-page'},/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'large',imgSrc:about_usmap,header:'About the screening tool'},/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'index.aboutContent.p1',description:'paragraph 1 of main content on index page',defaultMessage:\"\\n On January 27, 2021, President Biden directed the Council on\\n Environmental Quality (CEQ) to create a climate and economic\\n justice screening tool. The purpose of the tool is to provide\\n socioeconomic, environmental, and climate information and data to\\n help inform decisions that may affect disadvantaged communities.\\n The tool is designed to assist Federal agencies in identifying\\n disadvantaged communities for the purposes of the Justice40\\n Initiative. \\n \"}))),/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'large',imgSrc:about_j40,header:'About the Justice40 Initiative'},/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:\"index.aboutContent.p2\",description:'paragraph 2 of main content on index page',defaultMessage:\"\\n The goal of the Justice40 Initiative is for 40 percent of\\n benefits of Federal programs in seven key areas to flow to\\n disadvantaged communities. These seven key areas are: climate\\n change, clean energy and energy efficiency, clean transit,\\n affordable and sustainable housing, training and workforce\\n development, remediation of legacy pollution, and clean water\\n infrastructure.\\n \"}),/*#__PURE__*/react.createElement(\"p\",null,/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'index.aboutContent.p3',description:'paragraph 3 of main content on index page',defaultMessage:\"\\n Read more about the Justice40 Initiative in President Biden\\u2019s \\n {presidentLink}\\n \",values:{presidentLink:/*#__PURE__*/react.createElement(\"a\",{href:intl.formatMessage(messages.presidentalLinkUri),target:\"_blank\",rel:\"noreferrer\"},intl.formatMessage(messages.presidentalLinkLabel))}}))))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true,blueBackground:true},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-about-page'},/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:account_balance,header:'Federal program managers',actionText:'Go to data & methodology',actionUrl:'./methodology'},\"Download the screening tool\\u2019s draft list of prioritized communities and information on how to use it for your program in the future on the data and methodology page.\"),/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:groups,header:'Community members',actionText:'Explore the tool',actionUrl:'./cejst'},\"Find your community or communities that you may be familiar with and check their prioritization information on the map.\")))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:'j40-about-page'},/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:comment,header:'Send Feedback',actionText:'Email: screeningtool.feedback@usds.gov',actionUrl:'mailto:screeningtool.feedback@usds.gov'},\"Have ideas about how to acknowledge the on-the-ground experiences of your community?\"),/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:github,header:'Join the open source community',actionText:'Check it out on GitHub',actionUrl:'https://github.com/usds/justice40-tool',actionOpenInNewTab:true},\"The screening tool\\u2019s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.\"))));};/* harmony default export */ var pages = (IndexPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0Fib3V0Q2FyZC9BYm91dENhcmQudHN4PzUwM2YiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvaW1hZ2VzL2Fib3V0LXVzbWFwLnN2Zz82OTIyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2ltYWdlcy9hYm91dC1qNDAuc3ZnPzU0YmIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2FjY291bnRfYmFsYW5jZS5zdmc/NzU4NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ3JvdXBzLnN2Zz8wMGUwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9jb21tZW50LnN2Zz9mYWIyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9naXRodWIuc3ZnPzZiNDQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9BYm91dENhcmQvQWJvdXRDYXJkc0NvbnRhaW5lci50c3g/N2IzMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9pbmRleC50c3g/NDFlMCJdLCJuYW1lcyI6WyJBYm91dENhcmQiLCJwcm9wcyIsInNpemUiLCJjb2wiLCJjbGFzc05hbWUiLCJoZWFkZXIiLCJpbWdTcmMiLCJjaGlsZHJlbiIsImFjdGlvbk9wZW5Jbk5ld1RhYiIsImFjdGlvblVybCIsImFjdGlvblRleHQiLCJBYm91dENhcmRzQ29udGFpbmVyIiwiSW5kZXhQYWdlIiwibG9jYXRpb24iLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJwcmVzaWRlbnRhbExpbmtVcmkiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJwcmVzaWRlbnRhbExpbmtMYWJlbCIsInRyYW5zcGFyZW50TGFiZWwiLCJpbmNsdXNpdmVMYWJlbCIsIml0ZXJhdGl2ZUxhYmVsIiwiYWJvdXRVU01hcEltZyIsImFib3V0SjQwSW1nIiwicHJlc2lkZW50TGluayIsImZvcm1hdE1lc3NhZ2UiLCJhY2NvdW50QmFsYW5jZUljb24iLCJncm91cHNJY29uIiwiY29tbWVudEljb24iLCJnaXRodWJJY29uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBO0FBV0EsR0FBTUEsVUFBUyxDQUFHLFFBQVpBLFVBQVksQ0FBQ0MsS0FBRCxDQUFvRCxDQUNwRSxHQUFJQSxLQUFLLENBQUNDLElBQU4sR0FBZSxPQUFuQixDQUE0QixDQUMxQjtBQUNBO0FBQ0EsbUJBQ0Usb0JBQUMsb0JBQUQsRUFBTSxNQUFNLENBQUUsQ0FBQ0MsR0FBRyxDQUFFLElBQU4sQ0FBZCxDQUEyQixHQUFHLENBQUUsSUFBaEMsQ0FBc0MsU0FBUyxDQUFHRixLQUFLLENBQUNHLFNBQU4sRUFBbUIsRUFBckUsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxDQUFVLFNBQVMsQ0FBRSx1QkFBckIsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLE1BQU0sQ0FBRSxDQUFDRCxHQUFHLENBQUUsQ0FBTixDQUFkLENBQXdCLFNBQVMsQ0FBRSwrQkFBbkMsZUFDRSwyQkFDRSxTQUFTLENBQUUscUJBRGIsQ0FFRSxHQUFHLENBQUVGLEtBQUssQ0FBQ0ksTUFGYixDQUdFLEdBQUcsQ0FBRUosS0FBSyxDQUFDSyxNQUhiLEVBREYsQ0FERixjQVFFLG9CQUFDLG9CQUFELEVBQU0sTUFBTSxDQUFFLENBQUNILEdBQUcsQ0FBRSxDQUFOLENBQWQsZUFDRSxvQkFBQyxvQkFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLDBCQUFJLFNBQVMsQ0FBRSxvQkFB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QUFNLENBQUUsZ0NBSFYsQ0FJRSxVQUFVLENBQUUsd0JBSmQsQ0FLRSxTQUFTLENBQUUsd0NBTGIsQ0FNRSxrQkFBa0IsQ0FBRSxJQU50QixtS0FYRixDQUZGLENBcEdGLENBREYsQ0FnSUQsQ0FqS0QsQ0FtS0EsMENBQWVyQixTQUFmIiwiZmlsZSI6IjEyNjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cbi8vIHRoZSBcImJvZHlcIiBzZWN0aW9uIGlzIHRoZSBjaGlsZCBvYmplY3QgdG8gYWxsb3cgZm9yIGh0bWwgdmVyc3VzIGp1c3QgdGV4dFxuaW50ZXJmYWNlIEFib3V0Q2FyZFByb3BzIHtcbiAgaW1nU3JjOiBzdHJpbmc7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBzaXplPzogJ3NtYWxsJyB8ICdsYXJnZSc7XG4gIGFjdGlvblRleHQ/OiBzdHJpbmc7XG4gIGFjdGlvblVybD86IHN0cmluZztcbiAgYWN0aW9uT3BlbkluTmV3VGFiPzogYm9vbGVhbjtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBBYm91dENhcmQgPSAocHJvcHM6IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPEFib3V0Q2FyZFByb3BzPikgPT4ge1xuICBpZiAocHJvcHMuc2l6ZSA9PT0gJ2xhcmdlJykge1xuICAgIC8vIGxhcmdlIGFyZSB0aGUgY2FyZHMgb24gdG9wXG4gICAgLy8gbm90ZSBpdCB1c2VzIGEgdG9wIGNsYXNzTmFtZT0najQwLWFib3V0Y2FyZC1sZy1jYXJkJ1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB0YWJsZXQ9e3tjb2w6IHRydWV9fSBnYXA9eydsZyd9IGNsYXNzTmFtZT17KHByb3BzLmNsYXNzTmFtZSB8fCAnJyl9PlxuICAgICAgICA8R3JpZCByb3cgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1sZy1jYXJkJ30+XG4gICAgICAgICAgPEdyaWQgdGFibGV0PXt7Y29sOiAzfX0gY2xhc3NOYW1lPXsnajQwLWFib3V0cGFnZS1pbWFnZS1jb250YWluZXInfT5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1pbWFnZSd9XG4gICAgICAgICAgICAgIGFsdD17cHJvcHMuaGVhZGVyfVxuICAgICAgICAgICAgICBzcmM9e3Byb3BzLmltZ1NyY30vPlxuICAgICAgICAgIDwvR3JpZD5cblxuICAgICAgICAgIDxHcmlkIHRhYmxldD17e2NvbDogOX19PlxuICAgICAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPXsnajQwLXNlY3Rpb24taGVhZGVyJ30+e3Byb3BzLmhlYWRlcn08L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1zZWN0aW9uLWJvZHknfT57cHJvcHMuY2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9HcmlkPlxuXG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIHNtYWxsIGFyZSB0aGUgY2FyZHMgb24gdGhlIGJvdHRvbVxuICAgIC8vIG5vdGUgaXQgdXNlcyBhIHRvcCBjbGFzc05hbWU9J2o0MC1hYm91dGNhcmQtc20tY2FyZCdcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgdGFibGV0PXt7Y29sOiB0cnVlfX0gZ2FwPXsnbGcnfSBjbGFzc05hbWU9eyhwcm9wcy5jbGFzc05hbWUgfHwgJycpfT5cbiAgICAgICAgPEdyaWQgcm93IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtc20tY2FyZCd9PlxuICAgICAgICAgIDxHcmlkIHRhYmxldD17e2NvbDogMn19IGNsYXNzTmFtZT17J2o0MC1hYm91dHBhZ2UtaW1hZ2UtY29udGFpbmVyJ30+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtaW1hZ2UnfVxuICAgICAgICAgICAgICBhbHQ9e3Byb3BzLmhlYWRlcn1cbiAgICAgICAgICAgICAgc3JjPXtwcm9wcy5pbWdTcmN9Lz5cbiAgICAgICAgICA8L0dyaWQ+XG5cbiAgICAgICAgICA8R3JpZCB0YWJsZXQ9e3tjb2w6IDl9fT5cbiAgICAgICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT17J2o0MC1zZWN0aW9uLWhlYWRlcid9Pntwcm9wcy5oZWFkZXJ9PC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9eydqNDAtc2VjdGlvbi1ib2R5J30+e3Byb3BzLmNoaWxkcmVufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1zZWN0aW9uLWZvb3Rlcid9PlxuICAgICAgICAgICAgICAgIHtwcm9wcy5hY3Rpb25PcGVuSW5OZXdUYWIgP1xuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1saW5rJ31cbiAgICAgICAgICAgICAgICAgICAgaHJlZj17cHJvcHMuYWN0aW9uVXJsfVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICByZWw9XCJub3JlZmVycmVyXCI+e3Byb3BzLmFjdGlvblRleHR9PC9hPiA6XG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydqNDAtYWJvdXRjYXJkLWxpbmsnfVxuICAgICAgICAgICAgICAgICAgICBocmVmPXtwcm9wcy5hY3Rpb25Vcmx9Pntwcm9wcy5hY3Rpb25UZXh0fTwvYT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICA8R3JpZCBjb2w9ezF9PnsnICd9PC9HcmlkPlxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWJvdXRDYXJkO1xuIiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9hYm91dC11c21hcC05NTgxMDdmZWFiN2NlNDUyMjRkZjBmNjAzOTA4ZGIyZC5zdmdcIjsiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJeU1UVTBMamN4SWlCb1pXbG5hSFE5SWpJeU9UY3VORElpSUhacFpYZENiM2c5SWpBZ01DQXlNVFUwTGpjeElESXlPVGN1TkRJaVBqeGtaV1p6UGp4emRIbHNaVDR1WVh0bWFXeHNPaU5qTVdNeFl6RTdmUzVpZTJadmJuUXRjMmw2WlRvMU9EQXVNalJ3ZUR0bWFXeHNPaU14WXpVd04yWTdabTl1ZEMxbVlXMXBiSGs2UVhKcFlXd3RRbTlzWkUxVUxDQkJjbWxoYkR0bWIyNTBMWGRsYVdkb2REbzNNREE3ZlM1amUyWnBiR3c2Ym05dVpUdDlMbVI3Wm1sc2JEb2pabVptTzMwOEwzTjBlV3hsUGp3dlpHVm1jejQ4WTJseVkyeGxJR05zWVhOelBTSmhJaUJqZUQwaU1UQTNOeTR6TmlJZ1kzazlJakV5TWpBdU1EWWlJSEk5SWpFd056Y3VNellpTHo0OGRHVjRkQ0JqYkdGemN6MGlZaUlnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb05UZzBMamswSURFNE1UY3VNVE1wSWo0ME1DVThMM1JsZUhRK1BISmxZM1FnWTJ4aGMzTTlJbU1pSUhnOUlqTXhOUzR6SWlCM2FXUjBhRDBpTVRVMk9TNDNOQ0lnYUdWcFoyaDBQU0l4TlRZNUxqYzBJaTgrUEhCaGRHZ2dZMnhoYzNNOUltUWlJR1E5SWsweE1UQTFMak0wTERjMU1pNHhOR014TURZdU5qRXNNQ3d5TURBdU9Dd3lOUzQxTVN3eU56Y3VNeklzTlRndU9EY3NOekF1TmpRc016RXVNemtzTVRFMUxqRXlMREV3TWl3eE1UVXVNVElzTVRjNExqVTJkakV3TlM0NU5VZzNNVEl1T1RGV09Ua3dMakl5UXpjeE1pNDVNU3c1TVRNc056VTNMak00TERnME1pNDBMRGd5T0N3NE1URXVOallzT1RBMExqVTFMRGMzTnk0Mk5TdzVPVGd1TnpNc056VXlMakUwTERFeE1EVXVNelFzTnpVeUxqRTBXazAxT0RJdU1Ea3NOelk0TGpWak56RXVPVFVzTUN3eE16QXVPREl0TlRndU9EY3NNVE13TGpneUxURXpNQzQ0TWxNMk5UUXNOVEEyTGpnM0xEVTRNaTR3T1N3MU1EWXVPRGNzTkRVeExqSTRMRFUyTlM0M05DdzBOVEV1TWpnc05qTTNMalk0TERVeE1DNHhOU3czTmpndU5TdzFPREl1TURrc056WTRMalZhVFRZMU5pdzROREF1TkRSakxUSTBMakl0TXk0NU1pMDBPQzQwTFRZdU5UUXROek11T1RFdE5pNDFOR0UwTlRRdU5UWXNORFUwTGpVMkxEQXNNQ3d3TFRFNE1TNDRNaXd6Tnk0NU5Dd3hNekV1TlRJc01UTXhMalV5TERBc01Dd3dMVGM1TGpnc01USXhkakV3TWk0Mk9FZzJNVFF1T0ZZNU9UQXVNakpETmpFMExqZ3NPVE0xTGprekxEWXlPUzQ0TkN3NE9EUXVPVElzTmpVMkxEZzBNQzQwTkZwdE9UY3lMalU1TFRjeExqazBZemN4TGprMExEQXNNVE13TGpneExUVTRMamczTERFek1DNDRNUzB4TXpBdU9ESnpMVFU0TGpnM0xURXpNQzQ0TVMweE16QXVPREV0TVRNd0xqZ3hMVEV6TUM0NE1TdzFPQzQ0TnkweE16QXVPREVzTVRNd0xqZ3hVekUxTlRZdU5qUXNOelk0TGpVc01UWXlPQzQxT1N3M05qZ3VOVnB0TWpZeExqWXlMREl5TkM0ek5HRXhNekV1TlRFc01UTXhMalV4TERBc01Dd3dMVGM1TGpndE1USXhMRFExTkM0MU5pdzBOVFF1TlRZc01Dd3dMREF0TVRneExqZ3lMVE0zTGprMFl5MHlOUzQxTVN3d0xUUTVMamN4TERJdU5qSXROek11T1RFc05pNDFOQ3d5Tmk0eE5pdzBOQzQwT0N3ME1TNHlMRGsxTGpRNUxEUXhMaklzTVRRNUxqYzRkakV3TlM0emFESTVOQzR6TTFwTk1URXdOUzR6TkN3ek1UQXVOalZCTVRrMkxqSXlMREU1Tmk0eU1pd3dMREVzTVN3NU1Ea3VNVElzTlRBMkxqZzNMREU1Tml3eE9UWXNNQ3d3TERFc01URXdOUzR6TkN3ek1UQXVOalZhSWlCMGNtRnVjMlp2Y20wOUluUnlZVzV6YkdGMFpTZ3RNamN1T1RnZ01USTBMalUwS1NJdlBqd3ZjM1puUGc9PVwiIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJR1Z1WVdKc1pTMWlZV05yWjNKdmRXNWtQU0p1WlhjZ01DQXdJREkwSURJMElpQm9aV2xuYUhROUlqSTBJaUIyYVdWM1FtOTRQU0l3SURBZ01qUWdNalFpSUhkcFpIUm9QU0l5TkNJK1BHYytQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BDOW5QanhuUGp4blBqeHlaV04wSUdobGFXZG9kRDBpTnlJZ2QybGtkR2c5SWpNaUlIZzlJalFpSUhrOUlqRXdJaTgrUEhKbFkzUWdhR1ZwWjJoMFBTSTNJaUIzYVdSMGFEMGlNeUlnZUQwaU1UQXVOU0lnZVQwaU1UQWlMejQ4Y21WamRDQm9aV2xuYUhROUlqTWlJSGRwWkhSb1BTSXlNQ0lnZUQwaU1pSWdlVDBpTVRraUx6NDhjbVZqZENCb1pXbG5hSFE5SWpjaUlIZHBaSFJvUFNJeklpQjRQU0l4TnlJZ2VUMGlNVEFpTHo0OGNHOXNlV2R2YmlCd2IybHVkSE05SWpFeUxERWdNaXcySURJc09DQXlNaXc0SURJeUxEWWlMejQ4TDJjK1BDOW5Qand2YzNablBnPT1cIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURJMElESTBJaUJvWldsbmFIUTlJakkwSWlCMmFXVjNRbTk0UFNJd0lEQWdNalFnTWpRaUlIZHBaSFJvUFNJeU5DSStQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BHYytQSEJoZEdnZ1pEMGlUVEV5TERFeUxqYzFZekV1TmpNc01Dd3pMakEzTERBdU16a3NOQzR5TkN3d0xqbGpNUzR3T0N3d0xqUTRMREV1TnpZc01TNDFOaXd4TGpjMkxESXVOek5NTVRnc01UaElObXd3TFRFdU5qRmpNQzB4TGpFNExEQXVOamd0TWk0eU5pd3hMamMyTFRJdU56TWdRemd1T1RNc01UTXVNVFFzTVRBdU16Y3NNVEl1TnpVc01USXNNVEl1TnpWNklFMDBMREV6WXpFdU1Td3dMREl0TUM0NUxESXRNbU13TFRFdU1TMHdMamt0TWkweUxUSnpMVElzTUM0NUxUSXNNa015TERFeUxqRXNNaTQ1TERFekxEUXNNVE42SUUwMUxqRXpMREUwTGpFZ1F6UXVOellzTVRRdU1EUXNOQzR6T1N3eE5DdzBMREUwWXkwd0xqazVMREF0TVM0NU15d3dMakl4TFRJdU56Z3NNQzQxT0VNd0xqUTRMREUwTGprc01Dd3hOUzQyTWl3d0xERTJMalF6VmpFNGJEUXVOU3d3ZGkweExqWXhRelF1TlN3eE5TNDFOaXcwTGpjekxERTBMamM0TERVdU1UTXNNVFF1TVhvZ1RUSXdMREV6WXpFdU1Td3dMREl0TUM0NUxESXRNbU13TFRFdU1TMHdMamt0TWkweUxUSnpMVElzTUM0NUxUSXNNa014T0N3eE1pNHhMREU0TGprc01UTXNNakFzTVRONklFMHlOQ3d4Tmk0ME0yTXdMVEF1T0RFdE1DNDBPQzB4TGpVekxURXVNakl0TVM0NE5TQkRNakV1T1RNc01UUXVNakVzTWpBdU9Ua3NNVFFzTWpBc01UUmpMVEF1TXprc01DMHdMamMyTERBdU1EUXRNUzR4TXl3d0xqRmpNQzQwTERBdU5qZ3NNQzQyTXl3eExqUTJMREF1TmpNc01pNHlPVll4T0d3MExqVXNNRll4Tmk0ME0zb2dUVEV5TERaak1TNDJOaXd3TERNc01TNHpOQ3d6TERNZ1l6QXNNUzQyTmkweExqTTBMRE10TXl3emN5MHpMVEV1TXpRdE15MHpRemtzTnk0ek5Dd3hNQzR6TkN3MkxERXlMRFo2SWk4K1BDOW5Qand2YzNablBnPT1cIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdobGFXZG9kRDBpTWpRaUlIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSWdkMmxrZEdnOUlqSTBJajQ4Y0dGMGFDQmtQU0pOTUNBd2FESTBkakkwU0RCNklpQm1hV3hzUFNKdWIyNWxJaTgrUEhCaGRHZ2daRDBpVFRJeExqazVJRFJqTUMweExqRXRMamc1TFRJdE1TNDVPUzB5U0RSakxURXVNU0F3TFRJZ0xqa3RNaUF5ZGpFeVl6QWdNUzR4TGprZ01pQXlJREpvTVRSc05DQTBMUzR3TVMweE9IcE5NVGdnTVRSSU5uWXRNbWd4TW5ZeWVtMHdMVE5JTmxZNWFERXlkako2YlRBdE0wZzJWalpvTVRKMk1ub2lMejQ4TDNOMlp6ND1cIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJK1BHUmxabk0rUEhOMGVXeGxQaTVqYkhNdE1YdG1hV3hzTFhKMWJHVTZaWFpsYm05a1pEdDlQQzl6ZEhsc1pUNDhMMlJsWm5NK1BIQmhkR2dnYVdROUlrZHBkR2gxWWlJZ1kyeGhjM005SW1Oc2N5MHhJaUJrUFNKTk1USXNNa0V4TUN3eE1Dd3dMREFzTUN3NExqZzBMREl4TGpRNVl5NDFMakE1TGpZNExTNHlNaTQyT0MwdU5EaHpNQzB1T0Rjc01DMHhMamRETmk0M015d3hPUzQ1TVN3MkxqRTBMREU0TERZdU1UUXNNVGhCTWk0Mk9Td3lMalk1TERBc01Dd3dMRFVzTVRZdU5XTXRMamt4TFM0Mk1pNHdOeTB1TmpFdU1EY3RMall4WVRJdU1UTXNNaTR4TXl3d0xEQXNNU3d4TGpVekxERXNNaTR4TkN3eUxqRTBMREFzTUN3d0xESXVPVEV1T0RNc01pNHhOaXd5TGpFMkxEQXNNQ3d4TEM0Mk15MHhMak0wUXpnc01UWXVNVGNzTlM0Mk1pd3hOUzR6TVN3MUxqWXlMREV4TGpRNFlUTXVPRGtzTXk0NE9Td3dMREFzTVN3eExUSXVOamtzTXk0MU55d3pMalUzTERBc01Dd3hMQzR4TFRJdU5qUnpMamcwTFM0eU55d3lMamMxTERGaE9TNDJNeXc1TGpZekxEQXNNQ3d4TERVc01HTXhMamt4TFRFdU1qa3NNaTQzTlMweExESXVOelV0TVdFekxqVTNMRE11TlRjc01Dd3dMREVzTGpFc01pNDJOQ3d6TGpnNUxETXVPRGtzTUN3d0xERXNNU3d5TGpZNVl6QXNNeTQ0TkMweUxqTTBMRFF1TmpndE5DNDFOeXcwTGprellUSXVNemtzTWk0ek9Td3dMREFzTVN3dU5qZ3NNUzQ0TldNd0xERXVNelFzTUN3eUxqUXlMREFzTWk0M05YTXVNVGd1TlRndU5qa3VORGhCTVRBc01UQXNNQ3d3TERBc01USXNNbG9pTHo0OEwzTjJaejQ9XCIiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cbnR5cGUgQWJvdXRDYXJkc0NvbnRhaW5lclByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuLy8gbm90ZTogdGhpcyBhc3N1bWVzIGEgSjQwTWFpbkdyaWRDb250YWluZXIgY29udGFpbmVyIVxuY29uc3QgQWJvdXRDYXJkc0NvbnRhaW5lciA9IChwcm9wczogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48QWJvdXRDYXJkc0NvbnRhaW5lclByb3BzPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHJvdyBnYXA9eydsZyd9IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtY29udGFpbmVyICcgKyAocHJvcHMuY2xhc3NOYW1lIHx8ICcnKX0+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWJvdXRDYXJkc0NvbnRhaW5lcjtcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlLCB1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWxlcnRXcmFwcGVyJztcbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyJztcbmltcG9ydCBMYXlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuaW1wb3J0IEFib3V0Q2FyZCBmcm9tICcuLi9jb21wb25lbnRzL0Fib3V0Q2FyZC9BYm91dENhcmQnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgYWJvdXRVU01hcEltZyBmcm9tICcuLi9pbWFnZXMvYWJvdXQtdXNtYXAuc3ZnJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBhYm91dEo0MEltZyBmcm9tICcuLi9pbWFnZXMvYWJvdXQtajQwLnN2Zyc7XG5pbXBvcnQgYWNjb3VudEJhbGFuY2VJY29uIC8vIEB0cy1pZ25vcmVcbiAgZnJvbSAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvYWNjb3VudF9iYWxhbmNlLnN2Zyc7XG5cbmltcG9ydCBncm91cHNJY29uIGZyb20gLy8gQHRzLWlnbm9yZVxuICAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ3JvdXBzLnN2Zyc7XG5cbmltcG9ydCBjb21tZW50SWNvbiBmcm9tIC8vIEB0cy1pZ25vcmVcbiAgJy9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2NvbW1lbnQuc3ZnJztcblxuaW1wb3J0IGdpdGh1Ykljb24gZnJvbSAvLyBAdHMtaWdub3JlXG4gICcvbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9naXRodWIuc3ZnJztcbmltcG9ydCBBYm91dENhcmRzQ29udGFpbmVyIGZyb20gJy4uL2NvbXBvbmVudHMvQWJvdXRDYXJkL0Fib3V0Q2FyZHNDb250YWluZXInO1xuXG5cbmludGVyZmFjZSBJbmRleFBhZ2VQcm9wcyB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvbjtcbn1cblxuLy8gbWFya3VwXG5jb25zdCBJbmRleFBhZ2UgPSAoe2xvY2F0aW9ufTogSW5kZXhQYWdlUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgcHJlc2lkZW50YWxMaW5rVXJpOiB7XG4gICAgICBpZDogJ2luZGV4LnByZXNpZGVudGFsTGlua1VyaScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ2h0dHBzOi8vd3d3LndoaXRlaG91c2UuZ292L2JyaWVmaW5nLXJvb20vJyArXG4gICAgICAgICdwcmVzaWRlbnRpYWwtYWN0aW9ucy8yMDIxLzAxLzI3LycgK1xuICAgICAgICAnZXhlY3V0aXZlLW9yZGVyLW9uLXRhY2tsaW5nLXRoZS1jbGltYXRlLScgK1xuICAgICAgICAnY3Jpc2lzLWF0LWhvbWUtYW5kLWFicm9hZC8nLFxuICAgICAgZGVzY3JpcHRpb246ICdMaW5rIHVybCB0byBwcmVzaWRlbnRpYWwgYWN0aW9ucyBleGVjdXRpdmUgb3JkZXIuIFBhcnQgb2YgcGFyYWdyYXBoIDMnLFxuICAgIH0sXG4gICAgcHJlc2lkZW50YWxMaW5rTGFiZWw6IHtcbiAgICAgIGlkOiAnaW5kZXgucHJlc2lkZW50YWxMaW5rTGFiZWwnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdFeGVjdXRpdmUgT3JkZXIgb24gVGFja2xpbmcgdGhlIENsaW1hdGUgQ3Jpc2lzIGF0IEhvbWUgYW5kIEFicm9hZC4nLFxuICAgICAgZGVzY3JpcHRpb246ICdMaW5rIHVybCB0byBwcmVzaWRlbnRpYWwgYWN0aW9ucyBleGVjdXRpdmUgb3JkZXIuIFBhcnQgb2YgcGFyYWdyYXBoIDMnLFxuICAgIH0sXG4gICAgdHJhbnNwYXJlbnRMYWJlbDoge1xuICAgICAgaWQ6ICdpbmRleC5zZWN0aW9uMy50cmFuc3BhcmVudExhYmVsJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVHJhbnNwYXJlbnQ6JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSXRhbGljIGxhYmVsIGZvciAxc3QgcGFyYWdyYXBoIG9mIHNlY3Rpb24gMyBvbiBpbmRleCBwYWdlJyxcbiAgICB9LFxuICAgIGluY2x1c2l2ZUxhYmVsOiB7XG4gICAgICBpZDogJ2luZGV4LnNlY3Rpb24zLmluY2x1c2l2ZUxhYmVsJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnSW5jbHVzaXZlOicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0l0YWxpYyBsYWJlbCBmb3IgMm5kIHBhcmFncmFwaCBvZiBzZWN0aW9uIDMgb24gaW5kZXggcGFnZScsXG4gICAgfSxcbiAgICBpdGVyYXRpdmVMYWJlbDoge1xuICAgICAgaWQ6ICdpbmRleC5zZWN0aW9uMy5pdGVyYXRpdmVMYWJlbCcsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogJ0l0ZXJhdGl2ZTonLFxuICAgICAgZGVzY3JpcHRpb246ICdJdGFsaWMgbGFiZWwgZm9yIDNyZCBwYXJhZ3JhcGggb2Ygc2VjdGlvbiAzIG9uIGluZGV4IHBhZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPExheW91dCBsb2NhdGlvbj17bG9jYXRpb259PlxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e3RydWV9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXtmYWxzZX0vPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyIGNsYXNzTmFtZT17J2o0MC1hYm91dC1wYWdlJ30+XG5cbiAgICAgICAgPEFib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J2xhcmdlJ31cbiAgICAgICAgICAgIGltZ1NyYz17YWJvdXRVU01hcEltZ31cbiAgICAgICAgICAgIGhlYWRlcj17J0Fib3V0IHRoZSBzY3JlZW5pbmcgdG9vbCd9PlxuXG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD17J2luZGV4LmFib3V0Q29udGVudC5wMSd9XG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXsncGFyYWdyYXBoIDEgb2YgbWFpbiBjb250ZW50IG9uIGluZGV4IHBhZ2UnfVxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17YFxuICAgICAgICAgICAgICBPbiBKYW51YXJ5IDI3LCAyMDIxLCBQcmVzaWRlbnQgQmlkZW4gZGlyZWN0ZWQgdGhlIENvdW5jaWwgb25cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnRhbCBRdWFsaXR5IChDRVEpIHRvIGNyZWF0ZSBhIGNsaW1hdGUgYW5kIGVjb25vbWljXG4gICAgICAgICAgICAgIGp1c3RpY2Ugc2NyZWVuaW5nIHRvb2wuIFRoZSBwdXJwb3NlIG9mIHRoZSB0b29sIGlzIHRvIHByb3ZpZGVcbiAgICAgICAgICAgICAgc29jaW9lY29ub21pYywgZW52aXJvbm1lbnRhbCwgYW5kIGNsaW1hdGUgaW5mb3JtYXRpb24gYW5kIGRhdGEgdG9cbiAgICAgICAgICAgICAgaGVscCBpbmZvcm0gZGVjaXNpb25zIHRoYXQgbWF5IGFmZmVjdCBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzLlxuICAgICAgICAgICAgICBUaGUgdG9vbCBpcyBkZXNpZ25lZCB0byBhc3Npc3QgRmVkZXJhbCBhZ2VuY2llcyBpbiBpZGVudGlmeWluZ1xuICAgICAgICAgICAgICBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIEp1c3RpY2U0MFxuICAgICAgICAgICAgICBJbml0aWF0aXZlLiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgYH0vPlxuXG4gICAgICAgICAgPC9BYm91dENhcmQ+XG4gICAgICAgIDwvQWJvdXRDYXJkc0NvbnRhaW5lcj5cblxuICAgICAgICA8QWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgICAgICA8QWJvdXRDYXJkXG4gICAgICAgICAgICBzaXplPXsnbGFyZ2UnfVxuICAgICAgICAgICAgaW1nU3JjPXthYm91dEo0MEltZ31cbiAgICAgICAgICAgIGhlYWRlcj17J0Fib3V0IHRoZSBKdXN0aWNlNDAgSW5pdGlhdGl2ZSd9PlxuXG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD1cImluZGV4LmFib3V0Q29udGVudC5wMlwiXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXsncGFyYWdyYXBoIDIgb2YgbWFpbiBjb250ZW50IG9uIGluZGV4IHBhZ2UnfVxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17YFxuICAgICAgICAgICAgICAgIFRoZSBnb2FsIG9mIHRoZSBKdXN0aWNlNDAgSW5pdGlhdGl2ZSBpcyBmb3IgNDAgcGVyY2VudCBvZlxuICAgICAgICAgICAgICAgIGJlbmVmaXRzIG9mIEZlZGVyYWwgcHJvZ3JhbXMgaW4gc2V2ZW4ga2V5IGFyZWFzIHRvIGZsb3cgdG9cbiAgICAgICAgICAgICAgICBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzLiBUaGVzZSBzZXZlbiBrZXkgYXJlYXMgYXJlOiBjbGltYXRlXG4gICAgICAgICAgICAgICAgY2hhbmdlLCBjbGVhbiBlbmVyZ3kgYW5kIGVuZXJneSBlZmZpY2llbmN5LCBjbGVhbiB0cmFuc2l0LFxuICAgICAgICAgICAgICAgIGFmZm9yZGFibGUgYW5kIHN1c3RhaW5hYmxlIGhvdXNpbmcsIHRyYWluaW5nIGFuZCB3b3JrZm9yY2VcbiAgICAgICAgICAgICAgICBkZXZlbG9wbWVudCwgcmVtZWRpYXRpb24gb2YgbGVnYWN5IHBvbGx1dGlvbiwgYW5kIGNsZWFuIHdhdGVyXG4gICAgICAgICAgICAgICAgaW5mcmFzdHJ1Y3R1cmUuXG4gICAgICAgICAgICAgICAgICBgfS8+XG5cbiAgICAgICAgICAgIDxwPjxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgIGlkPXsnaW5kZXguYWJvdXRDb250ZW50LnAzJ31cbiAgICAgICAgICAgICAgZGVzY3JpcHRpb249eydwYXJhZ3JhcGggMyBvZiBtYWluIGNvbnRlbnQgb24gaW5kZXggcGFnZSd9XG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPXtgXG4gICAgICAgICAgICAgICAgICBSZWFkIG1vcmUgYWJvdXQgdGhlIEp1c3RpY2U0MCBJbml0aWF0aXZlIGluIFByZXNpZGVudCBCaWRlbuKAmXMgXG4gICAgICAgICAgICAgICAgICB7cHJlc2lkZW50TGlua31cbiAgICAgICAgICAgICAgICAgIGB9XG4gICAgICAgICAgICAgIHZhbHVlcz17e1xuICAgICAgICAgICAgICAgIHByZXNpZGVudExpbms6XG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBocmVmPXtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucHJlc2lkZW50YWxMaW5rVXJpKX1cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiPntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMucHJlc2lkZW50YWxMaW5rTGFiZWwpfVxuICAgICAgICAgICAgICAgICAgPC9hPixcbiAgICAgICAgICAgICAgfX0vPlxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPC9BYm91dENhcmQ+XG4gICAgICAgIDwvQWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lclxuICAgICAgICBmdWxsV2lkdGg9e3RydWV9XG4gICAgICAgIGJsdWVCYWNrZ3JvdW5kPXt0cnVlfT5cbiAgICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0LXBhZ2UnfT5cbiAgICAgICAgICA8QWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgICAgICAgIDxBYm91dENhcmRcbiAgICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgICAgaW1nU3JjPXthY2NvdW50QmFsYW5jZUljb259XG4gICAgICAgICAgICAgIGhlYWRlcj17J0ZlZGVyYWwgcHJvZ3JhbSBtYW5hZ2Vycyd9XG4gICAgICAgICAgICAgIGFjdGlvblRleHQ9eydHbyB0byBkYXRhICYgbWV0aG9kb2xvZ3knfVxuICAgICAgICAgICAgICBhY3Rpb25Vcmw9eycuL21ldGhvZG9sb2d5J30+XG4gICAgICAgICAgICAgIERvd25sb2FkIHRoZSBzY3JlZW5pbmcgdG9vbOKAmXMgZHJhZnQgbGlzdCBvZiBwcmlvcml0aXplZFxuICAgICAgICAgICAgICBjb21tdW5pdGllcyBhbmQgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBpdCBmb3IgeW91ciBwcm9ncmFtIGluXG4gICAgICAgICAgICAgIHRoZSBmdXR1cmUgb24gdGhlIGRhdGEgYW5kIG1ldGhvZG9sb2d5IHBhZ2UuXG4gICAgICAgICAgICA8L0Fib3V0Q2FyZD5cblxuICAgICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgICBzaXplPXsnc21hbGwnfVxuICAgICAgICAgICAgICBpbWdTcmM9e2dyb3Vwc0ljb259XG4gICAgICAgICAgICAgIGhlYWRlcj17J0NvbW11bml0eSBtZW1iZXJzJ31cbiAgICAgICAgICAgICAgYWN0aW9uVGV4dD17J0V4cGxvcmUgdGhlIHRvb2wnfVxuICAgICAgICAgICAgICBhY3Rpb25Vcmw9eycuL2NlanN0J30+XG4gICAgICAgICAgICAgIEZpbmQgeW91ciBjb21tdW5pdHkgb3IgY29tbXVuaXRpZXMgdGhhdCB5b3UgbWF5IGJlIGZhbWlsaWFyIHdpdGhcbiAgICAgICAgICAgICAgYW5kIGNoZWNrIHRoZWlyIHByaW9yaXRpemF0aW9uIGluZm9ybWF0aW9uIG9uIHRoZSBtYXAuXG4gICAgICAgICAgICA8L0Fib3V0Q2FyZD5cbiAgICAgICAgICA8L0Fib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXJcbiAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0LXBhZ2UnfT5cbiAgICAgICAgPEFib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGltZ1NyYz17Y29tbWVudEljb259XG4gICAgICAgICAgICBoZWFkZXI9eydTZW5kIEZlZWRiYWNrJ31cbiAgICAgICAgICAgIGFjdGlvblRleHQ9eydFbWFpbDogc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdid9XG4gICAgICAgICAgICBhY3Rpb25Vcmw9eydtYWlsdG86c2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdid9PlxuICAgICAgICAgICAgSGF2ZSBpZGVhcyBhYm91dCBob3cgdG8gYWNrbm93bGVkZ2UgdGhlIG9uLXRoZS1ncm91bmQgZXhwZXJpZW5jZXNcbiAgICAgICAgICAgIG9mIHlvdXIgY29tbXVuaXR5P1xuICAgICAgICAgIDwvQWJvdXRDYXJkPlxuXG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGltZ1NyYz17Z2l0aHViSWNvbn1cbiAgICAgICAgICAgIGhlYWRlcj17J0pvaW4gdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSd9XG4gICAgICAgICAgICBhY3Rpb25UZXh0PXsnQ2hlY2sgaXQgb3V0IG9uIEdpdEh1Yid9XG4gICAgICAgICAgICBhY3Rpb25Vcmw9eydodHRwczovL2dpdGh1Yi5jb20vdXNkcy9qdXN0aWNlNDAtdG9vbCd9XG4gICAgICAgICAgICBhY3Rpb25PcGVuSW5OZXdUYWI9e3RydWV9PlxuICAgICAgICAgICAgVGhlIHNjcmVlbmluZyB0b29s4oCZcyBjb2RlIGlzIG9wZW4gc291cmNlLCB3aGljaCBtZWFucyBpdCBpc1xuICAgICAgICAgICAgYXZhaWxhYmxlIGZvciB0aGUgcHVibGljIHRvIHZpZXcgYW5kIGNvbnRyaWJ1dGUgdG8uIEFueW9uZSBjYW5cbiAgICAgICAgICAgIHZpZXcgYW5kIGNvbnRyaWJ1dGUgb24gR2l0SHViLlxuICAgICAgICAgIDwvQWJvdXRDYXJkPlxuICAgICAgICA8L0Fib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgIDwvTGF5b3V0Pik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbmRleFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1265\n")}}]); \ No newline at end of file diff --git a/main/component---src-pages-methodology-tsx-81f2bf4fb8f983241e36.js b/main/component---src-pages-methodology-tsx-81f2bf4fb8f983241e36.js deleted file mode 100644 index a82c00ce..00000000 --- a/main/component---src-pages-methodology-tsx-81f2bf4fb8f983241e36.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[647],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},6445:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n// Trussworks GridContainer won't allow it to span 100% of the page, so\n// this works around it and tries to hide the complexity in component\nvar J40MainGridContainer=function J40MainGridContainer(_ref){var children=_ref.children,_ref$fullWidth=_ref.fullWidth,fullWidth=_ref$fullWidth===void 0?false:_ref$fullWidth,_ref$blueBackground=_ref.blueBackground,blueBackground=_ref$blueBackground===void 0?false:_ref$blueBackground,_ref$className=_ref.className,className=_ref$className===void 0?'j40-grid-container ':_ref$className;// is it a blue background strip?\nclassName+=blueBackground?'j40-main-grid-blue-bk ':'';return fullWidth?/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\",{className:'j40-grid-container '+className},children):/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.GridContainer,{containerSize:'desktop-lg',className:'j40-grid-container '+className},children);};/* harmony default export */ __webpack_exports__[\"Z\"] = (J40MainGridContainer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyLnRzeD84ODk4Il0sIm5hbWVzIjpbIko0ME1haW5HcmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJmdWxsV2lkdGgiLCJibHVlQmFja2dyb3VuZCIsImNsYXNzTmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQVdBLEdBQU1BLHFCQUFvQixDQUFHLFFBQXZCQSxxQkFBdUIsTUFJMEIsSUFIckRDLFNBR3FELE1BSHJEQSxRQUdxRCxxQkFGckRDLFNBRXFELENBRnJEQSxTQUVxRCx5QkFGekMsS0FFeUMseUNBRHJEQyxjQUNxRCxDQURyREEsY0FDcUQsOEJBRHBDLEtBQ29DLHlDQUFyREMsU0FBcUQsQ0FBckRBLFNBQXFELHlCQUF6QyxxQkFBeUMsZ0JBQ3JEO0FBQ0FBLFNBQVMsRUFBS0QsY0FBYyxDQUFHLHdCQUFILENBQThCLEVBQTFELENBRUEsTUFBT0QsVUFBUyxjQUNkLHdEQUNFLFNBQVMsQ0FBRSxzQkFBd0JFLFNBRHJDLEVBRUdILFFBRkgsQ0FEYyxjQU1kLGlEQUFDLGtFQUFELEVBQ0UsYUFBYSxDQUFFLFlBRGpCLENBRUUsU0FBUyxDQUFFLHNCQUF3QkcsU0FGckMsRUFHR0gsUUFISCxDQU5GLENBWUQsQ0FwQkQsQ0FzQkEseURBQWVELG9CQUFmIiwiZmlsZSI6IjY0NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUcnVzc3dvcmtzIEdyaWRDb250YWluZXIgd29uJ3QgYWxsb3cgaXQgdG8gc3BhbiAxMDAlIG9mIHRoZSBwYWdlLCBzb1xuLy8gdGhpcyB3b3JrcyBhcm91bmQgaXQgYW5kIHRyaWVzIHRvIGhpZGUgdGhlIGNvbXBsZXhpdHkgaW4gY29tcG9uZW50XG5pbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lcn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbnRlcmZhY2UgSUxheW91dFByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgZnVsbFdpZHRoPzogYm9vbGVhbixcbiAgIGJsdWVCYWNrZ3JvdW5kPzogYm9vbGVhbixcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IEo0ME1haW5HcmlkQ29udGFpbmVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGZ1bGxXaWR0aCA9IGZhbHNlLFxuICBibHVlQmFja2dyb3VuZCA9IGZhbHNlLFxuICBjbGFzc05hbWUgPSAnajQwLWdyaWQtY29udGFpbmVyICd9OiBJTGF5b3V0UHJvcHMpID0+IHtcbiAgLy8gaXMgaXQgYSBibHVlIGJhY2tncm91bmQgc3RyaXA/XG4gIGNsYXNzTmFtZSArPSAoYmx1ZUJhY2tncm91bmQgPyAnajQwLW1haW4tZ3JpZC1ibHVlLWJrICcgOiAnJyk7XG5cbiAgcmV0dXJuIGZ1bGxXaWR0aCA/IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9eydqNDAtZ3JpZC1jb250YWluZXIgJyArIGNsYXNzTmFtZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICkgOiAoXG4gICAgPEdyaWRDb250YWluZXJcbiAgICAgIGNvbnRhaW5lclNpemU9eydkZXNrdG9wLWxnJ31cbiAgICAgIGNsYXNzTmFtZT17J2o0MC1ncmlkLWNvbnRhaW5lciAnICsgY2xhc3NOYW1lfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0dyaWRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYWluR3JpZENvbnRhaW5lcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6445\n")},2881: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 */ methodology; }\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: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/DatasetCard/datasetCard.module.scss\n// extracted by mini-css-extract-plugin\nvar datasetCard = "datasetCard-module--datasetCard--26okZ";\nvar datasetCardIndicator = "datasetCard-module--datasetCardIndicator--14lIn";\nvar datasetCardWhatIsIt = "datasetCard-module--datasetCardWhatIsIt--2J87w";\nvar datasetCardList = "datasetCard-module--datasetCardList--Ok3_o";\nvar datasetCardListItem = "datasetCard-module--datasetCardListItem--rMDxc";\nvar datasetCardDescription = "datasetCard-module--datasetCardDescription--2agib";\nvar datasetCardLabels = "datasetCard-module--datasetCardLabels--3jLC0";\n;// CONCATENATED MODULE: ./src/components/DatasetCard/index.tsx\nvar DatasetCard=function DatasetCard(_ref){var datasetCardProps=_ref.datasetCardProps;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({whatIsIt:{id:\'datasetCard.whatIsIt\',defaultMessage:\'What is it?\',description:\'label associated with explaining the card\'},dataResolution:{id:\'datasetCard.dataResolution\',defaultMessage:\'Data resolution: \',description:\'label associated with explaining the card\'},dataSource:{id:\'datasetCard.dataSource\',defaultMessage:\'Data source: \',description:\'label associated with explaining the card\'},dataDateRange:{id:\'datasetCard.dataDateRange\',defaultMessage:\'Data date range: \',description:\'label associated with explaining the card\'}});return/*#__PURE__*/react.createElement("div",{className:datasetCard},/*#__PURE__*/react.createElement("h3",{className:datasetCardIndicator},datasetCardProps.indicator),/*#__PURE__*/react.createElement("div",{className:datasetCardWhatIsIt},intl.formatMessage(messages.whatIsIt)),/*#__PURE__*/react.createElement("div",{className:datasetCardDescription},datasetCardProps.description),/*#__PURE__*/react.createElement("ul",{className:datasetCardList},/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(messages.dataResolution)),datasetCardProps.dataResolution),/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(messages.dataSource)),/*#__PURE__*/react.createElement("a",{href:datasetCardProps.dataSourceURL,target:\'_blank\',rel:"noreferrer"},datasetCardProps.dataSourceLabel)),/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(messages.dataDateRange)),datasetCardProps.dataDateRange)));};/* harmony default export */ var components_DatasetCard = (DatasetCard);\n;// CONCATENATED MODULE: ./src/components/DatasetContainer/dsContainer.module.scss\n// extracted by mini-css-extract-plugin\nvar datasetContainer = "dsContainer-module--datasetContainer--2_KuU";\nvar datasetContainerHeader = "dsContainer-module--datasetContainerHeader--2HV3A";\nvar datasetContainerSubTitle = "dsContainer-module--datasetContainerSubTitle--3fi8f";\nvar datasetCardsContainer = "dsContainer-module--datasetCardsContainer--129oj";\nvar j40AlertContainer = "dsContainer-module--j40AlertContainer--tiBoq";\n;// CONCATENATED MODULE: ./src/components/DatasetContainer/index.tsx\nvar cards=[{indicator:\'Poverty\',description:"Percent of a block group\'s population in households where the household \\n income is less than or equal to twice the federal \\"poverty level\\"",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Education (less than high school)\',description:"Percent of people age 25 or older in a block group whose education is short of a high school diploma",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Linguistic isolation\',description:"Percent of people in a block group living in linguistically \\n isolated households \\u2014 a linguistically isolated household is a household in \\n which all members aged 14 years and over speak a non-English language and also speak \\n English less than \\"very well\\" (i.e., have difficulty with English)",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Unemployment rate\',description:"Unemployment rate (people who are unemployed divided by the total population of \\n people in the labor force over 16 years old)",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Housing burden\',description:"Percent of households in a census tract that are both low income (making less\\n than 80% of the HUD Area Median Family Income) and severely burdened by housing costs \\n (paying greater than 30% of their income to housing costs)",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"}];var DatasetContainer=function DatasetContainer(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({cumulativeScore:{id:\'datasetContainer.header.cumulativeScore\',defaultMessage:\'Datasets used in cumulative score\',description:\'section label of which datasets are used in cumulative score\'},subTitle:{id:\'datasetContainer.subTitle\',defaultMessage:\'The datasets come from a variety of sources and \'+\'were selected after considering relevance, availability, recency and quality.\',description:\'description of the dataset section\'}});return/*#__PURE__*/react.createElement("div",{className:datasetContainer+" desktop:grid-col"},/*#__PURE__*/react.createElement("div",{className:\'grid-container-desktop-lg\'},/*#__PURE__*/react.createElement("h1",{className:datasetContainerHeader},intl.formatMessage(messages.cumulativeScore)),/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:false,showLimitedDataAlert:true}),/*#__PURE__*/react.createElement("p",{className:datasetContainerSubTitle},intl.formatMessage(messages.subTitle)),/*#__PURE__*/react.createElement("div",{className:datasetCardsContainer},cards.map(function(card){return/*#__PURE__*/react.createElement(components_DatasetCard,{key:card.indicator,datasetCardProps:card});}))));};/* harmony default export */ var components_DatasetContainer = (DatasetContainer);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 4 modules\nvar layout = __webpack_require__(828);\n;// CONCATENATED MODULE: ./src/components/scoreStepsList.tsx\nvar ScoreStepsList=function ScoreStepsList(){return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement("div",{className:\'j40-process-list-wrapper\'},/*#__PURE__*/react.createElement("ul",null,/*#__PURE__*/react.createElement("li",null,/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h3",{className:\'j40-item-list-title\'},"Gather datasets"),/*#__PURE__*/react.createElement("h4",{className:\'j40-item-list-subtitle\'},"Data inputs"),/*#__PURE__*/react.createElement("p",null,"The cumulative index score includes the following equally weighted inputs."),/*#__PURE__*/react.createElement("ul",{className:\'j40-process-nested-list\'},/*#__PURE__*/react.createElement("li",null,"Poverty"),/*#__PURE__*/react.createElement("li",null,"Less than high school education"),/*#__PURE__*/react.createElement("li",null,"Linguistic isolation"),/*#__PURE__*/react.createElement("li",null,"Unemployment rate"),/*#__PURE__*/react.createElement("li",null,"Housing burden")),/*#__PURE__*/react.createElement("h4",{className:\'j40-item-list-subtitle\'},"Combining data from different geographic units"),/*#__PURE__*/react.createElement("p",null,"Some data is not available at the census block group level and is instead only available for larger units such as census tracts or counties. In these cases, all census block groups will get an even contribution from the larger unit. For example, if a census tract scores 90th percentile on an indicator, then all census block groups within that tract will receive a value of 90th percentile."),/*#__PURE__*/react.createElement("h4",{className:\'j40-item-list-subtitle\'},"Normalizing data"),/*#__PURE__*/react.createElement("p",null,"The range of the data that makes up the score varies, so the data must be normalized so that each data indicator can be more equally weighted. Min-max normalization is utilized, where the minimum value in the range of values for each dataset is set at 0, the maximum value is set at 1, and every other value is transformed into a decimal between 0 and 1. For example, if the minimum value for unemployment was 10 and the maximum value was 30, a value of 20 would be transformed to 0.5 since it is halfway between 10 and 30."))),/*#__PURE__*/react.createElement("li",null,/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h3",null,"Calculate cumulative index score"),/*#__PURE__*/react.createElement("p",null,"To combine all variables into a single cumulative index score, we average the normalized values across indicators."),/*#__PURE__*/react.createElement(lib.GridContainer,{className:\'\'},/*#__PURE__*/react.createElement(lib.Grid,{row:true,className:\'j40-math-division-container\'},/*#__PURE__*/react.createElement(lib.Grid,{col:true,className:\'j40-math-eq-left-side grid-col-fill\'},/*#__PURE__*/react.createElement("div",{className:\'j40-math-eq-numerator\'},"Dataset 1 + Dataset 2 + ... + Dataset N"),/*#__PURE__*/react.createElement("div",{className:\'j40-math-eq-denominator\'},"# of datasets")),/*#__PURE__*/react.createElement(lib.Grid,{col:true,className:\'j40-math-eq-middle grid-col-auto\'},"="),/*#__PURE__*/react.createElement(lib.Grid,{col:true,className:\'j40-math-eq-right-side grid-col-fill\'},"Cumulative index score"))))),/*#__PURE__*/react.createElement("li",null,/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h3",{className:\'j40-item-list-title\'},"Assign priority"),/*#__PURE__*/react.createElement("p",null,"Census block groups are sorted by their cumulative index score from highest to lowest. Census block groups that are in the top 25 percentile (i.e. have a cumulative index score in the 75 - 100th percentile) will be considered the prioritized communities."))))));};/* harmony default export */ var scoreStepsList = (ScoreStepsList);\n;// CONCATENATED MODULE: ./src/pages/methodology.tsx\n// markup\nvar IndexPage=function IndexPage(_ref){var location=_ref.location;return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:\'j40-main-content\'},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h1",null,"Methodology"),/*#__PURE__*/react.createElement("p",null,"The Just Progress tool combines demographic, environmental, and socio-economic data to generate a cumulative index score, referred to as the Just Progress Index. The tool currently utilizes national, publically-available data from the United States Census Bureau\\u2019s American Community Survey (ACS) and the EPA\\u2019s EJScreen tool."),/*#__PURE__*/react.createElement("p",null,"The various inputs into the Just Progress Index are averaged into 2 categories: Pollution Burden and Demographics."),/*#__PURE__*/react.createElement("p",null,"Pollution Burden: health risks arising from proximity and potential exposures to pollution and other adverse environmental conditions"),/*#__PURE__*/react.createElement("p",null,"Demographics: sensitive populations and socioeconomic factors that make a community more vulnerable"),/*#__PURE__*/react.createElement("p",null,/*#__PURE__*/react.createElement("b",null,"Pollution Burden average x Demographics average = Just Progress Index")))))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement(components_DatasetContainer,null)))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement(scoreStepsList,null)))));};/* harmony default export */ var methodology = (IndexPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDYXJkL2RhdGFzZXRDYXJkLm1vZHVsZS5zY3NzPzFkYjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9EYXRhc2V0Q2FyZC9pbmRleC50c3g/NTBlYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXIvZHNDb250YWluZXIubW9kdWxlLnNjc3M/YzMzOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXIvaW5kZXgudHN4PzBjN2QiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9zY29yZVN0ZXBzTGlzdC50c3g/ODQ1NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9tZXRob2RvbG9neS50c3g/OTQ3MCJdLCJuYW1lcyI6WyJEYXRhc2V0Q2FyZCIsImRhdGFzZXRDYXJkUHJvcHMiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJ3aGF0SXNJdCIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImRhdGFSZXNvbHV0aW9uIiwiZGF0YVNvdXJjZSIsImRhdGFEYXRlUmFuZ2UiLCJzdHlsZXMiLCJpbmRpY2F0b3IiLCJmb3JtYXRNZXNzYWdlIiwiZGF0YVNvdXJjZVVSTCIsImRhdGFTb3VyY2VMYWJlbCIsImNhcmRzIiwiRGF0YXNldENvbnRhaW5lciIsImN1bXVsYXRpdmVTY29yZSIsInN1YlRpdGxlIiwibWFwIiwiY2FyZCIsIlNjb3JlU3RlcHNMaXN0IiwiSW5kZXhQYWdlIiwibG9jYXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RSwyQ0FDRSxnREFDRSwwQkFBSSxTQUFTLENBQUUscUJBQWYsb0JBREYsY0FFRSw4UkFGRixDQURGLENBM0VGLENBREYsQ0FERixDQURGLENBOEZELENBL0ZELENBaUdBLG1EQUFlQSxjQUFmLEU7O0FDdkZBO0FBQ0EsR0FBTUMsVUFBUyxDQUFHLFFBQVpBLFVBQVksTUFBaUMsSUFBL0JDLFNBQStCLE1BQS9CQSxRQUErQixDQUNqRCxtQkFDRSxvQkFBQyxxQkFBRCxFQUFRLFFBQVEsQ0FBRUEsUUFBbEIsZUFFRSxvQkFBQyxtQ0FBRCxtQkFDRSxvQkFBQywyQkFBRCxFQUFjLGFBQWEsQ0FBRSxJQUE3QixDQUFtQyxvQkFBb0IsQ0FBRSxLQUF6RCxFQURGLENBRkYsY0FNRSxvQkFBQyxtQ0FBRCxFQUFzQixTQUFTLENBQUUsa0JBQWpDLGVBQ0Usb0JBQUMsUUFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsZUFDRSxnREFDRSw0Q0FERixjQUVFLCtXQUZGLGNBVUUsa0pBVkYsY0FjRSxxS0FkRixjQW1CRSxtSUFuQkYsY0F1QkUsMENBQ0UscUdBREYsQ0F2QkYsQ0FERixDQURGLENBREYsQ0FORixjQXdDRSxvQkFBQyxtQ0FBRCxFQUFzQixTQUFTLENBQUUsSUFBakMsZUFDRSxvQkFBQyxRQUFELEVBQU0sR0FBRyxLQUFULGVBQ0Usb0JBQUMsUUFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLG9CQUFDLDJCQUFELE1BREYsQ0FERixDQURGLENBeENGLGNBZ0RFLG9CQUFDLG1DQUFELG1CQUNFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsZUFBVSxvQkFBQyxRQUFELEVBQU0sR0FBRyxLQUFULGVBQ1Isb0JBQUMsY0FBRCxNQURRLENBQVYsQ0FERixDQWhERixDQURGLENBd0RELENBekRELENBMkRBLGdEQUFlRCxTQUFmIiwiZmlsZSI6IjI4ODEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgZGF0YXNldENhcmQgPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmQtLTI2b2taXCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkSW5kaWNhdG9yID0gXCJkYXRhc2V0Q2FyZC1tb2R1bGUtLWRhdGFzZXRDYXJkSW5kaWNhdG9yLS0xNGxJblwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZFdoYXRJc0l0ID0gXCJkYXRhc2V0Q2FyZC1tb2R1bGUtLWRhdGFzZXRDYXJkV2hhdElzSXQtLTJKODd3XCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkTGlzdCA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZExpc3QtLU9rM19vXCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkTGlzdEl0ZW0gPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmRMaXN0SXRlbS0tck1EeGNcIjtcbmV4cG9ydCB2YXIgZGF0YXNldENhcmREZXNjcmlwdGlvbiA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZERlc2NyaXB0aW9uLS0yYWdpYlwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZExhYmVscyA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZExhYmVscy0tM2pMQzBcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9kYXRhc2V0Q2FyZC5tb2R1bGUuc2Nzcyc7XG5cbmludGVyZmFjZSBJRGF0YXNldENhcmRQcm9wcyB7XG4gIGRhdGFzZXRDYXJkUHJvcHM6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfVxufVxuXG5jb25zdCBEYXRhc2V0Q2FyZCA9ICh7ZGF0YXNldENhcmRQcm9wc306SURhdGFzZXRDYXJkUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgd2hhdElzSXQ6IHtcbiAgICAgIGlkOiAnZGF0YXNldENhcmQud2hhdElzSXQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdXaGF0IGlzIGl0PycsXG4gICAgICBkZXNjcmlwdGlvbjogJ2xhYmVsIGFzc29jaWF0ZWQgd2l0aCBleHBsYWluaW5nIHRoZSBjYXJkJyxcbiAgICB9LFxuICAgIGRhdGFSZXNvbHV0aW9uOiB7XG4gICAgICBpZDogJ2RhdGFzZXRDYXJkLmRhdGFSZXNvbHV0aW9uJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YSByZXNvbHV0aW9uOiAnLFxuICAgICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gICAgfSxcbiAgICBkYXRhU291cmNlOiB7XG4gICAgICBpZDogJ2RhdGFzZXRDYXJkLmRhdGFTb3VyY2UnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIHNvdXJjZTogJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnbGFiZWwgYXNzb2NpYXRlZCB3aXRoIGV4cGxhaW5pbmcgdGhlIGNhcmQnLFxuICAgIH0sXG4gICAgZGF0YURhdGVSYW5nZToge1xuICAgICAgaWQ6ICdkYXRhc2V0Q2FyZC5kYXRhRGF0ZVJhbmdlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YSBkYXRlIHJhbmdlOiAnLFxuICAgICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkfT5cbiAgICAgIDxoMyBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZEluZGljYXRvcn0+e2RhdGFzZXRDYXJkUHJvcHMuaW5kaWNhdG9yfTwvaDM+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkV2hhdElzSXR9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMud2hhdElzSXQpfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZERlc2NyaXB0aW9ufT5cbiAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGVzY3JpcHRpb259XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHVsIGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkTGlzdH0+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRhdGFSZXNvbHV0aW9uKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGF0YVJlc29sdXRpb259XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRhdGFTb3VyY2UpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YSBocmVmPXtkYXRhc2V0Q2FyZFByb3BzLmRhdGFTb3VyY2VVUkx9IHRhcmdldD17J19ibGFuayd9IHJlbD1cIm5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgIHtkYXRhc2V0Q2FyZFByb3BzLmRhdGFTb3VyY2VMYWJlbH1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRhdGFEYXRlUmFuZ2UpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZGF0YXNldENhcmRQcm9wcy5kYXRhRGF0ZVJhbmdlfVxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFzZXRDYXJkO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGRhdGFzZXRDb250YWluZXIgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENvbnRhaW5lci0tMl9LdVVcIjtcbmV4cG9ydCB2YXIgZGF0YXNldENvbnRhaW5lckhlYWRlciA9IFwiZHNDb250YWluZXItbW9kdWxlLS1kYXRhc2V0Q29udGFpbmVySGVhZGVyLS0ySFYzQVwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q29udGFpbmVyU3ViVGl0bGUgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENvbnRhaW5lclN1YlRpdGxlLS0zZmk4ZlwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZHNDb250YWluZXIgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENhcmRzQ29udGFpbmVyLS0xMjlvalwiO1xuZXhwb3J0IHZhciBqNDBBbGVydENvbnRhaW5lciA9IFwiZHNDb250YWluZXItbW9kdWxlLS1qNDBBbGVydENvbnRhaW5lci0tdGlCb3FcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQgRGF0YXNldENhcmQgZnJvbSAnLi4vRGF0YXNldENhcmQnO1xuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vZHNDb250YWluZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9BbGVydFdyYXBwZXInO1xuXG5leHBvcnQgY29uc3QgY2FyZHMgPSBbXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdQb3ZlcnR5JyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgYSBibG9jayBncm91cCdzIHBvcHVsYXRpb24gaW4gaG91c2Vob2xkcyB3aGVyZSB0aGUgaG91c2Vob2xkIFxuICAgIGluY29tZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdHdpY2UgdGhlIGZlZGVyYWwgXCJwb3ZlcnR5IGxldmVsXCJgLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBVLlMuIENlbnN1cyBCdXJlYXVgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5jZW5zdXMuZ292L2AsXG4gICAgZGF0YURhdGVSYW5nZTogYDUteWVhciBlc3RpbWF0ZXMsIDIwMTUtMjAxOWAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdFZHVjYXRpb24gKGxlc3MgdGhhbiBoaWdoIHNjaG9vbCknLFxuICAgIGRlc2NyaXB0aW9uOiBgUGVyY2VudCBvZiBwZW9wbGUgYWdlIDI1IG9yIG9sZGVyIGluIGEgYmxvY2sgZ3JvdXAgd2hvc2UgZWR1Y2F0aW9uIGlzIHNob3J0IG9mIGEgaGlnaCBzY2hvb2wgZGlwbG9tYWAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYFUuUy4gQ2Vuc3VzIEJ1cmVhdWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgNS15ZWFyIGVzdGltYXRlcywgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0xpbmd1aXN0aWMgaXNvbGF0aW9uJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgcGVvcGxlIGluIGEgYmxvY2sgZ3JvdXAgbGl2aW5nIGluIGxpbmd1aXN0aWNhbGx5IFxuICAgIGlzb2xhdGVkIGhvdXNlaG9sZHMg4oCUIGEgbGluZ3Vpc3RpY2FsbHkgaXNvbGF0ZWQgaG91c2Vob2xkIGlzIGEgaG91c2Vob2xkIGluIFxuICAgIHdoaWNoIGFsbCBtZW1iZXJzIGFnZWQgMTQgeWVhcnMgYW5kIG92ZXIgc3BlYWsgYSBub24tRW5nbGlzaCBsYW5ndWFnZSBhbmQgYWxzbyBzcGVhayBcbiAgICBFbmdsaXNoIGxlc3MgdGhhbiBcInZlcnkgd2VsbFwiIChpLmUuLCBoYXZlIGRpZmZpY3VsdHkgd2l0aCBFbmdsaXNoKWAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYFUuUy4gQ2Vuc3VzIEJ1cmVhdWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgNS15ZWFyIGVzdGltYXRlcywgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ1VuZW1wbG95bWVudCByYXRlJyxcbiAgICBkZXNjcmlwdGlvbjogYFVuZW1wbG95bWVudCByYXRlIChwZW9wbGUgd2hvIGFyZSB1bmVtcGxveWVkIGRpdmlkZWQgYnkgdGhlIHRvdGFsIHBvcHVsYXRpb24gb2YgXG4gICAgICBwZW9wbGUgaW4gdGhlIGxhYm9yIGZvcmNlIG92ZXIgMTYgeWVhcnMgb2xkKWAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYFUuUy4gQ2Vuc3VzIEJ1cmVhdWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgNS15ZWFyIGVzdGltYXRlcywgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0hvdXNpbmcgYnVyZGVuJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgaG91c2Vob2xkcyBpbiBhIGNlbnN1cyB0cmFjdCB0aGF0IGFyZSBib3RoIGxvdyBpbmNvbWUgKG1ha2luZyBsZXNzXG4gICAgICAgdGhhbiA4MCUgb2YgdGhlIEhVRCBBcmVhIE1lZGlhbiBGYW1pbHkgSW5jb21lKSBhbmQgc2V2ZXJlbHkgYnVyZGVuZWQgYnkgaG91c2luZyBjb3N0cyBcbiAgICAgICAocGF5aW5nIGdyZWF0ZXIgdGhhbiAzMCUgb2YgdGhlaXIgaW5jb21lIHRvIGhvdXNpbmcgY29zdHMpYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgVS5TLiBDZW5zdXMgQnVyZWF1YCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9gLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGA1LXllYXIgZXN0aW1hdGVzLCAyMDE1LTIwMTlgLFxuICB9LFxuXG5dO1xuXG5jb25zdCBEYXRhc2V0Q29udGFpbmVyID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICBjdW11bGF0aXZlU2NvcmU6IHtcbiAgICAgIGlkOiAnZGF0YXNldENvbnRhaW5lci5oZWFkZXIuY3VtdWxhdGl2ZVNjb3JlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YXNldHMgdXNlZCBpbiBjdW11bGF0aXZlIHNjb3JlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnc2VjdGlvbiBsYWJlbCBvZiB3aGljaCBkYXRhc2V0cyBhcmUgdXNlZCBpbiBjdW11bGF0aXZlIHNjb3JlJyxcbiAgICB9LFxuICAgIHN1YlRpdGxlOiB7XG4gICAgICBpZDogJ2RhdGFzZXRDb250YWluZXIuc3ViVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgZGF0YXNldHMgY29tZSBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZCAnICtcbiAgICAgICAgJ3dlcmUgc2VsZWN0ZWQgYWZ0ZXIgY29uc2lkZXJpbmcgcmVsZXZhbmNlLCBhdmFpbGFiaWxpdHksIHJlY2VuY3kgYW5kIHF1YWxpdHkuJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnZGVzY3JpcHRpb24gb2YgdGhlIGRhdGFzZXQgc2VjdGlvbicsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YCR7c3R5bGVzLmRhdGFzZXRDb250YWluZXJ9IGRlc2t0b3A6Z3JpZC1jb2xgfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsnZ3JpZC1jb250YWluZXItZGVza3RvcC1sZyd9PlxuICAgICAgICA8aDEgY2xhc3NOYW1lPXtzdHlsZXMuZGF0YXNldENvbnRhaW5lckhlYWRlcn0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5jdW11bGF0aXZlU2NvcmUpfTwvaDE+XG4gICAgICAgIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17ZmFsc2V9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXt0cnVlfS8+XG4gICAgICAgIDxwIGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDb250YWluZXJTdWJUaXRsZX0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5zdWJUaXRsZSl9PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkc0NvbnRhaW5lcn0+XG4gICAgICAgICAge2NhcmRzLm1hcCgoY2FyZCkgPT4gPERhdGFzZXRDYXJkXG4gICAgICAgICAgICBrZXk9e2NhcmQuaW5kaWNhdG9yfVxuICAgICAgICAgICAgZGF0YXNldENhcmRQcm9wcz17Y2FyZH0vPil9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRhc2V0Q29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lciwgR3JpZH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5jb25zdCBTY29yZVN0ZXBzTGlzdCA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGRpdiBjbGFzc05hbWU9eydqNDAtcHJvY2Vzcy1saXN0LXdyYXBwZXInfT5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPXsnajQwLWl0ZW0tbGlzdC10aXRsZSd9PkdhdGhlciBkYXRhc2V0czwvaDM+XG4gICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9eydqNDAtaXRlbS1saXN0LXN1YnRpdGxlJ30+RGF0YSBpbnB1dHM8L2g0PlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUaGUgY3VtdWxhdGl2ZSBpbmRleCBzY29yZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGVxdWFsbHlcbiAgICAgICAgICAgICAgICB3ZWlnaHRlZCBpbnB1dHMuXG4gICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICA8dWwgY2xhc3NOYW1lPXsnajQwLXByb2Nlc3MtbmVzdGVkLWxpc3QnfT5cbiAgICAgICAgICAgICAgICA8bGk+UG92ZXJ0eTwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPkxlc3MgdGhhbiBoaWdoIHNjaG9vbCBlZHVjYXRpb248L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5MaW5ndWlzdGljIGlzb2xhdGlvbjwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPlVuZW1wbG95bWVudCByYXRlPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+SG91c2luZyBidXJkZW48L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuXG5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT17J2o0MC1pdGVtLWxpc3Qtc3VidGl0bGUnfT5cbiAgICAgICAgICAgICAgICBDb21iaW5pbmcgZGF0YSBmcm9tIGRpZmZlcmVudCBnZW9ncmFwaGljIHVuaXRzXG4gICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIFNvbWUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBjZW5zdXMgYmxvY2sgZ3JvdXAgbGV2ZWwgYW5kXG4gICAgICAgICAgICAgICAgaXMgaW5zdGVhZCBvbmx5IGF2YWlsYWJsZSBmb3IgbGFyZ2VyIHVuaXRzIHN1Y2ggYXMgY2Vuc3VzIHRyYWN0c1xuICAgICAgICAgICAgICAgIG9yIGNvdW50aWVzLiBJbiB0aGVzZSBjYXNlcywgYWxsIGNlbnN1cyBibG9jayBncm91cHMgd2lsbCBnZXQgYW5cbiAgICAgICAgICAgICAgICBldmVuIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBsYXJnZXIgdW5pdC4gRm9yIGV4YW1wbGUsIGlmIGEgY2Vuc3VzXG4gICAgICAgICAgICAgICAgdHJhY3Qgc2NvcmVzIDkwdGggcGVyY2VudGlsZSBvbiBhbiBpbmRpY2F0b3IsIHRoZW4gYWxsIGNlbnN1c1xuICAgICAgICAgICAgICAgIGJsb2NrIGdyb3VwcyB3aXRoaW4gdGhhdCB0cmFjdCB3aWxsIHJlY2VpdmUgYSB2YWx1ZSBvZiA5MHRoXG4gICAgICAgICAgICAgICAgcGVyY2VudGlsZS5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPXsnajQwLWl0ZW0tbGlzdC1zdWJ0aXRsZSd9Pk5vcm1hbGl6aW5nIGRhdGE8L2g0PlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUaGUgcmFuZ2Ugb2YgdGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgc2NvcmUgdmFyaWVzLCBzbyB0aGVcbiAgICAgICAgICAgICAgICBkYXRhIG11c3QgYmUgbm9ybWFsaXplZCBzbyB0aGF0IGVhY2ggZGF0YSBpbmRpY2F0b3IgY2FuIGJlIG1vcmVcbiAgICAgICAgICAgICAgICBlcXVhbGx5IHdlaWdodGVkLiBNaW4tbWF4IG5vcm1hbGl6YXRpb24gaXMgdXRpbGl6ZWQsIHdoZXJlIHRoZVxuICAgICAgICAgICAgICAgIG1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlIG9mIHZhbHVlcyBmb3IgZWFjaCBkYXRhc2V0IGlzIHNldCBhdFxuICAgICAgICAgICAgICAgIDAsIHRoZSBtYXhpbXVtIHZhbHVlIGlzIHNldCBhdCAxLCBhbmQgZXZlcnkgb3RoZXIgdmFsdWUgaXNcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBpbnRvIGEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDEuIEZvciBleGFtcGxlLCBpZiB0aGVcbiAgICAgICAgICAgICAgICBtaW5pbXVtIHZhbHVlIGZvciB1bmVtcGxveW1lbnQgd2FzIDEwIGFuZCB0aGUgbWF4aW11bSB2YWx1ZSB3YXNcbiAgICAgICAgICAgICAgICAzMCwgYSB2YWx1ZSBvZiAyMCB3b3VsZCBiZSB0cmFuc2Zvcm1lZCB0byAwLjUgc2luY2UgaXQgaXNcbiAgICAgICAgICAgICAgICBoYWxmd2F5IGJldHdlZW4gMTAgYW5kIDMwLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgPC9saT5cblxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDM+Q2FsY3VsYXRlIGN1bXVsYXRpdmUgaW5kZXggc2NvcmU8L2gzPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUbyBjb21iaW5lIGFsbCB2YXJpYWJsZXMgaW50byBhIHNpbmdsZSBjdW11bGF0aXZlIGluZGV4IHNjb3JlLFxuICAgICAgICAgICAgICAgIHdlIGF2ZXJhZ2UgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzIGFjcm9zcyBpbmRpY2F0b3JzLlxuICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgPEdyaWRDb250YWluZXIgY2xhc3NOYW1lPXsnJ30+XG4gICAgICAgICAgICAgICAgPEdyaWQgcm93IGNsYXNzTmFtZT17J2o0MC1tYXRoLWRpdmlzaW9uLWNvbnRhaW5lcid9PlxuICAgICAgICAgICAgICAgICAgPEdyaWQgY29sIGNsYXNzTmFtZT17J2o0MC1tYXRoLWVxLWxlZnQtc2lkZSBncmlkLWNvbC1maWxsJ30+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXsnajQwLW1hdGgtZXEtbnVtZXJhdG9yJ30+XG4gICAgICAgICAgICAgICAgICAgICAgRGF0YXNldCAxICsgRGF0YXNldCAyICsgLi4uICsgRGF0YXNldCBOXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1tYXRoLWVxLWRlbm9taW5hdG9yJ30+XG4gICAgICAgICAgICAgICAgICAgICAgIyBvZiBkYXRhc2V0c1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICAgICAgICAgIDxHcmlkIGNvbCBjbGFzc05hbWU9eydqNDAtbWF0aC1lcS1taWRkbGUgZ3JpZC1jb2wtYXV0byd9PlxuICAgICAgICAgICAgICAgICAgICA9XG4gICAgICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgICAgICA8R3JpZCBjb2wgY2xhc3NOYW1lPXsnajQwLW1hdGgtZXEtcmlnaHQtc2lkZSBncmlkLWNvbC1maWxsJ30+XG4gICAgICAgICAgICAgICAgICAgIEN1bXVsYXRpdmUgaW5kZXggc2NvcmVcbiAgICAgICAgICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgIDwvR3JpZENvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICA8L2xpPlxuXG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9eydqNDAtaXRlbS1saXN0LXRpdGxlJ30+QXNzaWduIHByaW9yaXR5PC9oMz5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgQ2Vuc3VzIGJsb2NrIGdyb3VwcyBhcmUgc29ydGVkIGJ5IHRoZWlyIGN1bXVsYXRpdmUgaW5kZXggc2NvcmVcbiAgICAgICAgICAgICAgICBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0LiBDZW5zdXMgYmxvY2sgZ3JvdXBzIHRoYXQgYXJlIGluIHRoZSB0b3BcbiAgICAgICAgICAgICAgICAyNSBwZXJjZW50aWxlIChpLmUuIGhhdmUgYSBjdW11bGF0aXZlIGluZGV4IHNjb3JlIGluIHRoZSA3NSAtXG4gICAgICAgICAgICAgICAgMTAwdGggcGVyY2VudGlsZSkgd2lsbCBiZSBjb25zaWRlcmVkIHRoZSBwcmlvcml0aXplZFxuICAgICAgICAgICAgICAgIGNvbW11bml0aWVzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2NvcmVTdGVwc0xpc3Q7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0dyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9jb21wb25lbnRzL0FsZXJ0V3JhcHBlcic7XG5pbXBvcnQgRGF0YXNldENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXInO1xuaW1wb3J0IEo0ME1haW5HcmlkQ29udGFpbmVyIGZyb20gJy4uL2NvbXBvbmVudHMvSjQwTWFpbkdyaWRDb250YWluZXInO1xuaW1wb3J0IExheW91dCBmcm9tICcuLi9jb21wb25lbnRzL2xheW91dCc7XG5pbXBvcnQgU2NvcmVTdGVwc0xpc3QgZnJvbSAnLi4vY29tcG9uZW50cy9zY29yZVN0ZXBzTGlzdCc7XG5cbmludGVyZmFjZSBNZXRob2RQYWdlUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb247XG59XG5cbi8vIG1hcmt1cFxuY29uc3QgSW5kZXhQYWdlID0gKHtsb2NhdGlvbn06IE1ldGhvZFBhZ2VQcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxMYXlvdXQgbG9jYXRpb249e2xvY2F0aW9ufT5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e3RydWV9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXtmYWxzZX0vPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyIGNsYXNzTmFtZT17J2o0MC1tYWluLWNvbnRlbnQnfT5cbiAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgIDxHcmlkIGNvbD5cbiAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDE+TWV0aG9kb2xvZ3k8L2gxPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFRoZSBKdXN0IFByb2dyZXNzIHRvb2wgY29tYmluZXMgZGVtb2dyYXBoaWMsIGVudmlyb25tZW50YWwsIGFuZFxuICAgICAgICAgICAgc29jaW8tZWNvbm9taWMgZGF0YSB0byBnZW5lcmF0ZSBhIGN1bXVsYXRpdmUgaW5kZXggc2NvcmUsIHJlZmVycmVkXG4gICAgICAgICAgICB0byBhcyB0aGUgSnVzdCBQcm9ncmVzcyBJbmRleC4gVGhlIHRvb2wgY3VycmVudGx5IHV0aWxpemVzXG4gICAgICAgICAgICBuYXRpb25hbCxcbiAgICAgICAgICAgIHB1YmxpY2FsbHktYXZhaWxhYmxlIGRhdGEgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgQnVyZWF14oCZc1xuICAgICAgICAgICAgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAoQUNTKSBhbmQgdGhlIEVQQeKAmXMgRUpTY3JlZW4gdG9vbC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFRoZSB2YXJpb3VzIGlucHV0cyBpbnRvIHRoZSBKdXN0IFByb2dyZXNzIEluZGV4IGFyZSBhdmVyYWdlZCBpbnRvXG4gICAgICAgICAgICAyIGNhdGVnb3JpZXM6IFBvbGx1dGlvbiBCdXJkZW4gYW5kIERlbW9ncmFwaGljcy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFBvbGx1dGlvbiBCdXJkZW46IGhlYWx0aCByaXNrcyBhcmlzaW5nIGZyb20gcHJveGltaXR5IGFuZFxuICAgICAgICAgICAgcG90ZW50aWFsIGV4cG9zdXJlcyB0byBwb2xsdXRpb24gYW5kIG90aGVyIGFkdmVyc2UgZW52aXJvbm1lbnRhbFxuICAgICAgICAgICAgY29uZGl0aW9uc1xuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgRGVtb2dyYXBoaWNzOiBzZW5zaXRpdmUgcG9wdWxhdGlvbnMgYW5kIHNvY2lvZWNvbm9taWMgZmFjdG9ycyB0aGF0XG4gICAgICAgICAgICBtYWtlIGEgY29tbXVuaXR5IG1vcmUgdnVsbmVyYWJsZVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIDxiPlBvbGx1dGlvbiBCdXJkZW4gYXZlcmFnZSB4IERlbW9ncmFwaGljcyBhdmVyYWdlID0gSnVzdCBQcm9ncmVzc1xuICAgICAgICAgICAgICBJbmRleDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgIDwvR3JpZD48L0dyaWQ+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXIgZnVsbFdpZHRoPXt0cnVlfT5cbiAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgIDxHcmlkIGNvbD5cbiAgICAgICAgICAgIDxEYXRhc2V0Q29udGFpbmVyLz5cbiAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEdyaWQgcm93PjxHcmlkIGNvbD5cbiAgICAgICAgICA8U2NvcmVTdGVwc0xpc3QvPlxuICAgICAgICA8L0dyaWQ+PC9HcmlkPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICA8L0xheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4UGFnZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2881\n')}}]); \ No newline at end of file diff --git a/main/component---src-pages-methodology-tsx-928e808aca461578a225.js b/main/component---src-pages-methodology-tsx-928e808aca461578a225.js new file mode 100644 index 00000000..6949cd2d --- /dev/null +++ b/main/component---src-pages-methodology-tsx-928e808aca461578a225.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[647],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": function() { return /* binding */ components_AlertWrapper; }\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;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = \"alertWrapper-module--alertWrapper--blPAc\";\nvar alertHide = \"alertWrapper-module--alertHide--9Ud1N\";\nvar alertWarning = \"alertWrapper-module--alertWarning--31gxK\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\n// use like this:\n// \n// \nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({alertBetaTitle:{id:'alert.alertBetaTitle',defaultMessage:'Public beta',description:'Title for an alert inform users that datasets may change'},alertBetaBody:{id:'alert.alertBetaBody',defaultMessage:'This website may be continuously updated',description:'Body for an alert inform users that datasets may change'},alertDataLimitedTitle:{id:'alert.alertDataLimitedTitle',defaultMessage:'Limited data sources',description:'Title for an alert inform users that datasets may change'},alertDataLimitedBody:{id:'alert.alertDataLimitedBody',defaultMessage:'Datasets may be added, updated, or removed.',description:'Body for an alert inform users that datasets may change'}});return/*#__PURE__*/react.createElement(\"div\",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"info\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertBetaTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertBetaBody)),/*#__PURE__*/react.createElement(\"br\",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:'j40-sitealert',type:\"warning\"},/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-title'},intl.formatMessage(messages.alertDataLimitedTitle)),/*#__PURE__*/react.createElement(\"span\",{className:'j40-sitealert-body'},\" \\u2014 \",intl.formatMessage(messages.alertDataLimitedBody)),/*#__PURE__*/react.createElement(\"br\",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJhbGVydEJldGFUaXRsZSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImFsZXJ0QmV0YUJvZHkiLCJhbGVydERhdGFMaW1pdGVkVGl0bGUiLCJhbGVydERhdGFMaW1pdGVkQm9keSIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSw4RDs7OztBQ1NQO0FBQ0E7QUFDQTtBQUVBLEdBQU1BLGFBQVksQ0FBRyxRQUFmQSxhQUFlLE1BR0ssNkJBRnhCQyxhQUV3QixDQUZ4QkEsYUFFd0IsNkJBRlIsS0FFUSwrQ0FEeEJDLG9CQUN3QixDQUR4QkEsb0JBQ3dCLGdDQURELEtBQ0MsdUJBQ3hCLEdBQU1DLEtBQUksQ0FBR0MsOEJBQU8sRUFBcEIsQ0FDQSxHQUFNQyxTQUFRLENBQUdDLHlDQUFjLENBQUMsQ0FDOUJDLGNBQWMsQ0FBRSxDQUNkQyxFQUFFLENBQUUsc0JBRFUsQ0FFZEMsY0FBYyxDQUNaLGFBSFksQ0FJZEMsV0FBVyxDQUFFLDBEQUpDLENBRGMsQ0FPOUJDLGFBQWEsQ0FBRSxDQUNiSCxFQUFFLENBQUUscUJBRFMsQ0FFYkMsY0FBYyxDQUNaLDBDQUhXLENBSWJDLFdBQVcsQ0FBRSx5REFKQSxDQVBlLENBYTlCRSxxQkFBcUIsQ0FBRSxDQUNyQkosRUFBRSxDQUFFLDZCQURpQixDQUVyQkMsY0FBYyxDQUNaLHNCQUhtQixDQUlyQkMsV0FBVyxDQUFFLDBEQUpRLENBYk8sQ0FtQjlCRyxvQkFBb0IsQ0FBRSxDQUNwQkwsRUFBRSxDQUFFLDRCQURnQixDQUVwQkMsY0FBYyxDQUNaLDZDQUhrQixDQUlwQkMsV0FBVyxDQUFFLHlEQUpPLENBbkJRLENBQUQsQ0FBL0IsQ0E0QkEsbUJBQ0UsMkJBQUssU0FBUyxDQUFFSSxZQUFoQixFQUNHYixhQUFhLGVBQ1osb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsTUFBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDRSxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ0UsY0FBNUIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ1ksYUFBTCxDQUFtQlYsUUFBUSxDQUFDTSxhQUE1QixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FGSixDQVNHVCxvQkFBb0IsZUFDbkIsb0JBQUMsU0FBRCxFQUFPLFNBQVMsQ0FBRSxlQUFsQixDQUFtQyxJQUFJLENBQUMsU0FBeEMsZUFDRSw0QkFBTSxTQUFTLENBQUUscUJBQWpCLEVBQXlDQyxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ08scUJBQTVCLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDVCxJQUFJLENBQUNZLGFBQUwsQ0FBbUJWLFFBQVEsQ0FBQ1Esb0JBQTVCLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQVZKLENBREYsQ0FtQkQsQ0FwREQsQ0FzREEsNERBQWViLFlBQWYiLCJmaWxlIjoiNjc4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBhbGVydFdyYXBwZXIgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V3JhcHBlci0tYmxQQWNcIjtcbmV4cG9ydCB2YXIgYWxlcnRIaWRlID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydEhpZGUtLTlVZDFOXCI7XG5leHBvcnQgdmFyIGFsZXJ0V2FybmluZyA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRXYXJuaW5nLS0zMWd4S1wiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0FsZXJ0fSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FsZXJ0V3JhcHBlci5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW50ZXJmYWNlIElBbGVydFdyYXBwZXJQcm9wcyB7XG4gIHNob3dCZXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2Vcbn1cblxuLy8gdXNlIGxpa2UgdGhpczpcbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbi8vIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0vPlxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgYWxlcnRCZXRhVGl0bGU6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdQdWJsaWMgYmV0YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0QmV0YUJvZHk6IHtcbiAgICAgIGlkOiAnYWxlcnQuYWxlcnRCZXRhQm9keScsXG4gICAgICBkZWZhdWx0TWVzc2FnZTpcbiAgICAgICAgJ1RoaXMgd2Vic2l0ZSBtYXkgYmUgY29udGludW91c2x5IHVwZGF0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRUaXRsZToge1xuICAgICAgaWQ6ICdhbGVydC5hbGVydERhdGFMaW1pdGVkVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6XG4gICAgICAgICdMaW1pdGVkIGRhdGEgc291cmNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZvciBhbiBhbGVydCBpbmZvcm0gdXNlcnMgdGhhdCBkYXRhc2V0cyBtYXkgY2hhbmdlJyxcbiAgICB9LFxuICAgIGFsZXJ0RGF0YUxpbWl0ZWRCb2R5OiB7XG4gICAgICBpZDogJ2FsZXJ0LmFsZXJ0RGF0YUxpbWl0ZWRCb2R5JyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOlxuICAgICAgICAnRGF0YXNldHMgbWF5IGJlIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0JvZHkgZm9yIGFuIGFsZXJ0IGluZm9ybSB1c2VycyB0aGF0IGRhdGFzZXRzIG1heSBjaGFuZ2UnLFxuICAgIH0sXG4gIH0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmFsZXJ0V3JhcHBlcn0+XG4gICAgICB7c2hvd0JldGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cImluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFUaXRsZSl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC1zaXRlYWxlcnQtYm9keSd9PiDigJQge2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydEJldGFCb2R5KX08L3NwYW4+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgPC9BbGVydD5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TGltaXRlZERhdGFBbGVydCAmJiAoXG4gICAgICAgIDxBbGVydCBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0J30gdHlwZT1cIndhcm5pbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LXRpdGxlJ30+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hbGVydERhdGFMaW1pdGVkVGl0bGUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWxlcnREYXRhTGltaXRlZEJvZHkpfTwvc3Bhbj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0V3JhcHBlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6780\n")},2881: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 */ methodology; }\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: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/components/DatasetCard/datasetCard.module.scss\n// extracted by mini-css-extract-plugin\nvar datasetCard = "datasetCard-module--datasetCard--26okZ";\nvar datasetCardIndicator = "datasetCard-module--datasetCardIndicator--14lIn";\nvar datasetCardWhatIsIt = "datasetCard-module--datasetCardWhatIsIt--2J87w";\nvar datasetCardList = "datasetCard-module--datasetCardList--Ok3_o";\nvar datasetCardListItem = "datasetCard-module--datasetCardListItem--rMDxc";\nvar datasetCardDescription = "datasetCard-module--datasetCardDescription--2agib";\nvar datasetCardLabels = "datasetCard-module--datasetCardLabels--3jLC0";\n;// CONCATENATED MODULE: ./src/components/DatasetCard/index.tsx\nvar DatasetCard=function DatasetCard(_ref){var datasetCardProps=_ref.datasetCardProps;var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({whatIsIt:{id:\'datasetCard.whatIsIt\',defaultMessage:\'What is it?\',description:\'label associated with explaining the card\'},dataResolution:{id:\'datasetCard.dataResolution\',defaultMessage:\'Data resolution: \',description:\'label associated with explaining the card\'},dataSource:{id:\'datasetCard.dataSource\',defaultMessage:\'Data source: \',description:\'label associated with explaining the card\'},dataDateRange:{id:\'datasetCard.dataDateRange\',defaultMessage:\'Data date range: \',description:\'label associated with explaining the card\'}});return/*#__PURE__*/react.createElement("div",{className:datasetCard},/*#__PURE__*/react.createElement("h3",{className:datasetCardIndicator},datasetCardProps.indicator),/*#__PURE__*/react.createElement("div",{className:datasetCardWhatIsIt},intl.formatMessage(messages.whatIsIt)),/*#__PURE__*/react.createElement("div",{className:datasetCardDescription},datasetCardProps.description),/*#__PURE__*/react.createElement("ul",{className:datasetCardList},/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(messages.dataResolution)),datasetCardProps.dataResolution),/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(messages.dataSource)),/*#__PURE__*/react.createElement("a",{href:datasetCardProps.dataSourceURL,target:\'_blank\',rel:"noreferrer"},datasetCardProps.dataSourceLabel)),/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(messages.dataDateRange)),datasetCardProps.dataDateRange)));};/* harmony default export */ var components_DatasetCard = (DatasetCard);\n;// CONCATENATED MODULE: ./src/components/DatasetContainer/dsContainer.module.scss\n// extracted by mini-css-extract-plugin\nvar datasetContainer = "dsContainer-module--datasetContainer--2_KuU";\nvar datasetContainerHeader = "dsContainer-module--datasetContainerHeader--2HV3A";\nvar datasetContainerSubTitle = "dsContainer-module--datasetContainerSubTitle--3fi8f";\nvar datasetCardsContainer = "dsContainer-module--datasetCardsContainer--129oj";\nvar j40AlertContainer = "dsContainer-module--j40AlertContainer--tiBoq";\n;// CONCATENATED MODULE: ./src/components/DatasetContainer/index.tsx\nvar cards=[{indicator:\'Poverty\',description:"Percent of a block group\'s population in households where the household \\n income is less than or equal to twice the federal \\"poverty level\\"",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Education (less than high school)\',description:"Percent of people age 25 or older in a block group whose education is short of a high school diploma",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Linguistic isolation\',description:"Percent of people in a block group living in linguistically \\n isolated households \\u2014 a linguistically isolated household is a household in \\n which all members aged 14 years and over speak a non-English language and also speak \\n English less than \\"very well\\" (i.e., have difficulty with English)",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Unemployment rate\',description:"Unemployment rate (people who are unemployed divided by the total population of \\n people in the labor force over 16 years old)",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'Housing burden\',description:"Percent of households in a census tract that are both low income (making less\\n than 80% of the HUD Area Median Family Income) and severely burdened by housing costs \\n (paying greater than 30% of their income to housing costs)",dataResolution:"Census block group",dataSourceLabel:"U.S. Census Bureau",dataSourceURL:"https://www.census.gov/",dataDateRange:"5-year estimates, 2015-2019"}];var DatasetContainer=function DatasetContainer(){var intl=(0,gatsby_plugin_intl.useIntl)();var messages=(0,react_intl_lib/* defineMessages */.vU)({cumulativeScore:{id:\'datasetContainer.header.cumulativeScore\',defaultMessage:\'Datasets used in cumulative score\',description:\'section label of which datasets are used in cumulative score\'},subTitle:{id:\'datasetContainer.subTitle\',defaultMessage:\'The datasets come from a variety of sources and \'+\'were selected after considering relevance, availability, recency and quality.\',description:\'description of the dataset section\'}});return/*#__PURE__*/react.createElement("div",{className:datasetContainer+" desktop:grid-col"},/*#__PURE__*/react.createElement("div",{className:\'grid-container-desktop-lg\'},/*#__PURE__*/react.createElement("h1",{className:datasetContainerHeader},intl.formatMessage(messages.cumulativeScore)),/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:false,showLimitedDataAlert:true}),/*#__PURE__*/react.createElement("p",{className:datasetContainerSubTitle},intl.formatMessage(messages.subTitle)),/*#__PURE__*/react.createElement("div",{className:datasetCardsContainer},cards.map(function(card){return/*#__PURE__*/react.createElement(components_DatasetCard,{key:card.indicator,datasetCardProps:card});}))));};/* harmony default export */ var components_DatasetContainer = (DatasetContainer);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 4 modules\nvar layout = __webpack_require__(828);\n;// CONCATENATED MODULE: ./src/components/scoreStepsList.tsx\nvar ScoreStepsList=function ScoreStepsList(){return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement("div",{className:\'j40-process-list-wrapper\'},/*#__PURE__*/react.createElement("ul",null,/*#__PURE__*/react.createElement("li",null,/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h3",{className:\'j40-item-list-title\'},"Gather datasets"),/*#__PURE__*/react.createElement("h4",{className:\'j40-item-list-subtitle\'},"Data inputs"),/*#__PURE__*/react.createElement("p",null,"The cumulative index score includes the following equally weighted inputs."),/*#__PURE__*/react.createElement("ul",{className:\'j40-process-nested-list\'},/*#__PURE__*/react.createElement("li",null,"Poverty"),/*#__PURE__*/react.createElement("li",null,"Less than high school education"),/*#__PURE__*/react.createElement("li",null,"Linguistic isolation"),/*#__PURE__*/react.createElement("li",null,"Unemployment rate"),/*#__PURE__*/react.createElement("li",null,"Housing burden")),/*#__PURE__*/react.createElement("h4",{className:\'j40-item-list-subtitle\'},"Combining data from different geographic units"),/*#__PURE__*/react.createElement("p",null,"Some data is not available at the census block group level and is instead only available for larger units such as census tracts or counties. In these cases, all census block groups will get an even contribution from the larger unit. For example, if a census tract scores 90th percentile on an indicator, then all census block groups within that tract will receive a value of 90th percentile."),/*#__PURE__*/react.createElement("h4",{className:\'j40-item-list-subtitle\'},"Normalizing data"),/*#__PURE__*/react.createElement("p",null,"The range of the data that makes up the score varies, so the data must be normalized so that each data indicator can be more equally weighted. Min-max normalization is utilized, where the minimum value in the range of values for each dataset is set at 0, the maximum value is set at 1, and every other value is transformed into a decimal between 0 and 1. For example, if the minimum value for unemployment was 10 and the maximum value was 30, a value of 20 would be transformed to 0.5 since it is halfway between 10 and 30."))),/*#__PURE__*/react.createElement("li",null,/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h3",null,"Calculate cumulative index score"),/*#__PURE__*/react.createElement("p",null,"To combine all variables into a single cumulative index score, we average the normalized values across indicators."),/*#__PURE__*/react.createElement(lib.GridContainer,{className:\'\'},/*#__PURE__*/react.createElement(lib.Grid,{row:true,className:\'j40-math-division-container\'},/*#__PURE__*/react.createElement(lib.Grid,{col:true,className:\'j40-math-eq-left-side grid-col-fill\'},/*#__PURE__*/react.createElement("div",{className:\'j40-math-eq-numerator\'},"Dataset 1 + Dataset 2 + ... + Dataset N"),/*#__PURE__*/react.createElement("div",{className:\'j40-math-eq-denominator\'},"# of datasets")),/*#__PURE__*/react.createElement(lib.Grid,{col:true,className:\'j40-math-eq-middle grid-col-auto\'},"="),/*#__PURE__*/react.createElement(lib.Grid,{col:true,className:\'j40-math-eq-right-side grid-col-fill\'},"Cumulative index score"))))),/*#__PURE__*/react.createElement("li",null,/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h3",{className:\'j40-item-list-title\'},"Assign priority"),/*#__PURE__*/react.createElement("p",null,"Census block groups are sorted by their cumulative index score from highest to lowest. Census block groups that are in the top 25 percentile (i.e. have a cumulative index score in the 75 - 100th percentile) will be considered the prioritized communities."))))));};/* harmony default export */ var scoreStepsList = (ScoreStepsList);\n;// CONCATENATED MODULE: ./src/pages/methodology.tsx\n// markup\nvar IndexPage=function IndexPage(_ref){var location=_ref.location;return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{className:\'j40-main-content\'},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("h1",null,"Methodology"),/*#__PURE__*/react.createElement("p",null,"The Just Progress tool combines demographic, environmental, and socio-economic data to generate a cumulative index score, referred to as the Just Progress Index. The tool currently utilizes national, publically-available data from the United States Census Bureau\\u2019s American Community Survey (ACS) and the EPA\\u2019s EJScreen tool."),/*#__PURE__*/react.createElement("p",null,"The various inputs into the Just Progress Index are averaged into 2 categories: Pollution Burden and Demographics."),/*#__PURE__*/react.createElement("p",null,"Pollution Burden: health risks arising from proximity and potential exposures to pollution and other adverse environmental conditions"),/*#__PURE__*/react.createElement("p",null,"Demographics: sensitive populations and socioeconomic factors that make a community more vulnerable"),/*#__PURE__*/react.createElement("p",null,/*#__PURE__*/react.createElement("b",null,"Pollution Burden average x Demographics average = Just Progress Index")))))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement(components_DatasetContainer,null)))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement(scoreStepsList,null)))));};/* harmony default export */ var methodology = (IndexPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDYXJkL2RhdGFzZXRDYXJkLm1vZHVsZS5zY3NzPzFkYjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9EYXRhc2V0Q2FyZC9pbmRleC50c3g/NTBlYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXIvZHNDb250YWluZXIubW9kdWxlLnNjc3M/YzMzOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXIvaW5kZXgudHN4PzBjN2QiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9zY29yZVN0ZXBzTGlzdC50c3g/ODQ1NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9tZXRob2RvbG9neS50c3g/OTQ3MCJdLCJuYW1lcyI6WyJEYXRhc2V0Q2FyZCIsImRhdGFzZXRDYXJkUHJvcHMiLCJpbnRsIiwidXNlSW50bCIsIm1lc3NhZ2VzIiwiZGVmaW5lTWVzc2FnZXMiLCJ3aGF0SXNJdCIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsImRhdGFSZXNvbHV0aW9uIiwiZGF0YVNvdXJjZSIsImRhdGFEYXRlUmFuZ2UiLCJzdHlsZXMiLCJpbmRpY2F0b3IiLCJmb3JtYXRNZXNzYWdlIiwiZGF0YVNvdXJjZVVSTCIsImRhdGFTb3VyY2VMYWJlbCIsImNhcmRzIiwiRGF0YXNldENvbnRhaW5lciIsImN1bXVsYXRpdmVTY29yZSIsInN1YlRpdGxlIiwibWFwIiwiY2FyZCIsIlNjb3JlU3RlcHNMaXN0IiwiSW5kZXhQYWdlIiwibG9jYXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RSwyQ0FDRSxnREFDRSwwQkFBSSxTQUFTLENBQUUscUJBQWYsb0JBREYsY0FFRSw4UkFGRixDQURGLENBM0VGLENBREYsQ0FERixDQURGLENBOEZELENBL0ZELENBaUdBLG1EQUFlQSxjQUFmLEU7O0FDdkZBO0FBQ0EsR0FBTUMsVUFBUyxDQUFHLFFBQVpBLFVBQVksTUFBaUMsSUFBL0JDLFNBQStCLE1BQS9CQSxRQUErQixDQUNqRCxtQkFDRSxvQkFBQyxxQkFBRCxFQUFRLFFBQVEsQ0FBRUEsUUFBbEIsZUFFRSxvQkFBQyxtQ0FBRCxtQkFDRSxvQkFBQywyQkFBRCxFQUFjLGFBQWEsQ0FBRSxJQUE3QixDQUFtQyxvQkFBb0IsQ0FBRSxLQUF6RCxFQURGLENBRkYsY0FNRSxvQkFBQyxtQ0FBRCxFQUFzQixTQUFTLENBQUUsa0JBQWpDLGVBQ0Usb0JBQUMsUUFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsZUFDRSxnREFDRSw0Q0FERixjQUVFLCtXQUZGLGNBVUUsa0pBVkYsY0FjRSxxS0FkRixjQW1CRSxtSUFuQkYsY0F1QkUsMENBQ0UscUdBREYsQ0F2QkYsQ0FERixDQURGLENBREYsQ0FORixjQXdDRSxvQkFBQyxtQ0FBRCxFQUFzQixTQUFTLENBQUUsSUFBakMsZUFDRSxvQkFBQyxRQUFELEVBQU0sR0FBRyxLQUFULGVBQ0Usb0JBQUMsUUFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLG9CQUFDLDJCQUFELE1BREYsQ0FERixDQURGLENBeENGLGNBZ0RFLG9CQUFDLG1DQUFELG1CQUNFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsZUFBVSxvQkFBQyxRQUFELEVBQU0sR0FBRyxLQUFULGVBQ1Isb0JBQUMsY0FBRCxNQURRLENBQVYsQ0FERixDQWhERixDQURGLENBd0RELENBekRELENBMkRBLGdEQUFlRCxTQUFmIiwiZmlsZSI6IjI4ODEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgZGF0YXNldENhcmQgPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmQtLTI2b2taXCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkSW5kaWNhdG9yID0gXCJkYXRhc2V0Q2FyZC1tb2R1bGUtLWRhdGFzZXRDYXJkSW5kaWNhdG9yLS0xNGxJblwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZFdoYXRJc0l0ID0gXCJkYXRhc2V0Q2FyZC1tb2R1bGUtLWRhdGFzZXRDYXJkV2hhdElzSXQtLTJKODd3XCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkTGlzdCA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZExpc3QtLU9rM19vXCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkTGlzdEl0ZW0gPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmRMaXN0SXRlbS0tck1EeGNcIjtcbmV4cG9ydCB2YXIgZGF0YXNldENhcmREZXNjcmlwdGlvbiA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZERlc2NyaXB0aW9uLS0yYWdpYlwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZExhYmVscyA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZExhYmVscy0tM2pMQzBcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9kYXRhc2V0Q2FyZC5tb2R1bGUuc2Nzcyc7XG5cbmludGVyZmFjZSBJRGF0YXNldENhcmRQcm9wcyB7XG4gIGRhdGFzZXRDYXJkUHJvcHM6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfVxufVxuXG5jb25zdCBEYXRhc2V0Q2FyZCA9ICh7ZGF0YXNldENhcmRQcm9wc306SURhdGFzZXRDYXJkUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gICAgd2hhdElzSXQ6IHtcbiAgICAgIGlkOiAnZGF0YXNldENhcmQud2hhdElzSXQnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdXaGF0IGlzIGl0PycsXG4gICAgICBkZXNjcmlwdGlvbjogJ2xhYmVsIGFzc29jaWF0ZWQgd2l0aCBleHBsYWluaW5nIHRoZSBjYXJkJyxcbiAgICB9LFxuICAgIGRhdGFSZXNvbHV0aW9uOiB7XG4gICAgICBpZDogJ2RhdGFzZXRDYXJkLmRhdGFSZXNvbHV0aW9uJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YSByZXNvbHV0aW9uOiAnLFxuICAgICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gICAgfSxcbiAgICBkYXRhU291cmNlOiB7XG4gICAgICBpZDogJ2RhdGFzZXRDYXJkLmRhdGFTb3VyY2UnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIHNvdXJjZTogJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnbGFiZWwgYXNzb2NpYXRlZCB3aXRoIGV4cGxhaW5pbmcgdGhlIGNhcmQnLFxuICAgIH0sXG4gICAgZGF0YURhdGVSYW5nZToge1xuICAgICAgaWQ6ICdkYXRhc2V0Q2FyZC5kYXRhRGF0ZVJhbmdlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YSBkYXRlIHJhbmdlOiAnLFxuICAgICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkfT5cbiAgICAgIDxoMyBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZEluZGljYXRvcn0+e2RhdGFzZXRDYXJkUHJvcHMuaW5kaWNhdG9yfTwvaDM+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkV2hhdElzSXR9PntpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMud2hhdElzSXQpfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZERlc2NyaXB0aW9ufT5cbiAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGVzY3JpcHRpb259XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHVsIGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkTGlzdH0+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRhdGFSZXNvbHV0aW9uKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGF0YVJlc29sdXRpb259XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRhdGFTb3VyY2UpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YSBocmVmPXtkYXRhc2V0Q2FyZFByb3BzLmRhdGFTb3VyY2VVUkx9IHRhcmdldD17J19ibGFuayd9IHJlbD1cIm5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgIHtkYXRhc2V0Q2FyZFByb3BzLmRhdGFTb3VyY2VMYWJlbH1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRhdGFEYXRlUmFuZ2UpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZGF0YXNldENhcmRQcm9wcy5kYXRhRGF0ZVJhbmdlfVxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFzZXRDYXJkO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGRhdGFzZXRDb250YWluZXIgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENvbnRhaW5lci0tMl9LdVVcIjtcbmV4cG9ydCB2YXIgZGF0YXNldENvbnRhaW5lckhlYWRlciA9IFwiZHNDb250YWluZXItbW9kdWxlLS1kYXRhc2V0Q29udGFpbmVySGVhZGVyLS0ySFYzQVwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q29udGFpbmVyU3ViVGl0bGUgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENvbnRhaW5lclN1YlRpdGxlLS0zZmk4ZlwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZHNDb250YWluZXIgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENhcmRzQ29udGFpbmVyLS0xMjlvalwiO1xuZXhwb3J0IHZhciBqNDBBbGVydENvbnRhaW5lciA9IFwiZHNDb250YWluZXItbW9kdWxlLS1qNDBBbGVydENvbnRhaW5lci0tdGlCb3FcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQgRGF0YXNldENhcmQgZnJvbSAnLi4vRGF0YXNldENhcmQnO1xuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vZHNDb250YWluZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9BbGVydFdyYXBwZXInO1xuXG5leHBvcnQgY29uc3QgY2FyZHMgPSBbXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdQb3ZlcnR5JyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgYSBibG9jayBncm91cCdzIHBvcHVsYXRpb24gaW4gaG91c2Vob2xkcyB3aGVyZSB0aGUgaG91c2Vob2xkIFxuICAgIGluY29tZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdHdpY2UgdGhlIGZlZGVyYWwgXCJwb3ZlcnR5IGxldmVsXCJgLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBVLlMuIENlbnN1cyBCdXJlYXVgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5jZW5zdXMuZ292L2AsXG4gICAgZGF0YURhdGVSYW5nZTogYDUteWVhciBlc3RpbWF0ZXMsIDIwMTUtMjAxOWAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdFZHVjYXRpb24gKGxlc3MgdGhhbiBoaWdoIHNjaG9vbCknLFxuICAgIGRlc2NyaXB0aW9uOiBgUGVyY2VudCBvZiBwZW9wbGUgYWdlIDI1IG9yIG9sZGVyIGluIGEgYmxvY2sgZ3JvdXAgd2hvc2UgZWR1Y2F0aW9uIGlzIHNob3J0IG9mIGEgaGlnaCBzY2hvb2wgZGlwbG9tYWAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYFUuUy4gQ2Vuc3VzIEJ1cmVhdWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgNS15ZWFyIGVzdGltYXRlcywgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0xpbmd1aXN0aWMgaXNvbGF0aW9uJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgcGVvcGxlIGluIGEgYmxvY2sgZ3JvdXAgbGl2aW5nIGluIGxpbmd1aXN0aWNhbGx5IFxuICAgIGlzb2xhdGVkIGhvdXNlaG9sZHMg4oCUIGEgbGluZ3Vpc3RpY2FsbHkgaXNvbGF0ZWQgaG91c2Vob2xkIGlzIGEgaG91c2Vob2xkIGluIFxuICAgIHdoaWNoIGFsbCBtZW1iZXJzIGFnZWQgMTQgeWVhcnMgYW5kIG92ZXIgc3BlYWsgYSBub24tRW5nbGlzaCBsYW5ndWFnZSBhbmQgYWxzbyBzcGVhayBcbiAgICBFbmdsaXNoIGxlc3MgdGhhbiBcInZlcnkgd2VsbFwiIChpLmUuLCBoYXZlIGRpZmZpY3VsdHkgd2l0aCBFbmdsaXNoKWAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYFUuUy4gQ2Vuc3VzIEJ1cmVhdWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgNS15ZWFyIGVzdGltYXRlcywgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ1VuZW1wbG95bWVudCByYXRlJyxcbiAgICBkZXNjcmlwdGlvbjogYFVuZW1wbG95bWVudCByYXRlIChwZW9wbGUgd2hvIGFyZSB1bmVtcGxveWVkIGRpdmlkZWQgYnkgdGhlIHRvdGFsIHBvcHVsYXRpb24gb2YgXG4gICAgICBwZW9wbGUgaW4gdGhlIGxhYm9yIGZvcmNlIG92ZXIgMTYgeWVhcnMgb2xkKWAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYFUuUy4gQ2Vuc3VzIEJ1cmVhdWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgNS15ZWFyIGVzdGltYXRlcywgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0hvdXNpbmcgYnVyZGVuJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgaG91c2Vob2xkcyBpbiBhIGNlbnN1cyB0cmFjdCB0aGF0IGFyZSBib3RoIGxvdyBpbmNvbWUgKG1ha2luZyBsZXNzXG4gICAgICAgdGhhbiA4MCUgb2YgdGhlIEhVRCBBcmVhIE1lZGlhbiBGYW1pbHkgSW5jb21lKSBhbmQgc2V2ZXJlbHkgYnVyZGVuZWQgYnkgaG91c2luZyBjb3N0cyBcbiAgICAgICAocGF5aW5nIGdyZWF0ZXIgdGhhbiAzMCUgb2YgdGhlaXIgaW5jb21lIHRvIGhvdXNpbmcgY29zdHMpYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgVS5TLiBDZW5zdXMgQnVyZWF1YCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9gLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGA1LXllYXIgZXN0aW1hdGVzLCAyMDE1LTIwMTlgLFxuICB9LFxuXG5dO1xuXG5jb25zdCBEYXRhc2V0Q29udGFpbmVyID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgICBjdW11bGF0aXZlU2NvcmU6IHtcbiAgICAgIGlkOiAnZGF0YXNldENvbnRhaW5lci5oZWFkZXIuY3VtdWxhdGl2ZVNjb3JlJyxcbiAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YXNldHMgdXNlZCBpbiBjdW11bGF0aXZlIHNjb3JlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnc2VjdGlvbiBsYWJlbCBvZiB3aGljaCBkYXRhc2V0cyBhcmUgdXNlZCBpbiBjdW11bGF0aXZlIHNjb3JlJyxcbiAgICB9LFxuICAgIHN1YlRpdGxlOiB7XG4gICAgICBpZDogJ2RhdGFzZXRDb250YWluZXIuc3ViVGl0bGUnLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgZGF0YXNldHMgY29tZSBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZCAnICtcbiAgICAgICAgJ3dlcmUgc2VsZWN0ZWQgYWZ0ZXIgY29uc2lkZXJpbmcgcmVsZXZhbmNlLCBhdmFpbGFiaWxpdHksIHJlY2VuY3kgYW5kIHF1YWxpdHkuJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnZGVzY3JpcHRpb24gb2YgdGhlIGRhdGFzZXQgc2VjdGlvbicsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YCR7c3R5bGVzLmRhdGFzZXRDb250YWluZXJ9IGRlc2t0b3A6Z3JpZC1jb2xgfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsnZ3JpZC1jb250YWluZXItZGVza3RvcC1sZyd9PlxuICAgICAgICA8aDEgY2xhc3NOYW1lPXtzdHlsZXMuZGF0YXNldENvbnRhaW5lckhlYWRlcn0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5jdW11bGF0aXZlU2NvcmUpfTwvaDE+XG4gICAgICAgIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17ZmFsc2V9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXt0cnVlfS8+XG4gICAgICAgIDxwIGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDb250YWluZXJTdWJUaXRsZX0+e2ludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5zdWJUaXRsZSl9PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkc0NvbnRhaW5lcn0+XG4gICAgICAgICAge2NhcmRzLm1hcCgoY2FyZCkgPT4gPERhdGFzZXRDYXJkXG4gICAgICAgICAgICBrZXk9e2NhcmQuaW5kaWNhdG9yfVxuICAgICAgICAgICAgZGF0YXNldENhcmRQcm9wcz17Y2FyZH0vPil9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRhc2V0Q29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lciwgR3JpZH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5jb25zdCBTY29yZVN0ZXBzTGlzdCA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGRpdiBjbGFzc05hbWU9eydqNDAtcHJvY2Vzcy1saXN0LXdyYXBwZXInfT5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPXsnajQwLWl0ZW0tbGlzdC10aXRsZSd9PkdhdGhlciBkYXRhc2V0czwvaDM+XG4gICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9eydqNDAtaXRlbS1saXN0LXN1YnRpdGxlJ30+RGF0YSBpbnB1dHM8L2g0PlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUaGUgY3VtdWxhdGl2ZSBpbmRleCBzY29yZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGVxdWFsbHlcbiAgICAgICAgICAgICAgICB3ZWlnaHRlZCBpbnB1dHMuXG4gICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICA8dWwgY2xhc3NOYW1lPXsnajQwLXByb2Nlc3MtbmVzdGVkLWxpc3QnfT5cbiAgICAgICAgICAgICAgICA8bGk+UG92ZXJ0eTwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPkxlc3MgdGhhbiBoaWdoIHNjaG9vbCBlZHVjYXRpb248L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5MaW5ndWlzdGljIGlzb2xhdGlvbjwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPlVuZW1wbG95bWVudCByYXRlPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+SG91c2luZyBidXJkZW48L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuXG5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT17J2o0MC1pdGVtLWxpc3Qtc3VidGl0bGUnfT5cbiAgICAgICAgICAgICAgICBDb21iaW5pbmcgZGF0YSBmcm9tIGRpZmZlcmVudCBnZW9ncmFwaGljIHVuaXRzXG4gICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIFNvbWUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBjZW5zdXMgYmxvY2sgZ3JvdXAgbGV2ZWwgYW5kXG4gICAgICAgICAgICAgICAgaXMgaW5zdGVhZCBvbmx5IGF2YWlsYWJsZSBmb3IgbGFyZ2VyIHVuaXRzIHN1Y2ggYXMgY2Vuc3VzIHRyYWN0c1xuICAgICAgICAgICAgICAgIG9yIGNvdW50aWVzLiBJbiB0aGVzZSBjYXNlcywgYWxsIGNlbnN1cyBibG9jayBncm91cHMgd2lsbCBnZXQgYW5cbiAgICAgICAgICAgICAgICBldmVuIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBsYXJnZXIgdW5pdC4gRm9yIGV4YW1wbGUsIGlmIGEgY2Vuc3VzXG4gICAgICAgICAgICAgICAgdHJhY3Qgc2NvcmVzIDkwdGggcGVyY2VudGlsZSBvbiBhbiBpbmRpY2F0b3IsIHRoZW4gYWxsIGNlbnN1c1xuICAgICAgICAgICAgICAgIGJsb2NrIGdyb3VwcyB3aXRoaW4gdGhhdCB0cmFjdCB3aWxsIHJlY2VpdmUgYSB2YWx1ZSBvZiA5MHRoXG4gICAgICAgICAgICAgICAgcGVyY2VudGlsZS5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPXsnajQwLWl0ZW0tbGlzdC1zdWJ0aXRsZSd9Pk5vcm1hbGl6aW5nIGRhdGE8L2g0PlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUaGUgcmFuZ2Ugb2YgdGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgc2NvcmUgdmFyaWVzLCBzbyB0aGVcbiAgICAgICAgICAgICAgICBkYXRhIG11c3QgYmUgbm9ybWFsaXplZCBzbyB0aGF0IGVhY2ggZGF0YSBpbmRpY2F0b3IgY2FuIGJlIG1vcmVcbiAgICAgICAgICAgICAgICBlcXVhbGx5IHdlaWdodGVkLiBNaW4tbWF4IG5vcm1hbGl6YXRpb24gaXMgdXRpbGl6ZWQsIHdoZXJlIHRoZVxuICAgICAgICAgICAgICAgIG1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlIG9mIHZhbHVlcyBmb3IgZWFjaCBkYXRhc2V0IGlzIHNldCBhdFxuICAgICAgICAgICAgICAgIDAsIHRoZSBtYXhpbXVtIHZhbHVlIGlzIHNldCBhdCAxLCBhbmQgZXZlcnkgb3RoZXIgdmFsdWUgaXNcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBpbnRvIGEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDEuIEZvciBleGFtcGxlLCBpZiB0aGVcbiAgICAgICAgICAgICAgICBtaW5pbXVtIHZhbHVlIGZvciB1bmVtcGxveW1lbnQgd2FzIDEwIGFuZCB0aGUgbWF4aW11bSB2YWx1ZSB3YXNcbiAgICAgICAgICAgICAgICAzMCwgYSB2YWx1ZSBvZiAyMCB3b3VsZCBiZSB0cmFuc2Zvcm1lZCB0byAwLjUgc2luY2UgaXQgaXNcbiAgICAgICAgICAgICAgICBoYWxmd2F5IGJldHdlZW4gMTAgYW5kIDMwLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgPC9saT5cblxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDM+Q2FsY3VsYXRlIGN1bXVsYXRpdmUgaW5kZXggc2NvcmU8L2gzPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBUbyBjb21iaW5lIGFsbCB2YXJpYWJsZXMgaW50byBhIHNpbmdsZSBjdW11bGF0aXZlIGluZGV4IHNjb3JlLFxuICAgICAgICAgICAgICAgIHdlIGF2ZXJhZ2UgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzIGFjcm9zcyBpbmRpY2F0b3JzLlxuICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgPEdyaWRDb250YWluZXIgY2xhc3NOYW1lPXsnJ30+XG4gICAgICAgICAgICAgICAgPEdyaWQgcm93IGNsYXNzTmFtZT17J2o0MC1tYXRoLWRpdmlzaW9uLWNvbnRhaW5lcid9PlxuICAgICAgICAgICAgICAgICAgPEdyaWQgY29sIGNsYXNzTmFtZT17J2o0MC1tYXRoLWVxLWxlZnQtc2lkZSBncmlkLWNvbC1maWxsJ30+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXsnajQwLW1hdGgtZXEtbnVtZXJhdG9yJ30+XG4gICAgICAgICAgICAgICAgICAgICAgRGF0YXNldCAxICsgRGF0YXNldCAyICsgLi4uICsgRGF0YXNldCBOXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1tYXRoLWVxLWRlbm9taW5hdG9yJ30+XG4gICAgICAgICAgICAgICAgICAgICAgIyBvZiBkYXRhc2V0c1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICAgICAgICAgIDxHcmlkIGNvbCBjbGFzc05hbWU9eydqNDAtbWF0aC1lcS1taWRkbGUgZ3JpZC1jb2wtYXV0byd9PlxuICAgICAgICAgICAgICAgICAgICA9XG4gICAgICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgICAgICA8R3JpZCBjb2wgY2xhc3NOYW1lPXsnajQwLW1hdGgtZXEtcmlnaHQtc2lkZSBncmlkLWNvbC1maWxsJ30+XG4gICAgICAgICAgICAgICAgICAgIEN1bXVsYXRpdmUgaW5kZXggc2NvcmVcbiAgICAgICAgICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgIDwvR3JpZENvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICA8L2xpPlxuXG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9eydqNDAtaXRlbS1saXN0LXRpdGxlJ30+QXNzaWduIHByaW9yaXR5PC9oMz5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgQ2Vuc3VzIGJsb2NrIGdyb3VwcyBhcmUgc29ydGVkIGJ5IHRoZWlyIGN1bXVsYXRpdmUgaW5kZXggc2NvcmVcbiAgICAgICAgICAgICAgICBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0LiBDZW5zdXMgYmxvY2sgZ3JvdXBzIHRoYXQgYXJlIGluIHRoZSB0b3BcbiAgICAgICAgICAgICAgICAyNSBwZXJjZW50aWxlIChpLmUuIGhhdmUgYSBjdW11bGF0aXZlIGluZGV4IHNjb3JlIGluIHRoZSA3NSAtXG4gICAgICAgICAgICAgICAgMTAwdGggcGVyY2VudGlsZSkgd2lsbCBiZSBjb25zaWRlcmVkIHRoZSBwcmlvcml0aXplZFxuICAgICAgICAgICAgICAgIGNvbW11bml0aWVzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2NvcmVTdGVwc0xpc3Q7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0dyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9jb21wb25lbnRzL0FsZXJ0V3JhcHBlcic7XG5pbXBvcnQgRGF0YXNldENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXInO1xuaW1wb3J0IEo0ME1haW5HcmlkQ29udGFpbmVyIGZyb20gJy4uL2NvbXBvbmVudHMvSjQwTWFpbkdyaWRDb250YWluZXInO1xuaW1wb3J0IExheW91dCBmcm9tICcuLi9jb21wb25lbnRzL2xheW91dCc7XG5pbXBvcnQgU2NvcmVTdGVwc0xpc3QgZnJvbSAnLi4vY29tcG9uZW50cy9zY29yZVN0ZXBzTGlzdCc7XG5cbmludGVyZmFjZSBNZXRob2RQYWdlUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb247XG59XG5cbi8vIG1hcmt1cFxuY29uc3QgSW5kZXhQYWdlID0gKHtsb2NhdGlvbn06IE1ldGhvZFBhZ2VQcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxMYXlvdXQgbG9jYXRpb249e2xvY2F0aW9ufT5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e3RydWV9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXtmYWxzZX0vPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyIGNsYXNzTmFtZT17J2o0MC1tYWluLWNvbnRlbnQnfT5cbiAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgIDxHcmlkIGNvbD5cbiAgICAgICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICAgICA8aDE+TWV0aG9kb2xvZ3k8L2gxPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFRoZSBKdXN0IFByb2dyZXNzIHRvb2wgY29tYmluZXMgZGVtb2dyYXBoaWMsIGVudmlyb25tZW50YWwsIGFuZFxuICAgICAgICAgICAgc29jaW8tZWNvbm9taWMgZGF0YSB0byBnZW5lcmF0ZSBhIGN1bXVsYXRpdmUgaW5kZXggc2NvcmUsIHJlZmVycmVkXG4gICAgICAgICAgICB0byBhcyB0aGUgSnVzdCBQcm9ncmVzcyBJbmRleC4gVGhlIHRvb2wgY3VycmVudGx5IHV0aWxpemVzXG4gICAgICAgICAgICBuYXRpb25hbCxcbiAgICAgICAgICAgIHB1YmxpY2FsbHktYXZhaWxhYmxlIGRhdGEgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgQnVyZWF14oCZc1xuICAgICAgICAgICAgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAoQUNTKSBhbmQgdGhlIEVQQeKAmXMgRUpTY3JlZW4gdG9vbC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFRoZSB2YXJpb3VzIGlucHV0cyBpbnRvIHRoZSBKdXN0IFByb2dyZXNzIEluZGV4IGFyZSBhdmVyYWdlZCBpbnRvXG4gICAgICAgICAgICAyIGNhdGVnb3JpZXM6IFBvbGx1dGlvbiBCdXJkZW4gYW5kIERlbW9ncmFwaGljcy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFBvbGx1dGlvbiBCdXJkZW46IGhlYWx0aCByaXNrcyBhcmlzaW5nIGZyb20gcHJveGltaXR5IGFuZFxuICAgICAgICAgICAgcG90ZW50aWFsIGV4cG9zdXJlcyB0byBwb2xsdXRpb24gYW5kIG90aGVyIGFkdmVyc2UgZW52aXJvbm1lbnRhbFxuICAgICAgICAgICAgY29uZGl0aW9uc1xuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgRGVtb2dyYXBoaWNzOiBzZW5zaXRpdmUgcG9wdWxhdGlvbnMgYW5kIHNvY2lvZWNvbm9taWMgZmFjdG9ycyB0aGF0XG4gICAgICAgICAgICBtYWtlIGEgY29tbXVuaXR5IG1vcmUgdnVsbmVyYWJsZVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIDxiPlBvbGx1dGlvbiBCdXJkZW4gYXZlcmFnZSB4IERlbW9ncmFwaGljcyBhdmVyYWdlID0gSnVzdCBQcm9ncmVzc1xuICAgICAgICAgICAgICBJbmRleDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgIDwvR3JpZD48L0dyaWQ+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXIgZnVsbFdpZHRoPXt0cnVlfT5cbiAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgIDxHcmlkIGNvbD5cbiAgICAgICAgICAgIDxEYXRhc2V0Q29udGFpbmVyLz5cbiAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEdyaWQgcm93PjxHcmlkIGNvbD5cbiAgICAgICAgICA8U2NvcmVTdGVwc0xpc3QvPlxuICAgICAgICA8L0dyaWQ+PC9HcmlkPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICA8L0xheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4UGFnZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2881\n')}}]); \ No newline at end of file diff --git a/main/contact/index.html b/main/contact/index.html index c6551fe7..ad9f86c4 100644 --- a/main/contact/index.html +++ b/main/contact/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/en/404.html b/main/en/404.html index e9bec3ad..0eb75dbe 100644 --- a/main/en/404.html +++ b/main/en/404.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file +
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file diff --git a/main/en/404/index.html b/main/en/404/index.html index 2965cc6b..669795cb 100644 --- a/main/en/404/index.html +++ b/main/en/404/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file +
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file diff --git a/main/en/cejst/index.html b/main/en/cejst/index.html index 8a36274b..02b012ee 100644 --- a/main/en/cejst/index.html +++ b/main/en/cejst/index.html @@ -1,8 +1,8 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Explore the tool

Zoom into the map to see which communities the tool has currently identified as prioritized (the top 25% of communities) or on the threshold. Learn more about the formula and datasets that were used to prioritize these communities on the Data & methodology page.

COLOR KEY

Prioritized community
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Explore the tool

Zoom into the map to see which communities the tool has currently identified as prioritized (the top 25% of communities) or on the threshold. Learn more about the formula and datasets that were used to prioritize these communities on the Data & methodology page.

COLOR KEY

Prioritized community
+ " id="tooltip-365474" class="usa-tooltip__body usa-tooltip__body--left"> Communities that have cumulative index score of Xth percentile and above @@ -10,8 +10,8 @@ Communities with a cumulative index score between Y - X.99th percentile - " id="tooltip-452621" class="usa-tooltip__body usa-tooltip__body--left"> + " id="tooltip-603567" class="usa-tooltip__body usa-tooltip__body--left"> Communities with a cumulative index score between Y - X.99th percentile -

Limited data sourcesDatasets may be added, updated, or removed.

ZIP file will contain one .xlsx, one .csv and one .pdf (30 MB).

How You Can Help Improve the Tool

\ No newline at end of file +

Limited data sourcesDatasets may be added, updated, or removed.

ZIP file will contain one .xlsx, one .csv and one .pdf (30 MB).

How You Can Help Improve the Tool

\ No newline at end of file diff --git a/main/en/contact/index.html b/main/en/contact/index.html index 2b5d47da..f934daa3 100644 --- a/main/en/contact/index.html +++ b/main/en/contact/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Contact

Email us

For general feedback, email screeningtool.feedback@usds.gov

\ No newline at end of file +
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Contact

Email us

For general feedback, email screeningtool.feedback@usds.gov

\ No newline at end of file diff --git a/main/en/index.html b/main/en/index.html index 3750c444..d615563b 100644 --- a/main/en/index.html +++ b/main/en/index.html @@ -1,4 +1,4 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

About the screening tool

About the screening tool

+
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

About the screening tool

About the screening tool

On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to provide @@ -18,4 +18,4 @@

Read more about the Justice40 Initiative in President Biden’s Executive Order on Tackling the Climate Crisis at Home and Abroad. -

Federal program managers

Federal program managers

Download the screening tool’s draft list of prioritized communities and information on how to use it for your program in the future on the data and methodology page.
Community members

Community members

Find your community or communities that you may be familiar with and check their prioritization information on the map.
Send Feedback

Send Feedback

Have ideas about how to acknowledge the on-the-ground experiences of your community?
Join the open source community

Join the open source community

The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.
\ No newline at end of file +

Federal program managers

Federal program managers

Download the screening tool’s draft list of prioritized communities and information on how to use it for your program in the future on the data and methodology page.
Community members

Community members

Find your community or communities that you may be familiar with and check their prioritization information on the map.
Send Feedback

Send Feedback

Have ideas about how to acknowledge the on-the-ground experiences of your community?
Join the open source community

Join the open source community

The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.
\ No newline at end of file diff --git a/main/en/methodology/index.html b/main/en/methodology/index.html index 2052d138..2a6ded3c 100644 --- a/main/en/methodology/index.html +++ b/main/en/methodology/index.html @@ -1,8 +1,8 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Methodology

The Just Progress tool combines demographic, environmental, and socio-economic data to generate a cumulative index score, referred to as the Just Progress Index. The tool currently utilizes national, publically-available data from the United States Census Bureau’s American Community Survey (ACS) and the EPA’s EJScreen tool.

The various inputs into the Just Progress Index are averaged into 2 categories: Pollution Burden and Demographics.

Pollution Burden: health risks arising from proximity and potential exposures to pollution and other adverse environmental conditions

Demographics: sensitive populations and socioeconomic factors that make a community more vulnerable

Pollution Burden average x Demographics average = Just Progress Index

Datasets used in cumulative score

Limited data sourcesDatasets may be added, updated, or removed.

The datasets come from a variety of sources and were selected after considering relevance, availability, recency and quality.

Poverty

What is it?
Percent of a block group's population in households where the household +
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Methodology

The Just Progress tool combines demographic, environmental, and socio-economic data to generate a cumulative index score, referred to as the Just Progress Index. The tool currently utilizes national, publically-available data from the United States Census Bureau’s American Community Survey (ACS) and the EPA’s EJScreen tool.

The various inputs into the Just Progress Index are averaged into 2 categories: Pollution Burden and Demographics.

Pollution Burden: health risks arising from proximity and potential exposures to pollution and other adverse environmental conditions

Demographics: sensitive populations and socioeconomic factors that make a community more vulnerable

Pollution Burden average x Demographics average = Just Progress Index

Datasets used in cumulative score

Limited data sourcesDatasets may be added, updated, or removed.

The datasets come from a variety of sources and were selected after considering relevance, availability, recency and quality.

Poverty

What is it?
Percent of a block group's population in households where the household income is less than or equal to twice the federal "poverty level"
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Education (less than high school)

What is it?
Percent of people age 25 or older in a block group whose education is short of a high school diploma
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Linguistic isolation

What is it?
Percent of people in a block group living in linguistically isolated households — a linguistically isolated household is a household in which all members aged 14 years and over speak a non-English language and also speak English less than "very well" (i.e., have difficulty with English)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Unemployment rate

What is it?
Unemployment rate (people who are unemployed divided by the total population of people in the labor force over 16 years old)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Housing burden

What is it?
Percent of households in a census tract that are both low income (making less than 80% of the HUD Area Median Family Income) and severely burdened by housing costs - (paying greater than 30% of their income to housing costs)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019
  • Gather datasets

    Data inputs

    The cumulative index score includes the following equally weighted inputs.

    • Poverty
    • Less than high school education
    • Linguistic isolation
    • Unemployment rate
    • Housing burden

    Combining data from different geographic units

    Some data is not available at the census block group level and is instead only available for larger units such as census tracts or counties. In these cases, all census block groups will get an even contribution from the larger unit. For example, if a census tract scores 90th percentile on an indicator, then all census block groups within that tract will receive a value of 90th percentile.

    Normalizing data

    The range of the data that makes up the score varies, so the data must be normalized so that each data indicator can be more equally weighted. Min-max normalization is utilized, where the minimum value in the range of values for each dataset is set at 0, the maximum value is set at 1, and every other value is transformed into a decimal between 0 and 1. For example, if the minimum value for unemployment was 10 and the maximum value was 30, a value of 20 would be transformed to 0.5 since it is halfway between 10 and 30.

  • Calculate cumulative index score

    To combine all variables into a single cumulative index score, we average the normalized values across indicators.

    Dataset 1 + Dataset 2 + ... + Dataset N
    # of datasets
    =
    Cumulative index score
  • Assign priority

    Census block groups are sorted by their cumulative index score from highest to lowest. Census block groups that are in the top 25 percentile (i.e. have a cumulative index score in the 75 - 100th percentile) will be considered the prioritized communities.

\ No newline at end of file + (paying greater than 30% of their income to housing costs)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019
  • Gather datasets

    Data inputs

    The cumulative index score includes the following equally weighted inputs.

    • Poverty
    • Less than high school education
    • Linguistic isolation
    • Unemployment rate
    • Housing burden

    Combining data from different geographic units

    Some data is not available at the census block group level and is instead only available for larger units such as census tracts or counties. In these cases, all census block groups will get an even contribution from the larger unit. For example, if a census tract scores 90th percentile on an indicator, then all census block groups within that tract will receive a value of 90th percentile.

    Normalizing data

    The range of the data that makes up the score varies, so the data must be normalized so that each data indicator can be more equally weighted. Min-max normalization is utilized, where the minimum value in the range of values for each dataset is set at 0, the maximum value is set at 1, and every other value is transformed into a decimal between 0 and 1. For example, if the minimum value for unemployment was 10 and the maximum value was 30, a value of 20 would be transformed to 0.5 since it is halfway between 10 and 30.

  • Calculate cumulative index score

    To combine all variables into a single cumulative index score, we average the normalized values across indicators.

    Dataset 1 + Dataset 2 + ... + Dataset N
    # of datasets
    =
    Cumulative index score
  • Assign priority

    Census block groups are sorted by their cumulative index score from highest to lowest. Census block groups that are in the top 25 percentile (i.e. have a cumulative index score in the 75 - 100th percentile) will be considered the prioritized communities.

\ No newline at end of file diff --git a/main/en/timeline/index.html b/main/en/timeline/index.html index 84f2ece1..9757e83d 100644 --- a/main/en/timeline/index.html +++ b/main/en/timeline/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Timeline

Throughout the Process

renew icon

Continuously engage with stakeholders and community members to get feedback on the screening tool, scoring, and overall process.

Continuously source data that meets data principles as defined through community input.

Milestones

  1. Milestone 1

    Publish data principles on this site by June 2021.

  2. Milestone 2

    Make the first version of a screening tool available by July 2021.

  3. Milestone 3

    Create a public scorecard to ensure accountability of investments by February 2022.

\ No newline at end of file +
U.S. flag

An official website of the United States government

Timeline

Throughout the Process

renew icon

Continuously engage with stakeholders and community members to get feedback on the screening tool, scoring, and overall process.

Continuously source data that meets data principles as defined through community input.

Milestones

  1. Milestone 1

    Publish data principles on this site by June 2021.

  2. Milestone 2

    Make the first version of a screening tool available by July 2021.

  3. Milestone 3

    Create a public scorecard to ensure accountability of investments by February 2022.

\ No newline at end of file diff --git a/main/es/404.html b/main/es/404.html index c26093f7..3dab6970 100644 --- a/main/es/404.html +++ b/main/es/404.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file +
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file diff --git a/main/es/404/index.html b/main/es/404/index.html index 96764e2e..b1deba35 100644 --- a/main/es/404/index.html +++ b/main/es/404/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file +
U.S. flag

An official website of the United States government

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file diff --git a/main/es/cejst/index.html b/main/es/cejst/index.html index dc0e3622..8601ede8 100644 --- a/main/es/cejst/index.html +++ b/main/es/cejst/index.html @@ -1,8 +1,8 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Explore the tool

Zoom into the map to see which communities the tool has currently identified as prioritized (the top 25% of communities) or on the threshold. Learn more about the formula and datasets that were used to prioritize these communities on the Data & methodology page.

COLOR KEY

Prioritized community
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Explore the tool

Zoom into the map to see which communities the tool has currently identified as prioritized (the top 25% of communities) or on the threshold. Learn more about the formula and datasets that were used to prioritize these communities on the Data & methodology page.

COLOR KEY

Prioritized community
+ " id="tooltip-101059" class="usa-tooltip__body usa-tooltip__body--left"> Communities that have cumulative index score of Xth percentile and above @@ -10,8 +10,8 @@ Communities with a cumulative index score between Y - X.99th percentile - " id="tooltip-249232" class="usa-tooltip__body usa-tooltip__body--left"> + " id="tooltip-599027" class="usa-tooltip__body usa-tooltip__body--left"> Communities with a cumulative index score between Y - X.99th percentile -

Limited data sourcesDatasets may be added, updated, or removed.

ZIP file will contain one .xlsx, one .csv and one .pdf (30 MB).

How You Can Help Improve the Tool

\ No newline at end of file +

Limited data sourcesDatasets may be added, updated, or removed.

ZIP file will contain one .xlsx, one .csv and one .pdf (30 MB).

How You Can Help Improve the Tool

\ No newline at end of file diff --git a/main/es/contact/index.html b/main/es/contact/index.html index c53f2886..3b63be9a 100644 --- a/main/es/contact/index.html +++ b/main/es/contact/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Contact

Email us

For general feedback, email screeningtool.feedback@usds.gov

\ No newline at end of file +
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Contact

Email us

For general feedback, email screeningtool.feedback@usds.gov

\ No newline at end of file diff --git a/main/es/index.html b/main/es/index.html index 35a4dc0e..0c583d78 100644 --- a/main/es/index.html +++ b/main/es/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

About the screening tool

About the screening tool

En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.
About the Justice40 Initiative

About the Justice40 Initiative

Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.

Lea más sobre la Iniciativa Justice40 en Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero. del presidente Biden.

Federal program managers

Federal program managers

Download the screening tool’s draft list of prioritized communities and information on how to use it for your program in the future on the data and methodology page.
Community members

Community members

Find your community or communities that you may be familiar with and check their prioritization information on the map.
Send Feedback

Send Feedback

Have ideas about how to acknowledge the on-the-ground experiences of your community?
Join the open source community

Join the open source community

The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.
\ No newline at end of file +
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

About the screening tool

About the screening tool

En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.
About the Justice40 Initiative

About the Justice40 Initiative

Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.

Lea más sobre la Iniciativa Justice40 en Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero. del presidente Biden.

Federal program managers

Federal program managers

Download the screening tool’s draft list of prioritized communities and information on how to use it for your program in the future on the data and methodology page.
Community members

Community members

Find your community or communities that you may be familiar with and check their prioritization information on the map.
Send Feedback

Send Feedback

Have ideas about how to acknowledge the on-the-ground experiences of your community?
Join the open source community

Join the open source community

The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.
\ No newline at end of file diff --git a/main/es/methodology/index.html b/main/es/methodology/index.html index 6e137376..2a25762f 100644 --- a/main/es/methodology/index.html +++ b/main/es/methodology/index.html @@ -1,8 +1,8 @@ -
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Methodology

The Just Progress tool combines demographic, environmental, and socio-economic data to generate a cumulative index score, referred to as the Just Progress Index. The tool currently utilizes national, publically-available data from the United States Census Bureau’s American Community Survey (ACS) and the EPA’s EJScreen tool.

The various inputs into the Just Progress Index are averaged into 2 categories: Pollution Burden and Demographics.

Pollution Burden: health risks arising from proximity and potential exposures to pollution and other adverse environmental conditions

Demographics: sensitive populations and socioeconomic factors that make a community more vulnerable

Pollution Burden average x Demographics average = Just Progress Index

Datasets used in cumulative score

Limited data sourcesDatasets may be added, updated, or removed.

The datasets come from a variety of sources and were selected after considering relevance, availability, recency and quality.

Poverty

What is it?
Percent of a block group's population in households where the household +
U.S. flag

An official website of the United States government

Public betaThis website may be continuously updated

Methodology

The Just Progress tool combines demographic, environmental, and socio-economic data to generate a cumulative index score, referred to as the Just Progress Index. The tool currently utilizes national, publically-available data from the United States Census Bureau’s American Community Survey (ACS) and the EPA’s EJScreen tool.

The various inputs into the Just Progress Index are averaged into 2 categories: Pollution Burden and Demographics.

Pollution Burden: health risks arising from proximity and potential exposures to pollution and other adverse environmental conditions

Demographics: sensitive populations and socioeconomic factors that make a community more vulnerable

Pollution Burden average x Demographics average = Just Progress Index

Datasets used in cumulative score

Limited data sourcesDatasets may be added, updated, or removed.

The datasets come from a variety of sources and were selected after considering relevance, availability, recency and quality.

Poverty

What is it?
Percent of a block group's population in households where the household income is less than or equal to twice the federal "poverty level"
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Education (less than high school)

What is it?
Percent of people age 25 or older in a block group whose education is short of a high school diploma
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Linguistic isolation

What is it?
Percent of people in a block group living in linguistically isolated households — a linguistically isolated household is a household in which all members aged 14 years and over speak a non-English language and also speak English less than "very well" (i.e., have difficulty with English)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Unemployment rate

What is it?
Unemployment rate (people who are unemployed divided by the total population of people in the labor force over 16 years old)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019

Housing burden

What is it?
Percent of households in a census tract that are both low income (making less than 80% of the HUD Area Median Family Income) and severely burdened by housing costs - (paying greater than 30% of their income to housing costs)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019
  • Gather datasets

    Data inputs

    The cumulative index score includes the following equally weighted inputs.

    • Poverty
    • Less than high school education
    • Linguistic isolation
    • Unemployment rate
    • Housing burden

    Combining data from different geographic units

    Some data is not available at the census block group level and is instead only available for larger units such as census tracts or counties. In these cases, all census block groups will get an even contribution from the larger unit. For example, if a census tract scores 90th percentile on an indicator, then all census block groups within that tract will receive a value of 90th percentile.

    Normalizing data

    The range of the data that makes up the score varies, so the data must be normalized so that each data indicator can be more equally weighted. Min-max normalization is utilized, where the minimum value in the range of values for each dataset is set at 0, the maximum value is set at 1, and every other value is transformed into a decimal between 0 and 1. For example, if the minimum value for unemployment was 10 and the maximum value was 30, a value of 20 would be transformed to 0.5 since it is halfway between 10 and 30.

  • Calculate cumulative index score

    To combine all variables into a single cumulative index score, we average the normalized values across indicators.

    Dataset 1 + Dataset 2 + ... + Dataset N
    # of datasets
    =
    Cumulative index score
  • Assign priority

    Census block groups are sorted by their cumulative index score from highest to lowest. Census block groups that are in the top 25 percentile (i.e. have a cumulative index score in the 75 - 100th percentile) will be considered the prioritized communities.

\ No newline at end of file + (paying greater than 30% of their income to housing costs)
  • Data resolution: Census block group
  • Data source: U.S. Census Bureau
  • Data date range: 5-year estimates, 2015-2019
  • Gather datasets

    Data inputs

    The cumulative index score includes the following equally weighted inputs.

    • Poverty
    • Less than high school education
    • Linguistic isolation
    • Unemployment rate
    • Housing burden

    Combining data from different geographic units

    Some data is not available at the census block group level and is instead only available for larger units such as census tracts or counties. In these cases, all census block groups will get an even contribution from the larger unit. For example, if a census tract scores 90th percentile on an indicator, then all census block groups within that tract will receive a value of 90th percentile.

    Normalizing data

    The range of the data that makes up the score varies, so the data must be normalized so that each data indicator can be more equally weighted. Min-max normalization is utilized, where the minimum value in the range of values for each dataset is set at 0, the maximum value is set at 1, and every other value is transformed into a decimal between 0 and 1. For example, if the minimum value for unemployment was 10 and the maximum value was 30, a value of 20 would be transformed to 0.5 since it is halfway between 10 and 30.

  • Calculate cumulative index score

    To combine all variables into a single cumulative index score, we average the normalized values across indicators.

    Dataset 1 + Dataset 2 + ... + Dataset N
    # of datasets
    =
    Cumulative index score
  • Assign priority

    Census block groups are sorted by their cumulative index score from highest to lowest. Census block groups that are in the top 25 percentile (i.e. have a cumulative index score in the 75 - 100th percentile) will be considered the prioritized communities.

\ No newline at end of file diff --git a/main/es/timeline/index.html b/main/es/timeline/index.html index 38a55c7b..4654aa04 100644 --- a/main/es/timeline/index.html +++ b/main/es/timeline/index.html @@ -1 +1 @@ -
U.S. flag

An official website of the United States government

Timeline

Throughout the Process

renew icon

Continuously engage with stakeholders and community members to get feedback on the screening tool, scoring, and overall process.

Continuously source data that meets data principles as defined through community input.

Milestones

  1. Milestone 1

    Publish data principles on this site by June 2021.

  2. Milestone 2

    Make the first version of a screening tool available by July 2021.

  3. Milestone 3

    Create a public scorecard to ensure accountability of investments by February 2022.

\ No newline at end of file +
U.S. flag

An official website of the United States government

Timeline

Throughout the Process

renew icon

Continuously engage with stakeholders and community members to get feedback on the screening tool, scoring, and overall process.

Continuously source data that meets data principles as defined through community input.

Milestones

  1. Milestone 1

    Publish data principles on this site by June 2021.

  2. Milestone 2

    Make the first version of a screening tool available by July 2021.

  3. Milestone 3

    Create a public scorecard to ensure accountability of investments by February 2022.

\ No newline at end of file diff --git a/main/index.html b/main/index.html index b20c1868..6b9fdb08 100644 --- a/main/index.html +++ b/main/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/methodology/index.html b/main/methodology/index.html index bdf8eb2e..fae2087e 100644 --- a/main/methodology/index.html +++ b/main/methodology/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/page-data/app-data.json b/main/page-data/app-data.json index 2a2ffd77..2203a8ab 100644 --- a/main/page-data/app-data.json +++ b/main/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"057e2a90a33d7eca41ef"} +{"webpackCompilationHash":"bed00f33cb7206691186"} diff --git a/main/styles.f93d193c6bc3704419b0.css b/main/styles.fe2701014c0bbef914ce.css similarity index 92% rename from main/styles.f93d193c6bc3704419b0.css rename to main/styles.fe2701014c0bbef914ce.css index b6ef9e79..4bef94e0 100644 --- a/main/styles.f93d193c6bc3704419b0.css +++ b/main/styles.fe2701014c0bbef914ce.css @@ -1,2 +1,2 @@ -.bg-info-lighter{background-color:#e7f6f8}.bg-info-light{background-color:#99deea}.bg-info{background-color:#00bde3}.bg-info-dark{background-color:#009ec1}.bg-info-darker{background-color:#2e6276}.bg-error-lighter{background-color:#f4e3db}.bg-error-light{background-color:#f39268}.bg-error{background-color:#d54309}.bg-error-dark{background-color:#b50909}.bg-error-darker{background-color:#6f3331}.bg-warning-lighter{background-color:#faf3d1}.bg-warning-light{background-color:#fee685}.bg-warning{background-color:#ffbe2e}.bg-warning-dark{background-color:#e5a000}.bg-warning-darker{background-color:#936f38}.bg-success-lighter{background-color:#ecf3ec}.bg-success-light{background-color:#70e17b}.bg-success{background-color:#00a91c}.bg-success-dark{background-color:#4d8055}.bg-success-darker{background-color:#446443}.bg-disabled-light{background-color:#e6e6e6}.bg-disabled{background-color:#c9c9c9}.bg-disabled-dark{background-color:#adadad}.text-info-lighter{color:#e7f6f8}.text-info-light{color:#99deea}.text-info{color:#00bde3}.text-info-dark{color:#009ec1}.text-info-darker{color:#2e6276}.text-error-lighter{color:#f4e3db}.text-error-light{color:#f39268}.text-error{color:#d54309}.text-error-dark{color:#b50909}.text-error-darker{color:#6f3331}.text-warning-lighter{color:#faf3d1}.text-warning-light{color:#fee685}.text-warning{color:#ffbe2e}.text-warning-dark{color:#e5a000}.text-warning-darker{color:#936f38}.text-success-lighter{color:#ecf3ec}.text-success-light{color:#70e17b}.text-success{color:#00a91c}.text-success-dark{color:#4d8055}.text-success-darker{color:#446443}.text-disabled-light{color:#e6e6e6}.text-disabled{color:#c9c9c9}.text-disabled-dark{color:#adadad}.src-components-Alert-Alert-module__alertWithCTA--1frj5{align-items:center;display:flex;justify-content:space-between}.src-components-Table-Table-module__fullwidth--3-K3t{width:100%}.src-components-Table-Table-module__fixed--2Awcy{table-layout:fixed}.src-components-Modal-Modal-module__title--3YHHD h2{margin:0}.src-components-Modal-Modal-module__actions--2Ur9N{text-align:right}.src-components-Modal-Modal-module__content--3-4_Y+.src-components-Modal-Modal-module__actions--2Ur9N,.src-components-Modal-Modal-module__title--3YHHD+.src-components-Modal-Modal-module__content--3-4_Y{border-top:1px solid #dfe1e2}.src-components-Modal-Modal-module__modal--1uszs{background-color:#fff;border-radius:2px;box-shadow:0 .5rem 1rem 0 rgba(0,0,0,.1);max-width:630px;min-width:400px}.src-components-Modal-Modal-module__modal--1uszs .src-components-Modal-Modal-module__actions--2Ur9N,.src-components-Modal-Modal-module__modal--1uszs .src-components-Modal-Modal-module__content--3-4_Y,.src-components-Modal-Modal-module__modal--1uszs .src-components-Modal-Modal-module__title--3YHHD{padding:1rem}.src-components-Modal-Modal-module__overlay--WSsyO{background-color:rgba(0,0,0,.3);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:999}.src-components-Modal-Modal-module__modalContainer--2Zv9O{align-items:center;display:flex;height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100vw;z-index:1000}.mapboxgl-map{-webkit-tap-highlight-color:rgba(0,0,0,0);font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative}.mapboxgl-canvas{left:0;position:absolute;top:0}.mapboxgl-map:-webkit-full-screen{height:100%;width:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{pointer-events:none;position:absolute;z-index:2}.mapboxgl-ctrl-top-left{left:0;top:0}.mapboxgl-ctrl-top-right{right:0;top:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{bottom:0;right:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{float:left;margin:10px 0 0 10px}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{float:right;margin:10px 10px 0 0}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{float:left;margin:0 0 10px 10px}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{float:right;margin:0 10px 10px 0}.mapboxgl-ctrl-group{background:#fff;border-radius:4px}.mapboxgl-ctrl-group:not(:empty){-moz-box-shadow:0 0 2px rgba(0,0,0,.1);-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.mapboxgl-ctrl-group button{background-color:transparent;border:0;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:none;padding:0;width:29px}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}@media (-ms-high-contrast:active){.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}}.mapboxgl-ctrl button::-moz-focus-inner{border:0;padding:0}.mapboxgl-ctrl-attrib-button:focus,.mapboxgl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23999' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23aaa' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;-moz-animation:mapboxgl-spin 2s linear infinite;-o-animation:mapboxgl-spin 2s linear infinite;-ms-animation:mapboxgl-spin 2s linear infinite;animation:mapboxgl-spin 2s linear infinite}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23666' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@-moz-keyframes mapboxgl-spin{0%{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(1turn)}}@-o-keyframes mapboxgl-spin{0%{-o-transform:rotate(0deg)}to{-o-transform:rotate(1turn)}}@-ms-keyframes mapboxgl-spin{0%{-ms-transform:rotate(0deg)}to{-ms-transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='prefix__a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='prefix__b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='prefix__c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3' opacity='.3'%3E%3Ccircle cx='11.5' cy='11.5' r='9.25' mask='url(%23prefix__c)'/%3E%3Cuse mask='url(%23prefix__c)' xlink:href='%23prefix__b'/%3E%3C/g%3E%3Cg fill='%23fff' opacity='.9'%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;cursor:pointer;display:block;height:23px;margin:0 0 -4px -4px;overflow:hidden;width:88px}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}@media (-ms-high-contrast:active){a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='prefix__a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='prefix__b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='prefix__c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3'%3E%3Ccircle cx='11.5' cy='11.5' r='9.25' mask='url(%23prefix__c)'/%3E%3Cuse mask='url(%23prefix__c)' xlink:href='%23prefix__b'/%3E%3C/g%3E%3Cg fill='%23fff'%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='prefix__a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='prefix__b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='prefix__c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/mask%3E%3Cg fill='%23fff' stroke='%23fff' stroke-width='3'%3E%3Ccircle cx='11.5' cy='11.5' r='9.25' mask='url(%23prefix__c)'/%3E%3Cuse mask='url(%23prefix__c)' xlink:href='%23prefix__b'/%3E%3C/g%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/svg%3E")}}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{background-color:hsla(0,0%,100%,.5);margin:0;padding:0 5px}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{background-color:#fff;border-radius:12px;margin:10px;min-height:20px;padding:2px 24px 2px 0;position:relative}.mapboxgl-ctrl-attrib.mapboxgl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show{border-radius:12px;padding:2px 8px 2px 28px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib-button{background-color:hsla(0,0%,100%,.5);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E");border:0;border-radius:12px;box-sizing:border-box;cursor:pointer;display:none;height:24px;outline:none;position:absolute;right:0;top:0;width:24px}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,.mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button{left:0}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner,.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{right:0;top:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{left:0;top:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);border:2px solid #333;border-top:#333;box-sizing:border-box;color:#333;font-size:10px;padding:0 5px}.mapboxgl-popup{display:-webkit-flex;display:flex;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{border:10px solid transparent;height:0;width:0;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom-color:#fff;border-top:none}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom-color:#fff;border-left:none;border-top:none}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom-color:#fff;border-right:none;border-top:none}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left-color:#fff;border-right:none}.mapboxgl-popup-close-button{background-color:transparent;border:0;border-radius:0 3px 0 0;cursor:pointer;position:absolute;right:0;top:0}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto;position:relative}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{left:0;position:absolute;top:0;will-change:transform}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;border-radius:50%;height:15px;width:15px}.mapboxgl-user-location-dot:before{-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;-moz-animation:mapboxgl-user-location-dot-pulse 2s infinite;-ms-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite;content:"";position:absolute}.mapboxgl-user-location-dot:after{border:2px solid #fff;border-radius:50%;box-shadow:0 0 3px rgba(0,0,0,.35);box-sizing:border-box;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;-webkit-transform:scale(1)}70%{opacity:0;-webkit-transform:scale(3)}to{opacity:0;-webkit-transform:scale(1)}}@-ms-keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;-ms-transform:scale(1)}70%{opacity:0;-ms-transform:scale(3)}to{opacity:0;-ms-transform:scale(1)}}@keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;transform:scale(1)}70%{opacity:0;transform:scale(3)}to{opacity:0;transform:scale(1)}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);border-radius:100%;height:1px;width:1px}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{background:#fff;border:2px dotted #202020;height:0;left:0;opacity:.5;position:absolute;top:0;width:0} +.bg-info-lighter{background-color:#e7f6f8}.bg-info-light{background-color:#99deea}.bg-info{background-color:#00bde3}.bg-info-dark{background-color:#009ec1}.bg-info-darker{background-color:#2e6276}.bg-error-lighter{background-color:#f4e3db}.bg-error-light{background-color:#f39268}.bg-error{background-color:#d54309}.bg-error-dark{background-color:#b50909}.bg-error-darker{background-color:#6f3331}.bg-warning-lighter{background-color:#faf3d1}.bg-warning-light{background-color:#fee685}.bg-warning{background-color:#ffbe2e}.bg-warning-dark{background-color:#e5a000}.bg-warning-darker{background-color:#936f38}.bg-success-lighter{background-color:#ecf3ec}.bg-success-light{background-color:#70e17b}.bg-success{background-color:#00a91c}.bg-success-dark{background-color:#4d8055}.bg-success-darker{background-color:#446443}.bg-disabled-light{background-color:#e6e6e6}.bg-disabled{background-color:#c9c9c9}.bg-disabled-dark{background-color:#adadad}.text-info-lighter{color:#e7f6f8}.text-info-light{color:#99deea}.text-info{color:#00bde3}.text-info-dark{color:#009ec1}.text-info-darker{color:#2e6276}.text-error-lighter{color:#f4e3db}.text-error-light{color:#f39268}.text-error{color:#d54309}.text-error-dark{color:#b50909}.text-error-darker{color:#6f3331}.text-warning-lighter{color:#faf3d1}.text-warning-light{color:#fee685}.text-warning{color:#ffbe2e}.text-warning-dark{color:#e5a000}.text-warning-darker{color:#936f38}.text-success-lighter{color:#ecf3ec}.text-success-light{color:#70e17b}.text-success{color:#00a91c}.text-success-dark{color:#4d8055}.text-success-darker{color:#446443}.text-disabled-light{color:#e6e6e6}.text-disabled{color:#c9c9c9}.text-disabled-dark{color:#adadad}.src-components-Alert-Alert-module__alertWithCTA--1frj5{align-items:center;display:flex;justify-content:space-between}.src-components-Table-Table-module__fullwidth--3-K3t{width:100%}.src-components-Table-Table-module__fixed--2Awcy{table-layout:fixed}.mapboxgl-map{-webkit-tap-highlight-color:rgba(0,0,0,0);font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative}.mapboxgl-canvas{left:0;position:absolute;top:0}.mapboxgl-map:-webkit-full-screen{height:100%;width:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{pointer-events:none;position:absolute;z-index:2}.mapboxgl-ctrl-top-left{left:0;top:0}.mapboxgl-ctrl-top-right{right:0;top:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{bottom:0;right:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{float:left;margin:10px 0 0 10px}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{float:right;margin:10px 10px 0 0}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{float:left;margin:0 0 10px 10px}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{float:right;margin:0 10px 10px 0}.mapboxgl-ctrl-group{background:#fff;border-radius:4px}.mapboxgl-ctrl-group:not(:empty){-moz-box-shadow:0 0 2px rgba(0,0,0,.1);-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.mapboxgl-ctrl-group button{background-color:transparent;border:0;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:none;padding:0;width:29px}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}@media (-ms-high-contrast:active){.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}}.mapboxgl-ctrl button::-moz-focus-inner{border:0;padding:0}.mapboxgl-ctrl-attrib-button:focus,.mapboxgl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23999' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23aaa' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;-moz-animation:mapboxgl-spin 2s linear infinite;-o-animation:mapboxgl-spin 2s linear infinite;-ms-animation:mapboxgl-spin 2s linear infinite;animation:mapboxgl-spin 2s linear infinite}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23666' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@-moz-keyframes mapboxgl-spin{0%{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(1turn)}}@-o-keyframes mapboxgl-spin{0%{-o-transform:rotate(0deg)}to{-o-transform:rotate(1turn)}}@-ms-keyframes mapboxgl-spin{0%{-ms-transform:rotate(0deg)}to{-ms-transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='prefix__a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='prefix__b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='prefix__c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3' opacity='.3'%3E%3Ccircle cx='11.5' cy='11.5' r='9.25' mask='url(%23prefix__c)'/%3E%3Cuse mask='url(%23prefix__c)' xlink:href='%23prefix__b'/%3E%3C/g%3E%3Cg fill='%23fff' opacity='.9'%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;cursor:pointer;display:block;height:23px;margin:0 0 -4px -4px;overflow:hidden;width:88px}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}@media (-ms-high-contrast:active){a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='prefix__a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='prefix__b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='prefix__c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3'%3E%3Ccircle cx='11.5' cy='11.5' r='9.25' mask='url(%23prefix__c)'/%3E%3Cuse mask='url(%23prefix__c)' xlink:href='%23prefix__b'/%3E%3C/g%3E%3Cg fill='%23fff'%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='prefix__a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 0 1 3.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='prefix__b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 0 0-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 0 0 4.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 0 1-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 0 1 .3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 0 1-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='prefix__c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/mask%3E%3Cg fill='%23fff' stroke='%23fff' stroke-width='3'%3E%3Ccircle cx='11.5' cy='11.5' r='9.25' mask='url(%23prefix__c)'/%3E%3Cuse mask='url(%23prefix__c)' xlink:href='%23prefix__b'/%3E%3C/g%3E%3Cuse xlink:href='%23prefix__a'/%3E%3Cuse xlink:href='%23prefix__b'/%3E%3C/svg%3E")}}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{background-color:hsla(0,0%,100%,.5);margin:0;padding:0 5px}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{background-color:#fff;border-radius:12px;margin:10px;min-height:20px;padding:2px 24px 2px 0;position:relative}.mapboxgl-ctrl-attrib.mapboxgl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show{border-radius:12px;padding:2px 8px 2px 28px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib-button{background-color:hsla(0,0%,100%,.5);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E");border:0;border-radius:12px;box-sizing:border-box;cursor:pointer;display:none;height:24px;outline:none;position:absolute;right:0;top:0;width:24px}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,.mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button{left:0}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner,.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{right:0;top:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{left:0;top:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);border:2px solid #333;border-top:#333;box-sizing:border-box;color:#333;font-size:10px;padding:0 5px}.mapboxgl-popup{display:-webkit-flex;display:flex;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{border:10px solid transparent;height:0;width:0;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom-color:#fff;border-top:none}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom-color:#fff;border-left:none;border-top:none}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom-color:#fff;border-right:none;border-top:none}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left-color:#fff;border-right:none}.mapboxgl-popup-close-button{background-color:transparent;border:0;border-radius:0 3px 0 0;cursor:pointer;position:absolute;right:0;top:0}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto;position:relative}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{left:0;position:absolute;top:0;will-change:transform}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;border-radius:50%;height:15px;width:15px}.mapboxgl-user-location-dot:before{-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;-moz-animation:mapboxgl-user-location-dot-pulse 2s infinite;-ms-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite;content:"";position:absolute}.mapboxgl-user-location-dot:after{border:2px solid #fff;border-radius:50%;box-shadow:0 0 3px rgba(0,0,0,.35);box-sizing:border-box;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;-webkit-transform:scale(1)}70%{opacity:0;-webkit-transform:scale(3)}to{opacity:0;-webkit-transform:scale(1)}}@-ms-keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;-ms-transform:scale(1)}70%{opacity:0;-ms-transform:scale(3)}to{opacity:0;-ms-transform:scale(1)}}@keyframes mapboxgl-user-location-dot-pulse{0%{opacity:1;transform:scale(1)}70%{opacity:0;transform:scale(3)}to{opacity:0;transform:scale(1)}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);border-radius:100%;height:1px;width:1px}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{background:#fff;border:2px dotted #202020;height:0;left:0;opacity:.5;position:absolute;top:0;width:0} /*! uswds @version */.usa-collection,.usa-list,.usa-prose .usa-collection,.usa-prose>ol,.usa-prose>ul{line-height:1.5;margin-bottom:1em;margin-top:1em;padding-left:3ch}.usa-collection:last-child,.usa-list:last-child,.usa-prose>ol:last-child,.usa-prose>ul:last-child{margin-bottom:0}.usa-collection ol,.usa-collection ul,.usa-list ol,.usa-list ul,.usa-prose .usa-collection ol,.usa-prose .usa-collection ul,.usa-prose>ol ol,.usa-prose>ol ul,.usa-prose>ul ol,.usa-prose>ul ul{margin-top:.25em}.usa-collection__item,.usa-list li,.usa-prose .usa-collection__item,.usa-prose>ol li,.usa-prose>ul li{margin-bottom:.25em;max-width:68ex}.usa-collection__item:last-child,.usa-list li:last-child,.usa-prose>ol li:last-child,.usa-prose>ul li:last-child{margin-bottom:0}.usa-prose>table,.usa-table{border-collapse:collapse;border-spacing:0;color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;margin:1.25rem 0;text-align:left}.usa-prose>table thead th,.usa-table thead th{font-weight:700}.usa-prose>table thead td,.usa-prose>table thead th,.usa-table thead td,.usa-table thead th{background-color:#dfe1e2;color:#1b1b1b}.usa-prose>table td,.usa-prose>table th,.usa-table td,.usa-table th{background-color:#fff;border:1px solid #1b1b1b;font-weight:400;padding:.5rem 1rem;text-align:inherit}.usa-prose>table caption,.usa-table caption{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1rem;font-weight:700;margin-bottom:.75rem;text-align:left}.usa-prose>.usa-table--borderless thead th,.usa-table--borderless thead th{background-color:transparent;border-top:0}.usa-prose>.usa-table--borderless td,.usa-prose>.usa-table--borderless th,.usa-table--borderless td,.usa-table--borderless th{border-left:0;border-right:0}.usa-prose>.usa-table--compact td,.usa-prose>.usa-table--compact th,.usa-table--compact td,.usa-table--compact th{padding:.25rem .75rem}.usa-table--striped tbody tr:nth-child(odd) td,.usa-table--striped tbody tr:nth-child(odd) th{background-color:#f0f0f0;color:#1b1b1b}.usa-prose>.width-mobile .usa-table--stacked thead,.width-mobile .usa-table--stacked thead{display:none}.usa-prose>.width-mobile .usa-table--stacked td,.usa-prose>.width-mobile .usa-table--stacked th,.width-mobile .usa-table--stacked td,.width-mobile .usa-table--stacked th{border-bottom-width:0;display:block;width:100%}.usa-prose>.width-mobile .usa-table--stacked tr,.width-mobile .usa-table--stacked tr{border-bottom:.25rem solid #1b1b1b;border-top-width:0;display:block;width:100%}.width-mobile .usa-table--stacked tr td:first-child,.width-mobile .usa-table--stacked tr th:first-child{border-top-width:0}.width-mobile .usa-table--stacked tr:nth-child(odd) td,.width-mobile .usa-table--stacked tr:nth-child(odd) th{background-color:inherit}.width-mobile .usa-table--stacked tr:first-child td:first-child,.width-mobile .usa-table--stacked tr:first-child th:first-child{border-top:.25rem solid #1b1b1b}.width-mobile .usa-table--stacked td[data-label],.width-mobile .usa-table--stacked th[data-label]{padding-bottom:.75rem}.width-mobile .usa-table--stacked td[data-label]:before,.width-mobile .usa-table--stacked th[data-label]:before{content:attr(data-label);display:block;font-weight:700;margin:-.5rem -1rem 0;padding:.75rem 1rem .25rem}.usa-prose>.width-mobile .usa-table--stacked-header thead,.width-mobile .usa-table--stacked-header thead{display:none}.usa-prose>.width-mobile .usa-table--stacked-header td,.usa-prose>.width-mobile .usa-table--stacked-header th,.width-mobile .usa-table--stacked-header td,.width-mobile .usa-table--stacked-header th{border-bottom-width:0;display:block;width:100%}.usa-prose>.width-mobile .usa-table--stacked-header tr,.width-mobile .usa-table--stacked-header tr{border-bottom:.25rem solid #1b1b1b;border-top-width:0;display:block;width:100%}.width-mobile .usa-table--stacked-header tr td:first-child,.width-mobile .usa-table--stacked-header tr th:first-child{border-top-width:0}.width-mobile .usa-table--stacked-header tr:nth-child(odd) td,.width-mobile .usa-table--stacked-header tr:nth-child(odd) th{background-color:inherit}.width-mobile .usa-table--stacked-header tr:first-child td:first-child,.width-mobile .usa-table--stacked-header tr:first-child th:first-child{border-top:.25rem solid #1b1b1b}.width-mobile .usa-table--stacked-header td[data-label],.width-mobile .usa-table--stacked-header th[data-label]{padding-bottom:.75rem}.width-mobile .usa-table--stacked-header td[data-label]:before,.width-mobile .usa-table--stacked-header th[data-label]:before{content:attr(data-label);display:block;font-weight:700;margin:-.5rem -1rem 0;padding:.75rem 1rem .25rem}.width-mobile .usa-table--stacked-header tr td:first-child,.width-mobile .usa-table--stacked-header tr th:first-child{background-color:#dfe1e2;color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;font-weight:700;line-height:1.1;padding:.75rem 1rem}.width-mobile .usa-table--stacked-header tr td:first-child:before,.width-mobile .usa-table--stacked-header tr th:first-child:before{display:none}.usa-prose>.usa-table-container--scrollable,.usa-table-container--scrollable{margin:1.25rem 0;overflow-y:hidden}.usa-table-container--scrollable .usa-table{margin:0}.usa-prose>.usa-table-container--scrollable td,.usa-prose>.usa-table-container--scrollable th,.usa-table-container--scrollable td,.usa-table-container--scrollable th{white-space:nowrap}/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@font-face{font-display:fallback;font-family:Roboto Mono Web;font-style:normal;font-weight:300;src:url(/justice40-tool/main/static/roboto-mono-v5-latin-300-316b1352cc4ab2054de67541c69539d9.woff2) format("woff2"),url(/justice40-tool/main/static/roboto-mono-v5-latin-300-92dd8f0ccfaebc33f817da19369100d8.woff) format("woff"),url(/justice40-tool/main/static/roboto-mono-v5-latin-300-ce3838471d62f8364e125cc74923e05b.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Roboto Mono Web;font-style:normal;font-weight:400;src:url(/justice40-tool/main/static/roboto-mono-v5-latin-regular-f1dc10a756c2c544588b7408095ffed7.woff2) format("woff2"),url(/justice40-tool/main/static/roboto-mono-v5-latin-regular-a3246d29b40a8b0da142caea1bc84974.woff) format("woff"),url(/justice40-tool/main/static/roboto-mono-v5-latin-regular-215adb34128fcb20668b963ec7926ef2.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Roboto Mono Web;font-style:normal;font-weight:700;src:url(/justice40-tool/main/static/roboto-mono-v5-latin-700-936869ba46988c2387481468c25686bc.woff2) format("woff2"),url(/justice40-tool/main/static/roboto-mono-v5-latin-700-d85b43c39f4620dfa5b47b16e842c8a9.woff) format("woff"),url(/justice40-tool/main/static/roboto-mono-v5-latin-700-e57caf7ea634a258a9b2e06137755ec6.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Roboto Mono Web;font-style:italic;font-weight:300;src:url(/justice40-tool/main/static/roboto-mono-v5-latin-300italic-09cc62a8fbd32c8b28124eecc228bc36.woff2) format("woff2"),url(/justice40-tool/main/static/roboto-mono-v5-latin-300italic-1b8d46dae0a077f999ae901c213dcbd2.woff) format("woff"),url(/justice40-tool/main/static/roboto-mono-v5-latin-300italic-93511dbad22ceb584f036ab660a563ba.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Roboto Mono Web;font-style:italic;font-weight:400;src:url(/justice40-tool/main/static/roboto-mono-v5-latin-italic-087069a9f454e2581ed6a7a84b142327.woff2) format("woff2"),url(/justice40-tool/main/static/roboto-mono-v5-latin-italic-756750acefdb77704c08c235510f6e4c.woff) format("woff"),url(/justice40-tool/main/static/roboto-mono-v5-latin-italic-4863add4d566a55b6a971780f0328e05.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Roboto Mono Web;font-style:italic;font-weight:700;src:url(/justice40-tool/main/static/roboto-mono-v5-latin-700italic-5a8f743549cc6cef9a001f0c21d55e5b.woff2) format("woff2"),url(/justice40-tool/main/static/roboto-mono-v5-latin-700italic-0a6791447401e0ebd70d98b0e4ecc5ff.woff) format("woff"),url(/justice40-tool/main/static/roboto-mono-v5-latin-700italic-da78bf0b1b435f40ca198525361d3b84.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Source Sans Pro Web;font-style:normal;font-weight:300;src:url(/justice40-tool/main/static/sourcesanspro-light-webfont-e5f1a42e1c2b97e2587641dea75c548f.woff2) format("woff2"),url(/justice40-tool/main/static/sourcesanspro-light-webfont-70e7d719e258c9a7e68b19236a49bcc4.woff) format("woff"),url(/justice40-tool/main/static/sourcesanspro-light-webfont-d6f73cf7210d3b5c2fa95f00e38396a2.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Source Sans Pro Web;font-style:normal;font-weight:400;src:url(/justice40-tool/main/static/sourcesanspro-regular-webfont-e7bccfa631a0017f31da9e0c2fd2627b.woff2) format("woff2"),url(/justice40-tool/main/static/sourcesanspro-regular-webfont-c4e25ab10baa365dfc6620c04ea9202b.woff) format("woff"),url(/justice40-tool/main/static/sourcesanspro-regular-webfont-5acfe0d0f69444765ba489e2091c95cc.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Source Sans Pro Web;font-style:normal;font-weight:700;src:url(/justice40-tool/main/static/sourcesanspro-bold-webfont-4a1efbe82eaa84ff89ed34a0bd374991.woff2) format("woff2"),url(/justice40-tool/main/static/sourcesanspro-bold-webfont-e7e051e1bc64fa89931760a52d0c8bd3.woff) format("woff"),url(/justice40-tool/main/static/sourcesanspro-bold-webfont-9a76932911f04be25044af15855ffeb2.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Source Sans Pro Web;font-style:italic;font-weight:300;src:url(/justice40-tool/main/static/sourcesanspro-lightitalic-webfont-9c5bf2190b2471c2f22b96bb92249ecb.woff2) format("woff2"),url(/justice40-tool/main/static/sourcesanspro-lightitalic-webfont-455d120362f79aa219d465e39fc66e82.woff) format("woff"),url(/justice40-tool/main/static/sourcesanspro-lightitalic-webfont-43ea3d39e6aa59fb6f1b4f974dfdc76b.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Source Sans Pro Web;font-style:italic;font-weight:400;src:url(/justice40-tool/main/static/sourcesanspro-italic-webfont-c6c9fd228e87eefaf1d4e4d8f439760b.woff2) format("woff2"),url(/justice40-tool/main/static/sourcesanspro-italic-webfont-0aaeabbaba38453310786c387d4a052a.woff) format("woff"),url(/justice40-tool/main/static/sourcesanspro-italic-webfont-3efee318468995ac04affb6a907a6b03.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Source Sans Pro Web;font-style:italic;font-weight:700;src:url(/justice40-tool/main/static/sourcesanspro-bolditalic-webfont-ef69f0d737406260319a2c5ec73da3a8.woff2) format("woff2"),url(/justice40-tool/main/static/sourcesanspro-bolditalic-webfont-73021f1aabd43f50e16a6a0771c45689.woff) format("woff"),url(/justice40-tool/main/static/sourcesanspro-bolditalic-webfont-af3dd40e0ac8e2ca50ac3943d5d7014d.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Merriweather Web;font-style:normal;font-weight:300;src:url(/justice40-tool/main/static/Latin-Merriweather-Light-f347d9834a5feacbcefb85461ac77e70.woff2) format("woff2"),url(/justice40-tool/main/static/Latin-Merriweather-Light-7b2a6350fcb212efe521caae9cf0d29b.woff) format("woff"),url(/justice40-tool/main/static/Latin-Merriweather-Light-30dd683b4fcfe95b030b8c07c3482121.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Merriweather Web;font-style:normal;font-weight:400;src:url(/justice40-tool/main/static/Latin-Merriweather-Regular-a30c1b8fcb759e9fe728873f84044227.woff2) format("woff2"),url(/justice40-tool/main/static/Latin-Merriweather-Regular-add503b41601df15b97ed98d3ed46c95.woff) format("woff"),url(/justice40-tool/main/static/Latin-Merriweather-Regular-43dc3080728216519bf08e82557e1912.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Merriweather Web;font-style:normal;font-weight:700;src:url(/justice40-tool/main/static/Latin-Merriweather-Bold-9caa42f21e4ae090b755f99d14c3a2fd.woff2) format("woff2"),url(/justice40-tool/main/static/Latin-Merriweather-Bold-b6cbc321678701d773c6f86934c55901.woff) format("woff"),url(/justice40-tool/main/static/Latin-Merriweather-Bold-b87366633b1019e8c63c28ce979a1d44.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Merriweather Web;font-style:italic;font-weight:300;src:url(/justice40-tool/main/static/Latin-Merriweather-LightItalic-506121dad559538d44eda8fe540f9224.woff2) format("woff2"),url(/justice40-tool/main/static/Latin-Merriweather-LightItalic-8a239a410a47b6192e059fcf26556101.woff) format("woff"),url(/justice40-tool/main/static/Latin-Merriweather-LightItalic-26ebdd3b8f1d039bc3dd95691ce27164.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Merriweather Web;font-style:italic;font-weight:400;src:url(/justice40-tool/main/static/Latin-Merriweather-Italic-c63d4066b0f133fc519f0504abf6ac55.woff2) format("woff2"),url(/justice40-tool/main/static/Latin-Merriweather-Italic-80d8a9aff0d8bdeb966d443e9cfaa19d.woff) format("woff"),url(/justice40-tool/main/static/Latin-Merriweather-Italic-b60043e65fa5cbcedb809c19a4cdd4d6.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Merriweather Web;font-style:italic;font-weight:700;src:url(/justice40-tool/main/static/Latin-Merriweather-BoldItalic-dc8b76b44a8a6e5fad1c8c46568a5951.woff2) format("woff2"),url(/justice40-tool/main/static/Latin-Merriweather-BoldItalic-a0bcf832ed51501c237c07d8909087e6.woff) format("woff"),url(/justice40-tool/main/static/Latin-Merriweather-BoldItalic-4d74f3bda45f5aba1abf8d2a12313b56.ttf) format("truetype")}.usa-focus,[contentEditable=true]:focus,[href]:focus,[tabindex]:focus,button:not([disabled]):focus,iframe:focus,input:not([disabled]):focus,select:not([disabled]):focus,textarea:not([disabled]):focus{outline:.25rem solid #2491ff;outline-offset:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-font-feature-settings:"kern" 1;font-feature-settings:"kern" 1;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-kerning:normal;font-size:100%}address,cite,dfn,var{font-style:normal}/*! uswds @version */body{background-color:#fff;color:#1b1b1b;overflow-x:hidden}.usa-sr-only{left:-999em;position:absolute;right:auto}.usa-button{-webkit-appearance:none;appearance:none;background-color:#005ea2;border:0;border-radius:.25rem;color:#fff;cursor:pointer;display:inline-block;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;font-weight:700;line-height:.9;margin-right:.5rem;padding:.75rem 1.25rem;text-align:center;text-decoration:none;width:100%}@media (min-width:30em){.usa-button{width:auto}}.usa-button:visited{color:#fff}.usa-button.usa-button--hover,.usa-button:hover{background-color:#1a4480;border-bottom:0;color:#fff;text-decoration:none}.usa-button.usa-button--active,.usa-button:active{background-color:#162e51;color:#fff}.usa-button:not([disabled]).usa-focus,.usa-button:not([disabled]):focus{outline-offset:.25rem}.usa-button:disabled{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#c9c9c9;color:#fff;pointer-events:none}.usa-button:disabled.usa-button--active,.usa-button:disabled.usa-button--hover,.usa-button:disabled.usa-focus,.usa-button:disabled:active,.usa-button:disabled:focus,.usa-button:disabled:hover{background-color:#c9c9c9;border:0;box-shadow:none}.usa-button--accent-cool,.usa-button--accent-cool:visited{background-color:#00bde3;color:#1b1b1b}.usa-button--accent-cool.usa-button--hover,.usa-button--accent-cool:hover{background-color:#28a0cb;color:#1b1b1b}.usa-button--accent-cool.usa-button--active,.usa-button--accent-cool:active{background-color:#07648d;color:#fff}.usa-button--accent-warm,.usa-button--accent-warm:visited{background-color:#fa9441;color:#1b1b1b}.usa-button--accent-warm.usa-button--hover,.usa-button--accent-warm:hover{background-color:#c05600;color:#fff}.usa-button--accent-warm.usa-button--active,.usa-button--accent-warm:active{background-color:#775540;color:#fff}.usa-button--outline{background-color:transparent;box-shadow:inset 0 0 0 2px #005ea2;color:#005ea2}.usa-button--outline:visited{color:#005ea2}.usa-button--outline.usa-button--hover,.usa-button--outline:hover{background-color:transparent;box-shadow:inset 0 0 0 2px #1a4480;color:#1a4480}.usa-button--outline.usa-button--active,.usa-button--outline:active{background-color:transparent;box-shadow:inset 0 0 0 2px #162e51;color:#162e51}.usa-button--outline.usa-button--inverse{box-shadow:inset 0 0 0 2px #dfe1e2;color:#dfe1e2}.usa-button--outline.usa-button--inverse:visited{color:#dfe1e2}.usa-button--outline.usa-button--inverse.usa-button--hover,.usa-button--outline.usa-button--inverse:hover{box-shadow:inset 0 0 0 2px #f0f0f0;color:#f0f0f0}.usa-button--outline.usa-button--inverse.usa-button--active,.usa-button--outline.usa-button--inverse:active{background-color:transparent;box-shadow:inset 0 0 0 2px #fff;color:#fff}.usa-button--outline.usa-button--inverse.usa-button--unstyled{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;border:0;border-radius:0;box-shadow:none;color:#005ea2;color:#dfe1e2;font-weight:400;margin:0;padding:0;text-align:left;text-decoration:underline}.usa-button--outline.usa-button--inverse.usa-button--unstyled:visited{color:#54278f}.usa-button--outline.usa-button--inverse.usa-button--unstyled:hover{color:#1a4480}.usa-button--outline.usa-button--inverse.usa-button--unstyled:active{color:#162e51}.usa-button--outline.usa-button--inverse.usa-button--unstyled:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-button--outline.usa-button--inverse.usa-button--unstyled:active,.usa-button--outline.usa-button--inverse.usa-button--unstyled:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}.usa-button--outline.usa-button--inverse.usa-button--unstyled:visited{color:#dfe1e2}.usa-button--outline.usa-button--inverse.usa-button--unstyled.usa-button--hover,.usa-button--outline.usa-button--inverse.usa-button--unstyled:hover{color:#f0f0f0}.usa-button--outline.usa-button--inverse.usa-button--unstyled.usa-button--active,.usa-button--outline.usa-button--inverse.usa-button--unstyled:active{color:#fff}.usa-button--base{background-color:#71767a;color:#fff}.usa-button--base.usa-button--hover,.usa-button--base:hover{background-color:#565c65;color:#fff}.usa-button--base.usa-button--active,.usa-button--base:active{background-color:#3d4551;color:#fff}.usa-button--secondary{background-color:#d83933;color:#fff}.usa-button--secondary.usa-button--hover,.usa-button--secondary:hover{background-color:#b50909;color:#fff}.usa-button--secondary.usa-button--active,.usa-button--secondary:active{background-color:#8b0a03;color:#fff}.usa-button--big{border-radius:.25rem;font-size:1.46rem;padding:1rem 1.5rem}.usa-button--disabled{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#c9c9c9;color:#fff;pointer-events:none}.usa-button--disabled.usa-button--active,.usa-button--disabled.usa-button--hover,.usa-button--disabled.usa-focus,.usa-button--disabled:active,.usa-button--disabled:focus,.usa-button--disabled:hover{background-color:#c9c9c9;border:0;box-shadow:none}.usa-button--outline-disabled,.usa-button--outline-inverse-disabled,.usa-button--outline-inverse:disabled,.usa-button--outline:disabled{background-color:transparent;pointer-events:none}.usa-button--outline-disabled.usa-button--active,.usa-button--outline-disabled.usa-button--hover,.usa-button--outline-disabled.usa-focus,.usa-button--outline-disabled:active,.usa-button--outline-disabled:focus,.usa-button--outline-disabled:hover,.usa-button--outline-inverse-disabled.usa-button--active,.usa-button--outline-inverse-disabled.usa-button--hover,.usa-button--outline-inverse-disabled.usa-focus,.usa-button--outline-inverse-disabled:active,.usa-button--outline-inverse-disabled:focus,.usa-button--outline-inverse-disabled:hover,.usa-button--outline-inverse:disabled.usa-button--active,.usa-button--outline-inverse:disabled.usa-button--hover,.usa-button--outline-inverse:disabled.usa-focus,.usa-button--outline-inverse:disabled:active,.usa-button--outline-inverse:disabled:focus,.usa-button--outline-inverse:disabled:hover,.usa-button--outline:disabled.usa-button--active,.usa-button--outline:disabled.usa-button--hover,.usa-button--outline:disabled.usa-focus,.usa-button--outline:disabled:active,.usa-button--outline:disabled:focus,.usa-button--outline:disabled:hover{background-color:transparent;border:0}.usa-button--outline-disabled,.usa-button--outline:disabled{box-shadow:inset 0 0 0 2px #c9c9c9;color:#c9c9c9}.usa-button--outline-disabled.usa-button--inverse,.usa-button--outline:disabled.usa-button--inverse{background-color:transparent;box-shadow:inset 0 0 0 2px #71767a;color:#71767a}.usa-button--unstyled{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;border:0;border-radius:0;box-shadow:none;color:#005ea2;font-weight:400;margin:0;padding:0;text-align:left;text-decoration:underline}.usa-button--unstyled:visited{color:#54278f}.usa-button--unstyled:hover{color:#1a4480}.usa-button--unstyled:active{color:#162e51}.usa-button--unstyled:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-button--unstyled:active,.usa-button--unstyled:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}.usa-embed-container embed,.usa-embed-container iframe,.usa-embed-container object{height:100%;left:0;position:absolute;top:0;width:100%}.usa-embed-container{height:0;max-width:100%;overflow:hidden;padding-bottom:56.25%;position:relative}img{max-width:100%}.usa-media-link{display:inline-block;line-height:0}.usa-combo-box__input,.usa-combo-box__list,.usa-fieldset,.usa-hint,.usa-input,.usa-range,.usa-select,.usa-textarea{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3}.usa-combo-box__input,.usa-input,.usa-range,.usa-select,.usa-textarea{-webkit-appearance:none;appearance:none;border:1px solid #565c65;border-radius:0;color:#1b1b1b;display:block;height:2.5rem;margin-top:.5rem;max-width:30rem;padding:.5rem;width:100%}.usa-input--success.usa-combo-box__input,.usa-input--success.usa-input,.usa-input--success.usa-range,.usa-input--success.usa-select,.usa-input--success.usa-textarea{border:.25rem solid #00a91c}.usa-fieldset{border:none;margin:0;padding:0}.usa-form-group--error{border-left:.25rem solid #b50909;margin-top:2rem;padding-left:1rem;position:relative}@media (min-width:64em){.usa-form-group--error{margin-left:-1.25rem}}.usa-error-message{color:#b50909;display:block;font-weight:700;padding-bottom:.25rem;padding-top:.25rem}.usa-hint{color:#71767a}.usa-label,.usa-legend{display:block;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;font-weight:400;line-height:1.3;margin-top:1.5rem;max-width:30rem}.usa-label--error{font-weight:700;margin-top:0}.usa-hint--required,.usa-label--required{color:#b50909}.usa-legend--large{font-size:2.13rem;font-weight:700;margin-top:1rem}abbr[title=required]{text-decoration:none}.usa-input-list{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-input-list li{line-height:1.3}.usa-prose .usa-input-list{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-prose .usa-input-list li{line-height:1.3}.usa-checkbox__input,.usa-radio__input{left:-999em;position:absolute;right:auto}.lt-ie9 .usa-checkbox__input,.lt-ie9 .usa-radio__input{border:0;float:left;margin:.25rem .25rem 0 0;position:static;width:auto}.usa-checkbox__label,.usa-radio__label{cursor:pointer;display:inherit;font-weight:400;margin-top:.75rem;padding-left:2rem;position:relative;text-indent:-2rem}.usa-checkbox__label:before,.usa-radio__label:before{background:#fff;content:" ";display:inline-block;left:2px;position:relative;vertical-align:middle\0 }.usa-checkbox__label:before{border-radius:2px;height:1.25rem;width:1.25rem}.usa-radio__label:before{border-radius:99rem;height:1.25rem;width:1.25rem}.usa-checkbox__label:before,.usa-radio__label:before{box-shadow:0 0 0 2px #71767a;line-height:1.25rem;margin-right:.75rem;text-indent:0}.usa-checkbox__input:checked+.usa-checkbox__label:before,.usa-radio__input:checked+.usa-radio__label:before{background-color:#005ea2;box-shadow:0 0 0 2px #005ea2}.usa-radio__input:checked+.usa-radio__label:before{box-shadow:0 0 0 2px #005ea2,inset 0 0 0 2px #fff}@media print{.usa-radio__input:checked+.usa-radio__label:before{box-shadow:inset 0 0 0 2px #fff,inset 0 0 0 1rem #005ea2,0 0 0 2px #005ea2}}.usa-checkbox__input:checked+.usa-checkbox__label:before,.usa-checkbox__input:checked:disabled+.usa-checkbox__label:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NSA1MCI+PHBhdGggZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtNjMuMjY4IDcuMDYzLTUuNjE2LTUuNjFDNTYuODgyLjY4NSA1NS45NDYuMyA1NC44NDUuM3MtMi4wMzguMzg1LTIuODA4IDEuMTU1TDI0Ljk1MSAyOC41NTIgMTIuODEgMTYuMzg1Yy0uNzctLjc3LTEuNzA3LTEuMTU1LTIuODA4LTEuMTU1LTEuMSAwLTIuMDM3LjM4NS0yLjgwNyAxLjE1NGwtNS42MTYgNS42MUMuODEgMjIuNzY0LjQyNSAyMy43LjQyNSAyNC44cy4zODUgMi4wMzUgMS4xNTUgMi44MDVsMTQuOTQ3IDE0LjkzIDUuNjE2IDUuNjFjLjc3Ljc3IDEuNzA2IDEuMTU0IDIuODA3IDEuMTU0czIuMDM4LS4zODQgMi44MDgtMS4xNTRsNS42MTYtNS42MSAyOS44OTQtMjkuODZjLjc3LS43NyAxLjE1Ny0xLjcwNyAxLjE1Ny0yLjgwNSAwLTEuMTAxLS4zODUtMi4wMzYtMS4xNTYtMi44MDVsLS4wMDEtLjAwMnoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-position:50%;background-repeat:no-repeat;background-size:.75rem auto}@media print{.usa-checkbox__input:checked+.usa-checkbox__label:before,.usa-checkbox__input:checked:disabled+.usa-checkbox__label:before{background-color:#fff;background-image:none;content:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxMSI+PHBhdGggZmlsbD0iIzE3MTcxNyIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTUuNzgzIDEuMjQyIDE0LjczLjIxMkEuNzI1LjcyNSAwIDAgMCAxNC4yMDQgMGEuNzI1LjcyNSAwIDAgMC0uNTI3LjIxMkw4LjYgNS4xODkgNi4zMjIgMi45NTVhLjcyNC43MjQgMCAwIDAtLjUyNi0uMjEzLjcyNS43MjUgMCAwIDAtLjUyNi4yMTJsLTEuMDUzIDEuMDNBLjY5NS42OTUgMCAwIDAgNCA0LjVjMCAuMjAyLjA3Mi4zNzQuMjE3LjUxNWwyLjgwMiAyLjc0MyAxLjA1MyAxLjAzYy4xNDUuMTQxLjMyLjIxMi41MjcuMjEyLjIwNiAwIC4zODItLjA3LjUyNi0uMjEybDEuMDUzLTEuMDMgNS42MDUtNS40ODVBLjY5NS42OTUgMCAwIDAgMTYgMS43NThhLjY5NC42OTQgMCAwIDAtLjIxNy0uNTE1eiIvPjwvc3ZnPg==);text-indent:0}}.usa-radio__input:focus+.usa-radio__label:before{outline:.25rem solid #2491ff;outline-offset:.25rem}.usa-checkbox__input:disabled+.usa-checkbox__label,.usa-radio__input:disabled+.usa-radio__label{color:#c9c9c9;cursor:not-allowed}.usa-checkbox__input:focus+.usa-checkbox__label:before{outline:.25rem solid #2491ff;outline-offset:0}.usa-checkbox__input:disabled+.usa-checkbox__label:before,.usa-radio__input:disabled+.usa-radio__label:before{background:#e6e6e6;box-shadow:0 0 0 2px #c9c9c9;cursor:not-allowed}.usa-checkbox__input--tile+.usa-checkbox__label,.usa-radio__input--tile+.usa-radio__label{border:2px solid #dfe1e2;border-radius:.25rem;margin:.5rem 0;padding:.75rem 1rem .75rem 2.5rem}.usa-checkbox__input--tile:checked+.usa-checkbox__label,.usa-radio__input--tile:checked+.usa-radio__label{background-color:#d9e8f6;border-color:#73b3e7}.usa-checkbox__label-description,.usa-radio__label-description{display:block;font-size:.93rem;margin-top:.5rem;text-indent:0}.usa-memorable-date{display:flex}.usa-memorable-date [type=number]{-moz-appearance:textfield}.usa-memorable-date [type=number]::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none}.usa-memorable-date [type=number]::-webkit-contacts-auto-fill-button{display:none!important;height:0;margin:0;pointer-events:none;visibility:hidden;width:0}.usa-form-group--day,.usa-form-group--month,.usa-form-group--year{flex:0 1 auto;margin-right:1rem;width:3rem}.usa-form-group--year{width:4.5rem}.usa-select{-webkit-appearance:none;appearance:none;background-color:#fff;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMiA1LjgzIDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-position:right .5rem center;background-repeat:no-repeat;background-size:1.25rem;padding-right:2rem}.usa-select::-ms-expand{display:none}.usa-select:-webkit-autofill{-webkit-appearance:menulist;appearance:menulist}.usa-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}[type=file]{border:none;margin-top:.5rem;padding-left:0;padding-top:.2rem}.usa-file-input{display:block;max-width:30rem;width:100%}.usa-file-input__target{border:1px dashed #a9aeb1;display:block;font-size:.93rem;margin-top:.5rem;position:relative;text-align:center;width:100%}.usa-file-input__target:hover{border-color:#71767a}.usa-file-input__target.has-invalid-file{border-color:#fa9441}.usa-file-input__accepted-files-message{font-weight:700;margin:-1.5rem 0 1.5rem;pointer-events:none;position:relative;z-index:3}.has-invalid-file .usa-file-input__accepted-files-message{color:#b50909}.usa-file-input__choose{color:#005ea2;font-weight:400;text-decoration:underline}.usa-file-input__choose:visited{color:#54278f}.usa-file-input__choose:hover{color:#1a4480}.usa-file-input__choose:active{color:#162e51}.usa-file-input__choose:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-file-input__instructions{display:inline-block;padding:2rem 1rem;pointer-events:none;position:relative;z-index:3}.usa-file-input__instructions.display-none{display:none}.usa-file-input__box{background:#fff;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:2}.usa-file-input .usa-file-input__input[type]{cursor:pointer;height:100%;left:0;margin:0;max-width:none;padding:.5rem;position:absolute;text-indent:-999em;top:0;width:100%;z-index:1}.usa-file-input .usa-file-input__input[type]::-webkit-file-upload-button{display:none}.usa-file-input--drag .usa-file-input__target{border-color:#005ea2}.usa-file-input--drag .usa-file-input__box{background-color:#d9e8f6!important}.usa-file-input--drag .usa-file-input__preview{opacity:.1}.usa-file-input__preview-heading{font-weight:700;justify-content:space-between;padding:.5rem}.usa-file-input__preview,.usa-file-input__preview-heading{align-items:center;background:#d9e8f6;display:flex;pointer-events:none;position:relative;z-index:3}.usa-file-input__preview{word-wrap:anywhere;font-size:.87rem;margin-top:1px;padding:.25rem .5rem;text-align:left}.usa-file-input__preview:last-child{margin-bottom:-1.5rem}.usa-file-input__preview-image{border:none;display:block;height:2.5rem;margin-right:.5rem;-o-object-fit:contain;object-fit:contain;width:2.5rem}.usa-file-input__preview-image.is-loading{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwYXRoIGQ9Ik0zOC41MiAzMy4zNyAyMS4zNiAxNi4yQTYzLjYgNjMuNiAwIDAgMSA1OS41LjE2djI0LjNhMzkuNSAzOS41IDAgMCAwLTIwLjk4IDguOTJ6Ii8+PHBhdGggZmlsbD0ic2lsdmVyIiBmaWxsLW9wYWNpdHk9Ii4yNSIgZD0iTTY3LjY0MiAyNC4zMjQgNjcuNjQ5LjA1YTYzLjYgNjMuNiAwIDAgMSAzOC4zMSAxNS42MjdMODguNzc4IDMyLjg2YTM5LjUgMzkuNSAwIDAgMC0yMS4xNDItOC41Mjh6TTk0LjYzIDM4LjUybDE3LjE3LTE3LjE2YTYzLjYgNjMuNiAwIDAgMSAxNi4wNCAzOC4xNGgtMjQuM2EzOS41IDM5LjUgMCAwIDAtOC45Mi0yMC45OHpNMTAzLjY3NiA2Ny42NDJsMjQuMjc1LjAwN2E2My42IDYzLjYgMCAwIDEtMTUuNjI3IDM4LjMxTDk1LjE0IDg4Ljc3OGEzOS41IDM5LjUgMCAwIDAgOC41MjgtMjEuMTQyek04OS40OCA5NC42M2wxNy4xNiAxNy4xN2E2My42IDYzLjYgMCAwIDEtMzguMTQgMTYuMDR2LTI0LjNhMzkuNSAzOS41IDAgMCAwIDIwLjk4LTguOTJ6TTYwLjM1OCAxMDMuNjc2bC0uMDA3IDI0LjI3NWE2My42IDYzLjYgMCAwIDEtMzguMzEtMTUuNjI3TDM5LjIyMiA5NS4xNGEzOS41IDM5LjUgMCAwIDAgMjEuMTQyIDguNTI4ek0zMy4zNyA4OS40OCAxNi4yIDEwNi42NEE2My42IDYzLjYgMCAwIDEgLjE2IDY4LjVoMjQuM2EzOS41IDM5LjUgMCAwIDAgOC45MiAyMC45OHpNMjQuMzI0IDYwLjM1OC4wNSA2MC4zNTFhNjMuNiA2My42IDAgMCAxIDE1LjYyNy0zOC4zMUwzMi44NiAzOS4yMjJhMzkuNSAzOS41IDAgMCAwLTguNTI4IDIxLjE0MnoiLz48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIGNhbGNNb2RlPSJkaXNjcmV0ZSIgZHVyPSI3MjBtcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHR5cGU9InJvdGF0ZSIgdmFsdWVzPSIwIDY0IDY0OzQ1IDY0IDY0OzkwIDY0IDY0OzEzNSA2NCA2NDsxODAgNjQgNjQ7MjI1IDY0IDY0OzI3MCA2NCA2NDszMTUgNjQgNjQiLz48L2c+PC9zdmc+),linear-gradient(transparent,transparent);background-position:50%;background-repeat:no-repeat;background-size:2rem}.usa-file-input__preview-image--excel,.usa-file-input__preview-image--generic,.usa-file-input__preview-image--pdf,.usa-file-input__preview-image--video,.usa-file-input__preview-image--word{background-position:50%;background-repeat:no-repeat;background-size:1.5rem}.usa-file-input__preview-image--pdf{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwNzY0OGQiIHZpZXdCb3g9IjAgMCAzODQgNTEyIj48cGF0aCBkPSJNMTgxLjkgMjU2LjFjLTUtMTYtNC45LTQ2LjktMi00Ni45IDguNCAwIDcuNiAzNi45IDIgNDYuOXptLTEuNyA0Ny4yYy03LjcgMjAuMi0xNy4zIDQzLjMtMjguNCA2Mi43IDE4LjMtNyAzOS0xNy4yIDYyLjktMjEuOS0xMi43LTkuNi0yNC45LTIzLjQtMzQuNS00MC44ek04Ni4xIDQyOC4xYzAgLjggMTMuMi01LjQgMzQuOS00MC4yLTYuNyA2LjMtMjkuMSAyNC41LTM0LjkgNDAuMnpNMjQ4IDE2MGgxMzZ2MzI4YzAgMTMuMy0xMC43IDI0LTI0IDI0SDI0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNFYyNEMwIDEwLjcgMTAuNyAwIDI0IDBoMjAwdjEzNmMwIDEzLjIgMTAuOCAyNCAyNCAyNHptLTggMTcxLjhjLTIwLTEyLjItMzMuMy0yOS00Mi43LTUzLjggNC41LTE4LjUgMTEuNi00Ni42IDYuMi02NC4yLTQuNy0yOS40LTQyLjQtMjYuNS00Ny44LTYuOC01IDE4LjMtLjQgNDQuMSA4LjEgNzctMTEuNiAyNy42LTI4LjcgNjQuNi00MC44IDg1LjgtLjEgMC0uMS4xLS4yLjEtMjcuMSAxMy45LTczLjYgNDQuNS01NC41IDY4IDUuNiA2LjkgMTYgMTAgMjEuNSAxMCAxNy45IDAgMzUuNy0xOCA2MS4xLTYxLjggMjUuOC04LjUgNTQuMS0xOS4xIDc5LTIzLjIgMjEuNyAxMS44IDQ3LjEgMTkuNSA2NCAxOS41IDI5LjIgMCAzMS4yLTMyIDE5LjctNDMuNC0xMy45LTEzLjYtNTQuMy05LjctNzMuNi03LjJ6TTM3NyAxMDUgMjc5IDdjLTQuNS00LjUtMTAuNi03LTE3LTdoLTZ2MTI4aDEyOHYtNi4xYzAtNi4zLTIuNS0xMi40LTctMTYuOXptLTc0LjEgMjU1LjNjNC4xLTIuNy0yLjUtMTEuOS00Mi44LTkgMzcuMSAxNS44IDQyLjggOSA0Mi44IDl6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-file-input__preview-image--generic{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwNzY0OGQiIHZpZXdCb3g9IjAgMCAzODQgNTEyIj48cGF0aCBkPSJNMjI0IDEzNlYwSDI0QzEwLjcgMCAwIDEwLjcgMCAyNHY0NjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMzM2YzEzLjMgMCAyNC0xMC43IDI0LTI0VjE2MEgyNDhjLTEzLjIgMC0yNC0xMC44LTI0LTI0em0xNjAtMTQuMXY2LjFIMjU2VjBoNi4xYzYuNCAwIDEyLjUgMi41IDE3IDdsOTcuOSA5OGM0LjUgNC41IDcgMTAuNiA3IDE2Ljl6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-file-input__preview-image--word{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwNzY0OGQiIHZpZXdCb3g9IjAgMCAzODQgNTEyIj48cGF0aCBkPSJNMjI0IDEzNlYwSDI0QzEwLjcgMCAwIDEwLjcgMCAyNHY0NjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMzM2YzEzLjMgMCAyNC0xMC43IDI0LTI0VjE2MEgyNDhjLTEzLjIgMC0yNC0xMC44LTI0LTI0em01Ny4xIDEyMEgzMDVjNy43IDAgMTMuNCA3LjEgMTEuNyAxNC43bC0zOCAxNjhjLTEuMiA1LjUtNi4xIDkuMy0xMS43IDkuM2gtMzhjLTUuNSAwLTEwLjMtMy44LTExLjYtOS4xLTI1LjgtMTAzLjUtMjAuOC04MS4yLTI1LjYtMTEwLjVoLS41Yy0xLjEgMTQuMy0yLjQgMTcuNC0yNS42IDExMC41LTEuMyA1LjMtNi4xIDkuMS0xMS42IDkuMUgxMTdjLTUuNiAwLTEwLjUtMy45LTExLjctOS40bC0zNy44LTE2OGMtMS43LTcuNSA0LTE0LjYgMTEuNy0xNC42aDI0LjVjNS43IDAgMTAuNyA0IDExLjggOS43IDE1LjYgNzggMjAuMSAxMDkuNSAyMSAxMjIuMiAxLjYtMTAuMiA3LjMtMzIuNyAyOS40LTEyMi43IDEuMy01LjQgNi4xLTkuMSAxMS43LTkuMWgyOS4xYzUuNiAwIDEwLjQgMy44IDExLjcgOS4yIDI0IDEwMC40IDI4LjggMTI0IDI5LjYgMTI5LjQtLjItMTEuMi0yLjYtMTcuOCAyMS42LTEyOS4yIDEtNS42IDUuOS05LjUgMTEuNS05LjV6TTM4NCAxMjEuOXY2LjFIMjU2VjBoNi4xYzYuNCAwIDEyLjUgMi41IDE3IDdsOTcuOSA5OGM0LjUgNC41IDcgMTAuNiA3IDE2Ljl6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-file-input__preview-image--excel{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwNzY0OGQiIHZpZXdCb3g9IjAgMCAzODQgNTEyIj48cGF0aCBkPSJNMjI0IDEzNlYwSDI0QzEwLjcgMCAwIDEwLjcgMCAyNHY0NjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMzM2YzEzLjMgMCAyNC0xMC43IDI0LTI0VjE2MEgyNDhjLTEzLjIgMC0yNC0xMC44LTI0LTI0em02MC4xIDEwNi41TDIyNCAzMzZsNjAuMSA5My41YzUuMSA4LS42IDE4LjUtMTAuMSAxOC41aC0zNC45Yy00LjQgMC04LjUtMi40LTEwLjYtNi4zQzIwOC45IDQwNS41IDE5MiAzNzMgMTkyIDM3M2MtNi40IDE0LjgtMTAgMjAtMzYuNiA2OC44LTIuMSAzLjktNi4xIDYuMy0xMC41IDYuM0gxMTBjLTkuNSAwLTE1LjItMTAuNS0xMC4xLTE4LjVsNjAuMy05My41LTYwLjMtOTMuNWMtNS4yLTggLjYtMTguNSAxMC4xLTE4LjVoMzQuOGM0LjQgMCA4LjUgMi40IDEwLjYgNi4zIDI2LjEgNDguOCAyMCAzMy42IDM2LjYgNjguNSAwIDAgNi4xLTExLjcgMzYuNi02OC41IDIuMS0zLjkgNi4yLTYuMyAxMC42LTYuM0gyNzRjOS41LS4xIDE1LjIgMTAuNCAxMC4xIDE4LjR6TTM4NCAxMjEuOXY2LjFIMjU2VjBoNi4xYzYuNCAwIDEyLjUgMi41IDE3IDdsOTcuOSA5OGM0LjUgNC41IDcgMTAuNiA3IDE2Ljl6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-file-input__preview-image--video{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwNzY0OGQiIHZpZXdCb3g9IjAgMCAzODQgNTEyIj48cGF0aCBkPSJNMzg0IDEyMS45NDFWMTI4SDI1NlYwaDYuMDU5YzYuMzY1IDAgMTIuNDcgMi41MjkgMTYuOTcxIDcuMDI5bDk3Ljk0MSA5Ny45NDFBMjQuMDA1IDI0LjAwNSAwIDAgMSAzODQgMTIxLjk0MXpNMjI0IDEzNlYwSDI0QzEwLjc0NSAwIDAgMTAuNzQ1IDAgMjR2NDY0YzAgMTMuMjU1IDEwLjc0NSAyNCAyNCAyNGgzMzZjMTMuMjU1IDAgMjQtMTAuNzQ1IDI0LTI0VjE2MEgyNDhjLTEzLjIgMC0yNC0xMC44LTI0LTI0em05NiAxNDQuMDE2djExMS45NjNjMCAyMS40NDUtMjUuOTQzIDMxLjk5OC00MC45NzEgMTYuOTcxTDIyNCAzNTMuOTQxVjM5MmMwIDEzLjI1NS0xMC43NDUgMjQtMjQgMjRIODhjLTEzLjI1NSAwLTI0LTEwLjc0NS0yNC0yNFYyODBjMC0xMy4yNTUgMTAuNzQ1LTI0IDI0LTI0aDExMmMxMy4yNTUgMCAyNCAxMC43NDUgMjQgMjR2MzguMDU5bDU1LjAyOS01NS4wMTNjMTUuMDExLTE1LjAxIDQwLjk3MS00LjQ5MSA0MC45NzEgMTYuOTd6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-form-group--error .usa-file-input__target{border-color:#b50909;border-width:2px}.usa-file-input--disabled{pointer-events:none}.usa-file-input--disabled .usa-file-input__instructions{opacity:.5}.usa-file-input--disabled .usa-file-input__box{background-color:#e6e6e6}.usa-file-input--disabled .usa-file-input__input[type]{cursor:default}.usa-range{-webkit-appearance:none;appearance:none;border:none;padding-left:1px;width:100%}.usa-range:focus{outline:none}.usa-range:focus::-webkit-slider-thumb{background-color:#fff;box-shadow:0 0 0 2px #2491ff}.usa-range:focus::-moz-range-thumb{background-color:#fff;box-shadow:0 0 0 2px #2491ff}.usa-range:focus::-ms-thumb{background-color:#fff;box-shadow:0 0 0 2px #2491ff}.usa-range::-webkit-slider-runnable-track{background-color:#f0f0f0;border:1px solid #71767a;border-radius:99rem;cursor:pointer;height:1rem;width:100%}.usa-range::-moz-range-track{background-color:#f0f0f0;border:1px solid #71767a;border-radius:99rem;cursor:pointer;height:1rem;width:100%}.usa-range::-ms-track{background-color:#f0f0f0;border:1px solid #71767a;border-radius:99rem;cursor:pointer;height:1rem;width:100%}.usa-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:#f0f0f0;border:none;border-radius:99rem;box-shadow:0 0 0 2px #71767a;cursor:pointer;height:1.25rem;margin-top:-.19rem;width:1.25rem}.usa-range::-moz-range-thumb{background:#f0f0f0;border:none;border-radius:99rem;box-shadow:0 0 0 2px #71767a;cursor:pointer;height:1.25rem;width:1.25rem}.usa-range::-ms-thumb{background:#f0f0f0;border:none;border-radius:99rem;box-shadow:0 0 0 2px #71767a;cursor:pointer;height:1.25rem;width:1.25rem}.usa-range::-ms-fill-lower,.usa-range::-ms-fill-upper{background-color:#f0f0f0;border:1px solid #71767a;border-radius:99rem}.usa-textarea{height:10rem}.usa-input--error{border:.25rem solid #b50909}.usa-character-count__message{display:inline-block;padding-top:.25rem}.usa-character-count__message--invalid{color:#b50909;font-weight:700}.usa-combo-box{max-width:30rem;position:relative}.usa-combo-box--pristine .usa-combo-box__input{padding-right:calc(5em + 4px)}.usa-combo-box--pristine .usa-combo-box__input::-ms-clear{display:none}.usa-combo-box--pristine .usa-combo-box__clear-input{display:block}.usa-combo-box__input{-webkit-appearance:none;appearance:none;margin-bottom:0;max-width:none;padding-right:calc(2.5em + 3px)}button.usa-combo-box__clear-input:focus,button.usa-combo-box__toggle-list:focus{outline-offset:-4px}.usa-combo-box__clear-input__wrapper:focus,.usa-combo-box__toggle-list__wrapper:focus{outline:0}.usa-combo-box__clear-input,.usa-combo-box__toggle-list{background-color:transparent;background-position:50%;background-size:auto 1.5rem;border:0;bottom:1px;cursor:pointer;margin-bottom:0;opacity:.6;padding-right:2rem;position:absolute;top:1px;z-index:100}.usa-combo-box__clear-input{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSA2LjQxIDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat;display:none;right:calc(2.5em + 3px)}.usa-combo-box__toggle-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xNi41OSA4LjU5IDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat;background-size:auto 2rem;right:1px}.usa-combo-box__input-button-separator{background-color:#c6cace;box-sizing:border-box;margin-bottom:8px;margin-top:8px;position:absolute;right:calc(2.5em + 2px);top:1px;width:1px;z-index:200}.usa-combo-box__list{background-color:#fff;border:1px solid #565c65;border-radius:0;border-top:0;margin:0;max-height:12.1em;overflow-x:hidden;overflow-y:scroll;padding:0;position:absolute;width:100%;z-index:300}.usa-combo-box__list:focus{outline:0}.usa-combo-box__list-option{border-bottom:1px solid #dfe1e2;cursor:pointer;display:block;padding:.5rem}.usa-combo-box__list-option--focused{outline:2px solid #162e51;outline-offset:-2px;position:relative;z-index:100}.usa-combo-box__list-option--focused:focus{outline-offset:-4px}.usa-combo-box__list-option--selected{background-color:#005ea2;border-color:#005ea2;color:#fff}.usa-combo-box__list-option--no-results{cursor:not-allowed;display:block;padding:.5rem}.usa-date-picker__wrapper{display:none;position:relative}.usa-date-picker__wrapper:focus{outline:0}.usa-date-picker__button,.usa-date-picker__calendar__date,.usa-date-picker__calendar__month,.usa-date-picker__calendar__month-selection,.usa-date-picker__calendar__next-month,.usa-date-picker__calendar__next-year,.usa-date-picker__calendar__next-year-chunk,.usa-date-picker__calendar__previous-month,.usa-date-picker__calendar__previous-year,.usa-date-picker__calendar__previous-year-chunk,.usa-date-picker__calendar__year,.usa-date-picker__calendar__year-selection{background-color:#f0f0f0;border:0;width:100%}.usa-date-picker__button:not([disabled]),.usa-date-picker__calendar__date:not([disabled]),.usa-date-picker__calendar__month-selection:not([disabled]),.usa-date-picker__calendar__month:not([disabled]),.usa-date-picker__calendar__next-month:not([disabled]),.usa-date-picker__calendar__next-year-chunk:not([disabled]),.usa-date-picker__calendar__next-year:not([disabled]),.usa-date-picker__calendar__previous-month:not([disabled]),.usa-date-picker__calendar__previous-year-chunk:not([disabled]),.usa-date-picker__calendar__previous-year:not([disabled]),.usa-date-picker__calendar__year-selection:not([disabled]),.usa-date-picker__calendar__year:not([disabled]){cursor:pointer}.usa-date-picker__button:not([disabled]):focus,.usa-date-picker__calendar__date:not([disabled]):focus,.usa-date-picker__calendar__month-selection:not([disabled]):focus,.usa-date-picker__calendar__month:not([disabled]):focus,.usa-date-picker__calendar__next-month:not([disabled]):focus,.usa-date-picker__calendar__next-year-chunk:not([disabled]):focus,.usa-date-picker__calendar__next-year:not([disabled]):focus,.usa-date-picker__calendar__previous-month:not([disabled]):focus,.usa-date-picker__calendar__previous-year-chunk:not([disabled]):focus,.usa-date-picker__calendar__previous-year:not([disabled]):focus,.usa-date-picker__calendar__year-selection:not([disabled]):focus,.usa-date-picker__calendar__year:not([disabled]):focus{outline-offset:-4px}.usa-date-picker__button:not([disabled]):hover,.usa-date-picker__calendar__date:not([disabled]):hover,.usa-date-picker__calendar__month-selection:not([disabled]):hover,.usa-date-picker__calendar__month:not([disabled]):hover,.usa-date-picker__calendar__next-month:not([disabled]):hover,.usa-date-picker__calendar__next-year-chunk:not([disabled]):hover,.usa-date-picker__calendar__next-year:not([disabled]):hover,.usa-date-picker__calendar__previous-month:not([disabled]):hover,.usa-date-picker__calendar__previous-year-chunk:not([disabled]):hover,.usa-date-picker__calendar__previous-year:not([disabled]):hover,.usa-date-picker__calendar__year-selection:not([disabled]):hover,.usa-date-picker__calendar__year:not([disabled]):hover{background-color:#dfe1e2}.usa-date-picker__button:not([disabled]):active,.usa-date-picker__calendar__date:not([disabled]):active,.usa-date-picker__calendar__month-selection:not([disabled]):active,.usa-date-picker__calendar__month:not([disabled]):active,.usa-date-picker__calendar__next-month:not([disabled]):active,.usa-date-picker__calendar__next-year-chunk:not([disabled]):active,.usa-date-picker__calendar__next-year:not([disabled]):active,.usa-date-picker__calendar__previous-month:not([disabled]):active,.usa-date-picker__calendar__previous-year-chunk:not([disabled]):active,.usa-date-picker__calendar__previous-year:not([disabled]):active,.usa-date-picker__calendar__year-selection:not([disabled]):active,.usa-date-picker__calendar__year:not([disabled]):active{background-color:#a9aeb1}.usa-date-picker--active .usa-date-picker__button{background-color:#f0f0f0}.usa-date-picker--active .usa-date-picker__calendar{z-index:400}.usa-date-picker__button{align-self:stretch;background-color:transparent;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0yMCAzaC0xVjFoLTJ2Mkg3VjFINXYySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxOEg0VjhoMTZ2MTN6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-position:50%;background-repeat:no-repeat;background-size:1.5rem;margin-top:.5em;width:3em}.usa-date-picker--initialized .usa-date-picker__wrapper{display:flex}.usa-date-picker__calendar{background-color:#f0f0f0;left:0;position:absolute;width:100%;z-index:100}.usa-date-picker__calendar__table{border-collapse:collapse;border-spacing:0;table-layout:fixed;text-align:center;width:100%}.usa-date-picker__calendar__table th{font-weight:400}.usa-date-picker__calendar__table td{padding:0}.usa-date-picker__calendar__row{display:flex;flex-wrap:wrap;text-align:center;width:100%}.usa-date-picker__calendar__cell{background-color:#f0f0f0;flex:1 1}.usa-date-picker__calendar__cell--center-items{align-items:center;display:flex;justify-content:center}.usa-date-picker__calendar__next-month,.usa-date-picker__calendar__next-year,.usa-date-picker__calendar__previous-month,.usa-date-picker__calendar__previous-year{background-position:50%;background-size:auto 1.5rem;height:1.5rem;padding:20px 10px}.usa-date-picker__calendar__previous-year:not([disabled]){background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBwb2ludHM9IjAgMCAyNCAwIDI0IDI0IDAgMjQiLz48cG9seWdvbiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTEuNDEgNy40MSAxMCA2IDQgMTIgMTAgMTggMTEuNDEgMTYuNTkgNi44MyAxMiIvPjxwb2x5Z29uIGZpbGw9IiMwMDAiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSIxOS40MSA3LjQxIDE4IDYgMTIgMTIgMTggMTggMTkuNDEgMTYuNTkgMTQuODMgMTIiLz48L2c+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-date-picker__calendar__previous-month:not([disabled]){background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xNS40MSA3LjQxIDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-date-picker__calendar__next-year:not([disabled]){background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cG9seWdvbiBwb2ludHM9IjAgMCAyNCAwIDI0IDI0IDAgMjQiLz48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQuNTkgNikiPjxwb2x5Z29uIHBvaW50cz0iOS40MSAwIDggMS40MSAxMi41OCA2IDggMTAuNTkgOS40MSAxMiAxNS40MSA2Ii8+PHBvbHlnb24gcG9pbnRzPSIxLjQxIDAgMCAxLjQxIDQuNTggNiAwIDEwLjU5IDEuNDEgMTIgNy40MSA2Ii8+PC9nPjwvZz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-date-picker__calendar__next-month:not([disabled]){background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMCA2IDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-date-picker__calendar__day-of-week{padding:6px 0}.usa-date-picker__calendar__date{padding:10px 0}.usa-date-picker__calendar__date--focused{outline:2px solid #162e51;outline-offset:-2px;position:relative;z-index:100}.usa-date-picker__calendar__date--next-month:not([disabled]),.usa-date-picker__calendar__date--previous-month:not([disabled]){color:#5d5d52}.usa-date-picker__calendar__date--range-date,.usa-date-picker__calendar__date--range-date:not([disabled]),.usa-date-picker__calendar__date--selected,.usa-date-picker__calendar__date--selected:not([disabled]){background-color:#0050d8;color:#f9f9f9}.usa-date-picker__calendar__date--range-date:not([disabled]):hover,.usa-date-picker__calendar__date--selected:not([disabled]):hover{background-color:#0050d8;color:#e6e6e6}.usa-date-picker__calendar__date--range-date:not([disabled]):focus,.usa-date-picker__calendar__date--selected:not([disabled]):focus{background-color:#0050d8;color:#f9f9f9}.usa-date-picker__calendar__date--range-date:not([disabled]):active,.usa-date-picker__calendar__date--selected:not([disabled]):active{background-color:#1a4480}.usa-date-picker__calendar__date--range-date-start{border-bottom-left-radius:10%;border-top-left-radius:10%}.usa-date-picker__calendar__date--range-date-end{border-bottom-right-radius:10%;border-top-right-radius:10%}.usa-date-picker__calendar__date--within-range,.usa-date-picker__calendar__date--within-range:not([disabled]),.usa-date-picker__calendar__date--within-range:not([disabled]):active,.usa-date-picker__calendar__date--within-range:not([disabled]):focus,.usa-date-picker__calendar__date--within-range:not([disabled]):hover{background-color:#cfe8ff}.usa-date-picker__calendar__month-label{flex:4 1;text-align:center}.usa-date-picker__calendar__month-selection,.usa-date-picker__calendar__year-selection{display:inline-block;height:100%;padding:8px 4px;width:auto}.usa-date-picker__calendar__month-picker{padding:20px 5px}.usa-date-picker__calendar__month{padding:10px 0}.usa-date-picker__calendar__month--focused{outline:2px solid #162e51;outline-offset:-2px;position:relative;z-index:100}.usa-date-picker__calendar__month--selected,.usa-date-picker__calendar__month--selected:not([disabled]){background-color:#0050d8;color:#f9f9f9}.usa-date-picker__calendar__month--selected:not([disabled]):hover{background-color:#0050d8;color:#e6e6e6}.usa-date-picker__calendar__month--selected:not([disabled]):focus{background-color:#0050d8;color:#f9f9f9}.usa-date-picker__calendar__month--selected:not([disabled]):active{background-color:#1a4480}.usa-date-picker__calendar__year-picker{padding:20px 5px}.usa-date-picker__calendar__next-year-chunk,.usa-date-picker__calendar__previous-year-chunk{background-position:50%;background-size:auto 2rem;margin:auto;padding:40px 0}.usa-date-picker__calendar__previous-year-chunk:not([disabled]){background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xNS40MSA3LjQxIDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-date-picker__calendar__next-year-chunk:not([disabled]){background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMCA2IDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-date-picker__calendar__year{padding:10px 0}.usa-date-picker__calendar__year--focused{outline:2px solid #162e51;outline-offset:-2px;position:relative;z-index:100}.usa-date-picker__calendar__year--selected,.usa-date-picker__calendar__year--selected:not([disabled]){background-color:#0050d8;color:#f9f9f9}.usa-date-picker__calendar__year--selected:not([disabled]):hover{background-color:#0050d8;color:#e6e6e6}.usa-date-picker__calendar__year--selected:not([disabled]):focus{background-color:#0050d8;color:#f9f9f9}.usa-date-picker__calendar__year--selected:not([disabled]):active{background-color:#1a4480}.usa-time-picker{width:10em}.grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container{padding-left:2rem;padding-right:2rem}}.grid-container-card{margin-left:auto;margin-right:auto;max-width:10rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-card{padding-left:2rem;padding-right:2rem}}.grid-container-card-lg{margin-left:auto;margin-right:auto;max-width:15rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-card-lg{padding-left:2rem;padding-right:2rem}}.grid-container-mobile{margin-left:auto;margin-right:auto;max-width:20rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-mobile{padding-left:2rem;padding-right:2rem}}.grid-container-mobile-lg{margin-left:auto;margin-right:auto;max-width:30rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-mobile-lg{padding-left:2rem;padding-right:2rem}}.grid-container-tablet{margin-left:auto;margin-right:auto;max-width:40rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-tablet{padding-left:2rem;padding-right:2rem}}.grid-container-tablet-lg{margin-left:auto;margin-right:auto;max-width:55rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-tablet-lg{padding-left:2rem;padding-right:2rem}}.grid-container-desktop{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-desktop{padding-left:2rem;padding-right:2rem}}.grid-container-desktop-lg{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-desktop-lg{padding-left:2rem;padding-right:2rem}}.grid-container-widescreen{margin-left:auto;margin-right:auto;max-width:87.5rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.grid-container-widescreen{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-card{margin-left:auto;margin-right:auto;max-width:10rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-card{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-card-lg{margin-left:auto;margin-right:auto;max-width:15rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-card-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-mobile{margin-left:auto;margin-right:auto;max-width:20rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-mobile{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-mobile-lg{margin-left:auto;margin-right:auto;max-width:30rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-mobile-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-tablet{margin-left:auto;margin-right:auto;max-width:40rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-tablet{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-tablet-lg{margin-left:auto;margin-right:auto;max-width:55rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-tablet-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-desktop{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-desktop{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-desktop-lg{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-desktop-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.mobile-lg\:grid-container-widescreen{margin-left:auto;margin-right:auto;max-width:87.5rem;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.mobile-lg\:grid-container-widescreen{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-card{margin-left:auto;margin-right:auto;max-width:10rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-card{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-card-lg{margin-left:auto;margin-right:auto;max-width:15rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-card-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-mobile{margin-left:auto;margin-right:auto;max-width:20rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-mobile{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-mobile-lg{margin-left:auto;margin-right:auto;max-width:30rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-mobile-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-tablet{margin-left:auto;margin-right:auto;max-width:40rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-tablet{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-tablet-lg{margin-left:auto;margin-right:auto;max-width:55rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-tablet-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-desktop{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-desktop{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-desktop-lg{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-desktop-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.tablet\:grid-container-widescreen{margin-left:auto;margin-right:auto;max-width:87.5rem;padding-left:1rem;padding-right:1rem}}@media (min-width:40em)and (min-width:64em){.tablet\:grid-container-widescreen{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-card{margin-left:auto;margin-right:auto;max-width:10rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-card{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-card-lg{margin-left:auto;margin-right:auto;max-width:15rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-card-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-mobile{margin-left:auto;margin-right:auto;max-width:20rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-mobile{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-mobile-lg{margin-left:auto;margin-right:auto;max-width:30rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-mobile-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-tablet{margin-left:auto;margin-right:auto;max-width:40rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-tablet{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-tablet-lg{margin-left:auto;margin-right:auto;max-width:55rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-tablet-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-desktop{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-desktop{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-desktop-lg{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-desktop-lg{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.desktop\:grid-container-widescreen{margin-left:auto;margin-right:auto;max-width:87.5rem;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.desktop\:grid-container-widescreen{padding-left:2rem;padding-right:2rem}}.grid-row{display:flex;flex-wrap:wrap}.grid-row.grid-gap{margin-left:-.5rem;margin-right:-.5rem}.grid-row.grid-gap>*{padding-left:.5rem;padding-right:.5rem}@media (min-width:64em){.grid-row.grid-gap{margin-left:-1rem;margin-right:-1rem}.grid-row.grid-gap>*{padding-left:1rem;padding-right:1rem}}.grid-row.grid-gap-0{margin-left:0;margin-right:0}.grid-row.grid-gap-0>*{padding-left:0;padding-right:0}.grid-row.grid-gap-2px{margin-left:-1px;margin-right:-1px}.grid-row.grid-gap-2px>*{padding-left:1px;padding-right:1px}.grid-row.grid-gap-05{margin-left:-2px;margin-right:-2px}.grid-row.grid-gap-05>*{padding-left:2px;padding-right:2px}.grid-row.grid-gap-1{margin-left:-.25rem;margin-right:-.25rem}.grid-row.grid-gap-1>*{padding-left:.25rem;padding-right:.25rem}.grid-row.grid-gap-2{margin-left:-.5rem;margin-right:-.5rem}.grid-row.grid-gap-2>*{padding-left:.5rem;padding-right:.5rem}.grid-row.grid-gap-3{margin-left:-.75rem;margin-right:-.75rem}.grid-row.grid-gap-3>*{padding-left:.75rem;padding-right:.75rem}.grid-row.grid-gap-4{margin-left:-1rem;margin-right:-1rem}.grid-row.grid-gap-4>*{padding-left:1rem;padding-right:1rem}.grid-row.grid-gap-5{margin-left:-1.25rem;margin-right:-1.25rem}.grid-row.grid-gap-5>*{padding-left:1.25rem;padding-right:1.25rem}.grid-row.grid-gap-6{margin-left:-1.5rem;margin-right:-1.5rem}.grid-row.grid-gap-6>*{padding-left:1.5rem;padding-right:1.5rem}.grid-row.grid-gap-sm{margin-left:-1px;margin-right:-1px}.grid-row.grid-gap-sm>*{padding-left:1px;padding-right:1px}.grid-row.grid-gap-md{margin-left:-.5rem;margin-right:-.5rem}.grid-row.grid-gap-md>*{padding-left:.5rem;padding-right:.5rem}.grid-row.grid-gap-lg{margin-left:-.75rem;margin-right:-.75rem}.grid-row.grid-gap-lg>*{padding-left:.75rem;padding-right:.75rem}@media (min-width:30em){.grid-row.mobile-lg\:grid-gap-0{margin-left:0;margin-right:0}.grid-row.mobile-lg\:grid-gap-0>*{padding-left:0;padding-right:0}.grid-row.mobile-lg\:grid-gap-2px{margin-left:-1px;margin-right:-1px}.grid-row.mobile-lg\:grid-gap-2px>*{padding-left:1px;padding-right:1px}.grid-row.mobile-lg\:grid-gap-05{margin-left:-2px;margin-right:-2px}.grid-row.mobile-lg\:grid-gap-05>*{padding-left:2px;padding-right:2px}.grid-row.mobile-lg\:grid-gap-1{margin-left:-.25rem;margin-right:-.25rem}.grid-row.mobile-lg\:grid-gap-1>*{padding-left:.25rem;padding-right:.25rem}.grid-row.mobile-lg\:grid-gap-2{margin-left:-.5rem;margin-right:-.5rem}.grid-row.mobile-lg\:grid-gap-2>*{padding-left:.5rem;padding-right:.5rem}.grid-row.mobile-lg\:grid-gap-3{margin-left:-.75rem;margin-right:-.75rem}.grid-row.mobile-lg\:grid-gap-3>*{padding-left:.75rem;padding-right:.75rem}.grid-row.mobile-lg\:grid-gap-4{margin-left:-1rem;margin-right:-1rem}.grid-row.mobile-lg\:grid-gap-4>*{padding-left:1rem;padding-right:1rem}.grid-row.mobile-lg\:grid-gap-5{margin-left:-1.25rem;margin-right:-1.25rem}.grid-row.mobile-lg\:grid-gap-5>*{padding-left:1.25rem;padding-right:1.25rem}.grid-row.mobile-lg\:grid-gap-6{margin-left:-1.5rem;margin-right:-1.5rem}.grid-row.mobile-lg\:grid-gap-6>*{padding-left:1.5rem;padding-right:1.5rem}.grid-row.mobile-lg\:grid-gap-sm{margin-left:-1px;margin-right:-1px}.grid-row.mobile-lg\:grid-gap-sm>*{padding-left:1px;padding-right:1px}.grid-row.mobile-lg\:grid-gap-md{margin-left:-.5rem;margin-right:-.5rem}.grid-row.mobile-lg\:grid-gap-md>*{padding-left:.5rem;padding-right:.5rem}.grid-row.mobile-lg\:grid-gap-lg{margin-left:-.75rem;margin-right:-.75rem}.grid-row.mobile-lg\:grid-gap-lg>*{padding-left:.75rem;padding-right:.75rem}}@media (min-width:40em){.grid-row.tablet\:grid-gap-0{margin-left:0;margin-right:0}.grid-row.tablet\:grid-gap-0>*{padding-left:0;padding-right:0}.grid-row.tablet\:grid-gap-2px{margin-left:-1px;margin-right:-1px}.grid-row.tablet\:grid-gap-2px>*{padding-left:1px;padding-right:1px}.grid-row.tablet\:grid-gap-05{margin-left:-2px;margin-right:-2px}.grid-row.tablet\:grid-gap-05>*{padding-left:2px;padding-right:2px}.grid-row.tablet\:grid-gap-1{margin-left:-.25rem;margin-right:-.25rem}.grid-row.tablet\:grid-gap-1>*{padding-left:.25rem;padding-right:.25rem}.grid-row.tablet\:grid-gap-2{margin-left:-.5rem;margin-right:-.5rem}.grid-row.tablet\:grid-gap-2>*{padding-left:.5rem;padding-right:.5rem}.grid-row.tablet\:grid-gap-3{margin-left:-.75rem;margin-right:-.75rem}.grid-row.tablet\:grid-gap-3>*{padding-left:.75rem;padding-right:.75rem}.grid-row.tablet\:grid-gap-4{margin-left:-1rem;margin-right:-1rem}.grid-row.tablet\:grid-gap-4>*{padding-left:1rem;padding-right:1rem}.grid-row.tablet\:grid-gap-5{margin-left:-1.25rem;margin-right:-1.25rem}.grid-row.tablet\:grid-gap-5>*{padding-left:1.25rem;padding-right:1.25rem}.grid-row.tablet\:grid-gap-6{margin-left:-1.5rem;margin-right:-1.5rem}.grid-row.tablet\:grid-gap-6>*{padding-left:1.5rem;padding-right:1.5rem}.grid-row.tablet\:grid-gap-sm{margin-left:-1px;margin-right:-1px}.grid-row.tablet\:grid-gap-sm>*{padding-left:1px;padding-right:1px}.grid-row.tablet\:grid-gap-md{margin-left:-.5rem;margin-right:-.5rem}.grid-row.tablet\:grid-gap-md>*{padding-left:.5rem;padding-right:.5rem}.grid-row.tablet\:grid-gap-lg{margin-left:-.75rem;margin-right:-.75rem}.grid-row.tablet\:grid-gap-lg>*{padding-left:.75rem;padding-right:.75rem}}@media (min-width:64em){.grid-row.desktop\:grid-gap-0{margin-left:0;margin-right:0}.grid-row.desktop\:grid-gap-0>*{padding-left:0;padding-right:0}.grid-row.desktop\:grid-gap-2px{margin-left:-1px;margin-right:-1px}.grid-row.desktop\:grid-gap-2px>*{padding-left:1px;padding-right:1px}.grid-row.desktop\:grid-gap-05{margin-left:-2px;margin-right:-2px}.grid-row.desktop\:grid-gap-05>*{padding-left:2px;padding-right:2px}.grid-row.desktop\:grid-gap-1{margin-left:-.25rem;margin-right:-.25rem}.grid-row.desktop\:grid-gap-1>*{padding-left:.25rem;padding-right:.25rem}.grid-row.desktop\:grid-gap-2{margin-left:-.5rem;margin-right:-.5rem}.grid-row.desktop\:grid-gap-2>*{padding-left:.5rem;padding-right:.5rem}.grid-row.desktop\:grid-gap-3{margin-left:-.75rem;margin-right:-.75rem}.grid-row.desktop\:grid-gap-3>*{padding-left:.75rem;padding-right:.75rem}.grid-row.desktop\:grid-gap-4{margin-left:-1rem;margin-right:-1rem}.grid-row.desktop\:grid-gap-4>*{padding-left:1rem;padding-right:1rem}.grid-row.desktop\:grid-gap-5{margin-left:-1.25rem;margin-right:-1.25rem}.grid-row.desktop\:grid-gap-5>*{padding-left:1.25rem;padding-right:1.25rem}.grid-row.desktop\:grid-gap-6{margin-left:-1.5rem;margin-right:-1.5rem}.grid-row.desktop\:grid-gap-6>*{padding-left:1.5rem;padding-right:1.5rem}.grid-row.desktop\:grid-gap-sm{margin-left:-1px;margin-right:-1px}.grid-row.desktop\:grid-gap-sm>*{padding-left:1px;padding-right:1px}.grid-row.desktop\:grid-gap-md{margin-left:-.5rem;margin-right:-.5rem}.grid-row.desktop\:grid-gap-md>*{padding-left:.5rem;padding-right:.5rem}.grid-row.desktop\:grid-gap-lg{margin-left:-.75rem;margin-right:-.75rem}.grid-row.desktop\:grid-gap-lg>*{padding-left:.75rem;padding-right:.75rem}}[class*=grid-col]{box-sizing:border-box;position:relative;width:100%}.grid-col{flex:1 1;min-width:1px}.grid-col,.grid-col-auto{max-width:100%;width:auto}.grid-col-auto{flex:0 1 auto}.grid-col-fill{flex:1 1;max-width:100%;min-width:1px;width:auto}.grid-col-1{flex:0 1 auto;width:8.3333333333%}.grid-col-2{flex:0 1 auto;width:16.6666666667%}.grid-col-3{flex:0 1 auto;width:25%}.grid-col-4{flex:0 1 auto;width:33.3333333333%}.grid-col-5{flex:0 1 auto;width:41.6666666667%}.grid-col-6{flex:0 1 auto;width:50%}.grid-col-7{flex:0 1 auto;width:58.3333333333%}.grid-col-8{flex:0 1 auto;width:66.6666666667%}.grid-col-9{flex:0 1 auto;width:75%}.grid-col-10{flex:0 1 auto;width:83.3333333333%}.grid-col-11{flex:0 1 auto;width:91.6666666667%}.grid-col-12{flex:0 1 auto;width:100%}@media (min-width:30em){.mobile-lg\:grid-col,.mobile-lg\:grid-col-fill{flex:1 1;max-width:100%;min-width:1px;width:auto}.mobile-lg\:grid-col-auto{flex:0 1 auto;max-width:100%;width:auto}.mobile-lg\:grid-col-1{flex:0 1 auto;width:8.3333333333%}.mobile-lg\:grid-col-2{flex:0 1 auto;width:16.6666666667%}.mobile-lg\:grid-col-3{flex:0 1 auto;width:25%}.mobile-lg\:grid-col-4{flex:0 1 auto;width:33.3333333333%}.mobile-lg\:grid-col-5{flex:0 1 auto;width:41.6666666667%}.mobile-lg\:grid-col-6{flex:0 1 auto;width:50%}.mobile-lg\:grid-col-7{flex:0 1 auto;width:58.3333333333%}.mobile-lg\:grid-col-8{flex:0 1 auto;width:66.6666666667%}.mobile-lg\:grid-col-9{flex:0 1 auto;width:75%}.mobile-lg\:grid-col-10{flex:0 1 auto;width:83.3333333333%}.mobile-lg\:grid-col-11{flex:0 1 auto;width:91.6666666667%}.mobile-lg\:grid-col-12{flex:0 1 auto;width:100%}}@media (min-width:40em){.tablet\:grid-col,.tablet\:grid-col-fill{flex:1 1;max-width:100%;min-width:1px;width:auto}.tablet\:grid-col-auto{flex:0 1 auto;max-width:100%;width:auto}.tablet\:grid-col-1{flex:0 1 auto;width:8.3333333333%}.tablet\:grid-col-2{flex:0 1 auto;width:16.6666666667%}.tablet\:grid-col-3{flex:0 1 auto;width:25%}.tablet\:grid-col-4{flex:0 1 auto;width:33.3333333333%}.tablet\:grid-col-5{flex:0 1 auto;width:41.6666666667%}.tablet\:grid-col-6{flex:0 1 auto;width:50%}.tablet\:grid-col-7{flex:0 1 auto;width:58.3333333333%}.tablet\:grid-col-8{flex:0 1 auto;width:66.6666666667%}.tablet\:grid-col-9{flex:0 1 auto;width:75%}.tablet\:grid-col-10{flex:0 1 auto;width:83.3333333333%}.tablet\:grid-col-11{flex:0 1 auto;width:91.6666666667%}.tablet\:grid-col-12{flex:0 1 auto;width:100%}}@media (min-width:64em){.desktop\:grid-col,.desktop\:grid-col-fill{flex:1 1;max-width:100%;min-width:1px;width:auto}.desktop\:grid-col-auto{flex:0 1 auto;max-width:100%;width:auto}.desktop\:grid-col-1{flex:0 1 auto;width:8.3333333333%}.desktop\:grid-col-2{flex:0 1 auto;width:16.6666666667%}.desktop\:grid-col-3{flex:0 1 auto;width:25%}.desktop\:grid-col-4{flex:0 1 auto;width:33.3333333333%}.desktop\:grid-col-5{flex:0 1 auto;width:41.6666666667%}.desktop\:grid-col-6{flex:0 1 auto;width:50%}.desktop\:grid-col-7{flex:0 1 auto;width:58.3333333333%}.desktop\:grid-col-8{flex:0 1 auto;width:66.6666666667%}.desktop\:grid-col-9{flex:0 1 auto;width:75%}.desktop\:grid-col-10{flex:0 1 auto;width:83.3333333333%}.desktop\:grid-col-11{flex:0 1 auto;width:91.6666666667%}.desktop\:grid-col-12{flex:0 1 auto;width:100%}}.grid-offset-1{margin-left:8.3333333333%}.grid-offset-2{margin-left:16.6666666667%}.grid-offset-3{margin-left:25%}.grid-offset-4{margin-left:33.3333333333%}.grid-offset-5{margin-left:41.6666666667%}.grid-offset-6{margin-left:50%}.grid-offset-7{margin-left:58.3333333333%}.grid-offset-8{margin-left:66.6666666667%}.grid-offset-9{margin-left:75%}.grid-offset-10{margin-left:83.3333333333%}.grid-offset-11{margin-left:91.6666666667%}.grid-offset-12{margin-left:100%}.grid-offset-none{margin-left:0}@media (min-width:30em){.mobile-lg\:grid-offset-1{margin-left:8.3333333333%}.mobile-lg\:grid-offset-2{margin-left:16.6666666667%}.mobile-lg\:grid-offset-3{margin-left:25%}.mobile-lg\:grid-offset-4{margin-left:33.3333333333%}.mobile-lg\:grid-offset-5{margin-left:41.6666666667%}.mobile-lg\:grid-offset-6{margin-left:50%}.mobile-lg\:grid-offset-7{margin-left:58.3333333333%}.mobile-lg\:grid-offset-8{margin-left:66.6666666667%}.mobile-lg\:grid-offset-9{margin-left:75%}.mobile-lg\:grid-offset-10{margin-left:83.3333333333%}.mobile-lg\:grid-offset-11{margin-left:91.6666666667%}.mobile-lg\:grid-offset-12{margin-left:100%}.mobile-lg\:grid-offset-none{margin-left:0}}@media (min-width:40em){.tablet\:grid-offset-1{margin-left:8.3333333333%}.tablet\:grid-offset-2{margin-left:16.6666666667%}.tablet\:grid-offset-3{margin-left:25%}.tablet\:grid-offset-4{margin-left:33.3333333333%}.tablet\:grid-offset-5{margin-left:41.6666666667%}.tablet\:grid-offset-6{margin-left:50%}.tablet\:grid-offset-7{margin-left:58.3333333333%}.tablet\:grid-offset-8{margin-left:66.6666666667%}.tablet\:grid-offset-9{margin-left:75%}.tablet\:grid-offset-10{margin-left:83.3333333333%}.tablet\:grid-offset-11{margin-left:91.6666666667%}.tablet\:grid-offset-12{margin-left:100%}.tablet\:grid-offset-none{margin-left:0}}@media (min-width:64em){.desktop\:grid-offset-1{margin-left:8.3333333333%}.desktop\:grid-offset-2{margin-left:16.6666666667%}.desktop\:grid-offset-3{margin-left:25%}.desktop\:grid-offset-4{margin-left:33.3333333333%}.desktop\:grid-offset-5{margin-left:41.6666666667%}.desktop\:grid-offset-6{margin-left:50%}.desktop\:grid-offset-7{margin-left:58.3333333333%}.desktop\:grid-offset-8{margin-left:66.6666666667%}.desktop\:grid-offset-9{margin-left:75%}.desktop\:grid-offset-10{margin-left:83.3333333333%}.desktop\:grid-offset-11{margin-left:91.6666666667%}.desktop\:grid-offset-12{margin-left:100%}.desktop\:grid-offset-none{margin-left:0}}@media (max-width:29.99em){.usa-table--stacked thead{display:none}.usa-table--stacked td,.usa-table--stacked th{border-bottom-width:0;display:block;width:100%}.usa-table--stacked tr{border-bottom:.25rem solid #1b1b1b;border-top-width:0;display:block;width:100%}.usa-table--stacked tr td:first-child,.usa-table--stacked tr th:first-child{border-top-width:0}.usa-table--stacked tr:nth-child(odd) td,.usa-table--stacked tr:nth-child(odd) th{background-color:inherit}.usa-table--stacked tr:first-child td:first-child,.usa-table--stacked tr:first-child th:first-child{border-top:.25rem solid #1b1b1b}.usa-table--stacked td[data-label],.usa-table--stacked th[data-label]{padding-bottom:.75rem}.usa-table--stacked td[data-label]:before,.usa-table--stacked th[data-label]:before{content:attr(data-label);display:block;font-weight:700;margin:-.5rem -1rem 0;padding:.75rem 1rem .25rem}.usa-table--stacked-header thead{display:none}.usa-table--stacked-header td,.usa-table--stacked-header th{border-bottom-width:0;display:block;width:100%}.usa-table--stacked-header tr{border-bottom:.25rem solid #1b1b1b;border-top-width:0;display:block;width:100%}.usa-table--stacked-header tr td:first-child,.usa-table--stacked-header tr th:first-child{border-top-width:0}.usa-table--stacked-header tr:nth-child(odd) td,.usa-table--stacked-header tr:nth-child(odd) th{background-color:inherit}.usa-table--stacked-header tr:first-child td:first-child,.usa-table--stacked-header tr:first-child th:first-child{border-top:.25rem solid #1b1b1b}.usa-table--stacked-header td[data-label],.usa-table--stacked-header th[data-label]{padding-bottom:.75rem}.usa-table--stacked-header td[data-label]:before,.usa-table--stacked-header th[data-label]:before{content:attr(data-label);display:block;font-weight:700;margin:-.5rem -1rem 0;padding:.75rem 1rem .25rem}.usa-table--stacked-header tr td:first-child,.usa-table--stacked-header tr th:first-child{background-color:#dfe1e2;color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;font-weight:700;line-height:1.1;padding:.75rem 1rem}.usa-table--stacked-header tr td:first-child:before,.usa-table--stacked-header tr th:first-child:before{display:none}}.usa-tag{background-color:#565c65;border-radius:2px;color:#fff;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:.93rem;margin-right:.25rem;padding:1px .5rem;text-transform:uppercase}.usa-tag:only-of-type{margin-right:0}.usa-tag--big{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;padding-left:.5rem;padding-right:.5rem}.usa-paragraph{line-height:1.5;margin-bottom:0;margin-top:0;max-width:68ex}*+.usa-paragraph,.usa-paragraph+*{margin-top:1em}.usa-content ol:not(.usa-accordion):not(.usa-accordion--bordered),.usa-content p,.usa-content ul:not(.usa-accordion):not(.usa-accordion--bordered){max-width:68ex}.usa-display{clear:both;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:700;line-height:1.1;margin-bottom:0;margin-top:0}*+.usa-display{margin-top:1.5em}.usa-display+*{margin-top:1em}@media (min-width:30em){.usa-display{clear:both;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:2.66rem;font-weight:700;line-height:1.1;margin-bottom:0;margin-top:0}*+.usa-display{margin-top:1.5em}.usa-display+*{margin-top:1em}}@media (min-width:40em){.usa-display{clear:both;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:3.19rem;font-weight:700;line-height:1.1;margin-bottom:0;margin-top:0}*+.usa-display{margin-top:1.5em}.usa-display+*{margin-top:1em}}.usa-intro{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:400;line-height:1.6;max-width:88ex}.usa-dark-background{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#3d4551}.usa-dark-background p,.usa-dark-background span{color:#fff}.usa-dark-background a,.usa-dark-background a:visited{color:#dfe1e2}.usa-dark-background a:hover{color:#f0f0f0}.usa-prose>p{line-height:1.5;margin-bottom:0;margin-top:0;max-width:68ex}.usa-prose>*+p,.usa-prose>p+*{margin-top:1em}.usa-prose>h1,.usa-prose>h2,.usa-prose>h3,.usa-prose>h4,.usa-prose>h5,.usa-prose>h6{clear:both;margin-bottom:0;margin-top:0}.usa-prose>*+h1,.usa-prose>*+h2,.usa-prose>*+h3,.usa-prose>*+h4,.usa-prose>*+h5,.usa-prose>*+h6{margin-top:1.5em}.usa-prose>h1+*,.usa-prose>h2+*,.usa-prose>h3+*,.usa-prose>h4+*,.usa-prose>h5+*,.usa-prose>h6+*{margin-top:1em}.usa-link{color:#005ea2;text-decoration:underline}.usa-link:visited{color:#54278f}.usa-link:hover{color:#1a4480}.usa-link:active{color:#162e51}.usa-link:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-link--external:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiMwMDVlYTIiIGQ9Ik0xOSAxOUg1VjVoN1YzSDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIvPjwvc3ZnPg==);background-position:50% 60%;background-repeat:no-repeat;background-size:100%;content:"";display:inline;margin-left:2px;padding-left:.65em}.usa-link--external:hover:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiMwYjQ3NzgiIGQ9Ik0xOSAxOUg1VjVoN1YzSDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-link--external.usa-link--alt:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmMGYwZjAiIGQ9Ik0xOSAxOUg1VjVoN1YzSDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIvPjwvc3ZnPg==);background-position:50% 60%;background-repeat:no-repeat;background-size:100%;content:"";display:inline;margin-left:2px;padding-left:.65em}.usa-link--external.usa-link--alt:hover:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xOSAxOUg1VjVoN1YzSDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-list--unstyled{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-list--unstyled>li{margin-bottom:0;max-width:unset}.usa-prose .usa-list--unstyled{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-prose .usa-list--unstyled>li{margin-bottom:0;max-width:unset}.usa-prose{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5}.usa-prose>a{color:#005ea2;text-decoration:underline}.usa-prose>a:visited{color:#54278f}.usa-prose>a:hover{color:#1a4480}.usa-prose>a:active{color:#162e51}.usa-prose>a:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-prose>h1{font-size:2.66rem}.usa-prose>h1,.usa-prose>h2{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:700;line-height:1.1}.usa-prose>h2{font-size:2.13rem}.usa-prose>h3{font-size:1.46rem}.usa-prose>h3,.usa-prose>h4{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:700;line-height:1.1}.usa-prose>h4{font-size:1.06rem}.usa-prose>h5{font-size:1rem;font-weight:700}.usa-prose>h5,.usa-prose>h6{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;line-height:1.1}.usa-prose>h6{font-size:.87rem;font-weight:400;letter-spacing:.025em;text-transform:uppercase}@media (max-width:29.99em){.usa-prose>.usa-table--stacked thead{display:none}.usa-prose>.usa-table--stacked td,.usa-prose>.usa-table--stacked th{border-bottom-width:0;display:block;width:100%}.usa-prose>.usa-table--stacked tr{border-bottom:.25rem solid #1b1b1b;border-top-width:0;display:block;width:100%}.usa-prose>.usa-table--stacked tr td:first-child,.usa-prose>.usa-table--stacked tr th:first-child{border-top-width:0}.usa-prose>.usa-table--stacked tr:nth-child(odd) td,.usa-prose>.usa-table--stacked tr:nth-child(odd) th{background-color:inherit}.usa-prose>.usa-table--stacked tr:first-child td:first-child,.usa-prose>.usa-table--stacked tr:first-child th:first-child{border-top:.25rem solid #1b1b1b}.usa-prose>.usa-table--stacked td[data-label],.usa-prose>.usa-table--stacked th[data-label]{padding-bottom:.75rem}.usa-prose>.usa-table--stacked td[data-label]:before,.usa-prose>.usa-table--stacked th[data-label]:before{content:attr(data-label);display:block;font-weight:700;margin:-.5rem -1rem 0;padding:.75rem 1rem .25rem}.usa-prose>.usa-table--stacked-header thead{display:none}.usa-prose>.usa-table--stacked-header td,.usa-prose>.usa-table--stacked-header th{border-bottom-width:0;display:block;width:100%}.usa-prose>.usa-table--stacked-header tr{border-bottom:.25rem solid #1b1b1b;border-top-width:0;display:block;width:100%}.usa-prose>.usa-table--stacked-header tr td:first-child,.usa-prose>.usa-table--stacked-header tr th:first-child{border-top-width:0}.usa-prose>.usa-table--stacked-header tr:nth-child(odd) td,.usa-prose>.usa-table--stacked-header tr:nth-child(odd) th{background-color:inherit}.usa-prose>.usa-table--stacked-header tr:first-child td:first-child,.usa-prose>.usa-table--stacked-header tr:first-child th:first-child{border-top:.25rem solid #1b1b1b}.usa-prose>.usa-table--stacked-header td[data-label],.usa-prose>.usa-table--stacked-header th[data-label]{padding-bottom:.75rem}.usa-prose>.usa-table--stacked-header td[data-label]:before,.usa-prose>.usa-table--stacked-header th[data-label]:before{content:attr(data-label);display:block;font-weight:700;margin:-.5rem -1rem 0;padding:.75rem 1rem .25rem}.usa-prose>.usa-table--stacked-header tr td:first-child,.usa-prose>.usa-table--stacked-header tr th:first-child{background-color:#dfe1e2;color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;font-weight:700;line-height:1.1;padding:.75rem 1rem}.usa-prose>.usa-table--stacked-header tr td:first-child:before,.usa-prose>.usa-table--stacked-header tr th:first-child:before{display:none}}.usa-accordion{color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;list-style-type:none;margin:0;padding:0;width:100%}.usa-accordion>li{margin-bottom:0;max-width:unset}.usa-accordion>ul li ul{list-style:disc}.usa-accordion>ul li ul>li>ul{list-style:circle}.usa-accordion>ul li ul>li>ul>li>ul{list-style:square}.usa-accordion+.usa-accordion,.usa-accordion+.usa-accordion--bordered{margin-top:.5rem}.usa-accordion--bordered .usa-accordion__content{border-bottom:.25rem solid #f0f0f0;border-left:.25rem solid #f0f0f0;border-right:.25rem solid #f0f0f0;padding-bottom:1rem}.usa-accordion--bordered .usa-accordion__heading{margin-bottom:0}.usa-accordion__heading,.usa-prose .usa-accordion__heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:.9;margin:0}.usa-accordion__heading:not(:first-child),.usa-prose .usa-accordion__heading:not(:first-child){margin-top:.5rem}.usa-accordion__content{background-color:#fff;margin-top:0;overflow:auto;padding:1rem 1.25rem .75rem}.usa-accordion__content>:first-child{margin-top:0}.usa-accordion__content>:last-child{margin-bottom:0}.usa-accordion__button{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;background-color:#f0f0f0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSAxM0g1di0yaDE0djJ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-position:right 1.25rem center;background-repeat:no-repeat;background-size:1.5rem;border:0;border-radius:0;box-shadow:none;color:#005ea2;color:#1b1b1b;cursor:pointer;display:inline-block;font-weight:400;font-weight:700;margin:0;padding:1rem 3.5rem 1rem 1.25rem;text-align:left;text-decoration:underline;text-decoration:none;width:100%}.usa-accordion__button:visited{color:#54278f}.usa-accordion__button:hover{color:#1a4480}.usa-accordion__button:active{color:#162e51}.usa-accordion__button:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-accordion__button:active,.usa-accordion__button:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}.usa-accordion__button:hover{background-color:#dfe1e2;color:#1b1b1b;text-decoration:none}.usa-accordion__button[aria-expanded=false]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat;background-size:1.5rem}.usa-alert{background-color:#f0f0f0;background-position:1.75rem .75rem;background-repeat:no-repeat;background-size:2.5rem;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;padding:1.25rem 1.25rem 1rem 1.75rem;position:relative}*+.usa-alert{margin-top:1rem}.usa-alert:before{background-color:#a9aeb1;content:"";height:100%;left:0;position:absolute;top:0;width:.5rem}.usa-alert .usa-alert__body>.usa-list,.usa-alert>.usa-list{padding-left:0}.usa-alert .usa-alert__body>.usa-list:last-child,.usa-alert>.usa-list:last-child{margin-bottom:0}.usa-alert__icon{display:table-cell;padding-right:.5rem}.usa-alert__body{display:table-cell;vertical-align:top}.usa-alert__heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;line-height:.9;margin-bottom:.5rem;margin-top:0}.usa-alert__text{margin-bottom:0;margin-top:0}.usa-alert__text a{color:#005ea2;text-decoration:underline}.usa-alert__text a:visited{color:#54278f}.usa-alert__text a:hover{color:#1a4480}.usa-alert__text a:active{color:#162e51}.usa-alert__text a:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-alert__text:only-child{margin-bottom:.5rem;padding-top:.25rem}.usa-alert--success{background-color:#ecf3ec;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNS01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat;color:#1b1b1b}.usa-alert--success:before{background-color:#00a91c}.usa-alert--success .usa-alert__body{padding-left:3.75rem}.usa-alert--success .usa-link{color:#005ea2}.usa-alert--success .usa-link:visited{color:#54278f}.usa-alert--success .usa-link:active,.usa-alert--success .usa-link:hover{color:#1a4480}.usa-alert--success.usa-alert--no-icon{background-image:none}.usa-alert--success.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-alert--warning{background-color:#faf3d1;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat;color:#1b1b1b}.usa-alert--warning:before{background-color:#ffbe2e}.usa-alert--warning .usa-alert__body{padding-left:3.75rem}.usa-alert--warning .usa-link{color:#005ea2}.usa-alert--warning .usa-link:visited{color:#54278f}.usa-alert--warning .usa-link:active,.usa-alert--warning .usa-link:hover{color:#1a4480}.usa-alert--warning.usa-alert--no-icon{background-image:none}.usa-alert--warning.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-alert--error{background-color:#f4e3db;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat;color:#1b1b1b}.usa-alert--error:before{background-color:#d54309}.usa-alert--error .usa-alert__body{padding-left:3.75rem}.usa-alert--error .usa-link{color:#005ea2}.usa-alert--error .usa-link:visited{color:#54278f}.usa-alert--error .usa-link:active,.usa-alert--error .usa-link:hover{color:#1a4480}.usa-alert--error.usa-alert--no-icon{background-image:none}.usa-alert--error.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-alert--info{background-color:#e7f6f8;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat;color:#1b1b1b}.usa-alert--info:before{background-color:#00bde3}.usa-alert--info .usa-alert__body{padding-left:3.75rem}.usa-alert--info .usa-link{color:#005ea2}.usa-alert--info .usa-link:visited{color:#54278f}.usa-alert--info .usa-link:active,.usa-alert--info .usa-link:hover{color:#1a4480}.usa-alert--info.usa-alert--no-icon{background-image:none}.usa-alert--info.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-alert--emergency{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat;color:#fff}.usa-alert--emergency,.usa-alert--emergency:before{background-color:#9c3d10}.usa-alert--emergency .usa-alert__body{padding-left:3.75rem}.usa-alert--emergency .usa-link,.usa-alert--emergency .usa-link:visited{color:#dfe1e2}.usa-alert--emergency .usa-link:active,.usa-alert--emergency .usa-link:hover{color:#f0f0f0}.usa-alert--emergency.usa-alert--no-icon{background-image:none}.usa-alert--emergency.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-alert--slim{background-position:1.75rem .75rem;background-size:1.5rem;padding-bottom:.5rem;padding-top:.5rem}.usa-alert--slim .usa-alert__body{padding-left:2rem}.usa-alert--slim .usa-alert__text:only-child{margin-bottom:.25rem;padding-top:.25rem}.usa-alert--no-heading{background-position:1.75rem 1rem}.usa-alert--validation{background-position:1.75rem calc(1.25rem - 2px);background-size:1.5rem}.usa-alert--validation .usa-alert__body{padding-left:2.5rem}.usa-alert--validation .usa-checklist{margin-top:1rem}.usa-identifier{background-color:#1b1b1b;color:#fff;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3;padding-bottom:1rem}.usa-identifier__container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.usa-identifier__container{padding-left:2rem;padding-right:2rem}}.usa-identifier__section{padding-bottom:1rem;padding-top:1rem}@media (min-width:40em){.usa-identifier__section--masthead .usa-identifier__container{align-items:center;display:flex}}.usa-identifier__logos{display:flex;margin-right:1rem}.usa-identifier__logo{display:block;height:3rem;text-decoration:none}.usa-identifier__logo+.usa-identifier__logo{margin-left:.5rem}.usa-identifier__logo-img{height:100%;width:auto}.usa-identifier__identity{flex:1 1;margin-top:1rem}@media (min-width:40em){.usa-identifier__identity{margin-top:0}}.usa-identifier__identity-disclaimer,.usa-identifier__identity-domain{margin:0;padding:0}.usa-identifier__identity-domain{color:#a9aeb1}.usa-identifier__identity-disclaimer{font-weight:700}.usa-identifier__identity-disclaimer a,.usa-identifier__identity-disclaimer a:visited{color:#dfe1e2}.usa-identifier__identity-disclaimer a:active,.usa-identifier__identity-disclaimer a:hover{color:#f0f0f0}@media (min-width:40em){.usa-identifier__section--required-links{padding-bottom:.5rem;padding-top:.5rem}}@media (min-width:64em){.usa-identifier__section--required-links{font-size:1rem}}.usa-identifier__required-links-list{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}@media (min-width:40em){.usa-identifier__required-links-list{-webkit-column-count:2;column-count:2;-webkit-column-fill:balance;column-fill:balance;-webkit-column-gap:2rem;column-gap:2rem}}@media (min-width:64em){.usa-identifier__required-links-list{-webkit-column-count:4;column-count:4}}.usa-identifier__required-links-item{-webkit-column-break-inside:avoid;break-inside:avoid;margin-bottom:.75rem}.usa-identifier__required-links-item:last-child{margin-bottom:0}@media (min-width:64em){.usa-identifier__required-links-item{margin-bottom:.5rem}}.usa-identifier__required-link{color:#a9aeb1;display:inline-block}.usa-identifier__required-link:visited{color:#a9aeb1}.usa-identifier__required-link:active,.usa-identifier__required-link:hover{color:#dfe1e2}.usa-identifier__section--usagov a{color:#dfe1e2;display:inline-block;font-weight:700;margin-top:.5rem}.usa-identifier__section--usagov a:visited{color:#dfe1e2}.usa-identifier__section--usagov a:active,.usa-identifier__section--usagov a:hover{color:#f0f0f0}@media (min-width:40em){.usa-identifier__section--usagov a{margin-top:0}.usa-identifier__usagov-description{display:inline-flex}}.usa-banner{background-color:#f0f0f0;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5}@media (min-width:40em){.usa-banner{font-size:.87rem;padding-bottom:0}}.usa-banner .usa-accordion{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5}.usa-banner__content,.usa-banner__header{color:#1b1b1b}.usa-banner__content{background-color:transparent;font-size:1rem;margin-left:auto;margin-right:auto;max-width:64rem;overflow:hidden;padding:.25rem 1rem 1rem .5rem;width:100%}@media (min-width:64em){.usa-banner__content{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.usa-banner__content{padding-bottom:1.5rem;padding-top:1.5rem}}.usa-banner__content p:first-child{margin:0}.usa-banner__guidance{align-items:flex-start;display:flex;max-width:64ex;padding-top:1rem}@media (min-width:40em){.usa-banner__guidance{padding-top:0}}.usa-banner__lock-image{height:1.5ex;width:1.21875ex}.usa-banner__lock-image path{fill:currentColor}.usa-banner__inner{align-items:flex-start;display:flex;flex-wrap:wrap;margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:0}@media (min-width:64em){.usa-banner__inner{padding-left:2rem;padding-right:2rem}}@media (min-width:40em){.usa-banner__inner{align-items:center}}.usa-banner__header{font-size:.8rem;font-weight:400;min-height:3rem;padding-bottom:.5rem;padding-top:.5rem;position:relative}@media (min-width:40em){.usa-banner__header{min-height:0;padding-bottom:.25rem;padding-top:.25rem}}.usa-banner__header-text{font-size:.8rem;line-height:1.1;margin-bottom:0;margin-top:0}.usa-banner__header-action{color:#005ea2;line-height:1.1;margin-bottom:0;margin-top:2px;text-decoration:underline}.usa-banner__header-action:after{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat 50%/1.3128205128ex .8ex;content:"";display:inline-block;height:.8ex;margin-left:2px;vertical-align:middle;width:1.3128205128ex}@supports((-webkit-mask:url("")) or (mask:url(""))){.usa-banner__header-action:after{background:none;background-color:#005ea2;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat center/1.3128205128ex .8ex;mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat center/1.3128205128ex .8ex}.usa-banner__header-action:after:hover{background-color:#1a4480}}.usa-banner__header-action:hover:after{background-color:#1a4480;content:""}.usa-banner__header-action:visited{color:#54278f}.usa-banner__header-action:active,.usa-banner__header-action:hover{color:#1a4480}@media (min-width:40em){.usa-banner__header-action{display:none}}.usa-banner__header-flag{float:left;margin-right:.5rem;width:1rem}@media (min-width:40em){.usa-banner__header-flag{margin-right:.5rem;padding-top:0}}.usa-banner__header--expanded{padding-right:3.5rem}@media (min-width:40em){.usa-banner__header--expanded{background-color:transparent;display:block;font-size:.8rem;font-weight:400;min-height:0;padding-right:0}}.usa-banner__header--expanded .usa-banner__inner{margin-left:0}@media (min-width:40em){.usa-banner__header--expanded .usa-banner__inner{margin-left:auto}}.usa-banner__header--expanded .usa-banner__header-action{display:none}.usa-banner__button{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;border:0;border-radius:0;bottom:0;box-shadow:none;color:#005ea2;display:block;font-size:.8rem;font-weight:400;height:auto;left:0;line-height:1.1;margin:0;padding:0;position:absolute;text-align:left;text-decoration:underline;text-decoration:none;top:0;vertical-align:baseline;width:auto}.usa-banner__button:hover{color:#1a4480}.usa-banner__button:active{color:#162e51}.usa-banner__button:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-banner__button:active,.usa-banner__button:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}.usa-banner__button:visited{color:#54278f}.usa-banner__button:active,.usa-banner__button:hover{color:#1a4480}@media (max-width:39.99em){.usa-banner__button{width:100%}}@media (min-width:40em){.usa-banner__button{bottom:auto;color:#005ea2;display:inline;left:auto;margin-left:.5rem;position:static;position:relative;right:auto;top:auto}.usa-banner__button:after{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat 50%/1.3128205128ex .8ex;content:"";display:inline-block;height:.8ex;margin-left:2px;vertical-align:middle;width:1.3128205128ex}@supports((-webkit-mask:url("")) or (mask:url(""))){.usa-banner__button:after{background:none;background-color:#005ea2;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat center/1.3128205128ex .8ex;mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat center/1.3128205128ex .8ex}.usa-banner__button:after:hover{background-color:#1a4480}}.usa-banner__button:hover:after{background-color:#1a4480;content:""}.usa-banner__button:visited{color:#54278f}.usa-banner__button:active,.usa-banner__button:hover{color:#1a4480}.usa-banner__button:hover{text-decoration:none}}.usa-banner__button[aria-expanded=false],.usa-banner__button[aria-expanded=true]{background-image:none}@media (max-width:39.99em){.usa-banner__button[aria-expanded=true]:after{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSA2LjQxIDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+) no-repeat 50%/1.5rem 1.5rem;content:"";display:inline-block;height:3rem;margin-left:0;vertical-align:middle;width:3rem}@supports((-webkit-mask:url("")) or (mask:url(""))){.usa-banner__button[aria-expanded=true]:after{background:none;background-color:#005ea2;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSA2LjQxIDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+) no-repeat center/1.5rem 1.5rem;mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSA2LjQxIDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+) no-repeat center/1.5rem 1.5rem}}.usa-banner__button[aria-expanded=true]:before{background-color:#dfe1e2;bottom:0;content:"";display:block;height:3rem;position:absolute;right:0;top:0;width:3rem}.usa-banner__button[aria-expanded=true]:after{bottom:0;position:absolute;right:0;top:0}}@media (min-width:40em){.usa-banner__button[aria-expanded=true]{height:auto;padding:0;position:relative}.usa-banner__button[aria-expanded=true]:after{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat 50%/1.3128205128ex .8ex;content:"";display:inline-block;height:.8ex;margin-left:2px;-webkit-transform:rotate(180deg);transform:rotate(180deg);vertical-align:middle;width:1.3128205128ex}@supports((-webkit-mask:url("")) or (mask:url(""))){.usa-banner__button[aria-expanded=true]:after{background:none;background-color:#005ea2;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat center/1.3128205128ex .8ex;mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCAzOSI+PHBhdGggZD0iTTYzLjM2IDQuMDA0IDYwLjE1NS43NDFjLS40MjctLjQzNi0uOTE5LS42NTQtMS40NzUtLjY1NC0uNTU1IDAtMS4wNDcuMjE4LTEuNDc1LjY1NEwzMiAyNi40IDYuNzk4Ljc0QzYuMzcuMzA2IDUuODc4LjA4OCA1LjMyMy4wODhjLS41NTYgMC0xLjA0OC4yMTgtMS40NzYuNjU0TC42NDIgNC4wMDVDLjIxMyA0LjQ0IDAgNC45NDEgMCA1LjUwN2MwIC41NjUuMjE0IDEuMDY2LjY0MiAxLjUwMWwyOS44ODMgMzAuNDI3Yy40MjcuNDM1LjkyLjY1MiAxLjQ3NS42NTIuNTU2IDAgMS4wNDctLjIxNyAxLjQ3NC0uNjUyTDYzLjM2MSA3LjAwOGMuNDI3LS40MzUuNjM5LS45MzYuNjM5LTEuNTAxIDAtLjU2Ni0uMjEyLTEuMDY3LS42NC0xLjUwM3oiLz48L3N2Zz4=) no-repeat center/1.3128205128ex .8ex}.usa-banner__button[aria-expanded=true]:after:hover{background-color:#1a4480}}.usa-banner__button[aria-expanded=true]:hover:after{background-color:#1a4480;content:""}}.usa-banner__button-text{left:-999em;position:absolute;right:auto;text-decoration:underline}@media (min-width:40em){.usa-banner__button-text{display:inline;position:static}}.usa-banner__icon{width:2.5rem}.usa-js-loading .usa-banner__content{left:-999em;position:absolute;right:auto}.usa-breadcrumb{background-color:#fff;color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3;padding-left:0;padding-right:0}@media (min-width:30em){.usa-breadcrumb{padding-bottom:1rem;padding-top:1rem}.usa-breadcrumb:not(.usa-breadcrumb--wrap) .usa-breadcrumb__list{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.usa-breadcrumb__list{display:block;list-style-type:none;margin:-.25rem;padding:.25rem}.usa-breadcrumb__list>li{margin-bottom:0;max-width:unset}.usa-breadcrumb__list-item{display:inline;left:-999em;position:absolute;right:auto;white-space:nowrap}@media (max-width:29.99em){.usa-breadcrumb__list-item{white-space:normal}.usa-breadcrumb__list-item:nth-last-child(2){position:static}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;border:0;border-radius:0;box-shadow:none;color:#005ea2;display:inline-block;font-weight:400;margin:0;padding:1rem 0 1rem 2ex;text-align:left;text-decoration:underline;text-indent:-2ex}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:hover{color:#1a4480}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:active{color:#162e51}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:active,.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:before{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0yMCAxMUg3LjgzbDUuNTktNS41OUwxMiA0bC04IDggOCA4IDEuNDEtMS40MUw3LjgzIDEzSDIwdi0yeiIvPjwvc3ZnPg==) no-repeat 50%/2ex 2ex;content:"";display:inline-block;vertical-align:baseline;width:2ex}@supports((-webkit-mask:url("")) or (mask:url(""))){.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:before{background:none;background-color:#71767a;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0yMCAxMUg3LjgzbDUuNTktNS41OUwxMiA0bC04IDggOCA4IDEuNDEtMS40MUw3LjgzIDEzSDIwdi0yeiIvPjwvc3ZnPg==) no-repeat center/2ex 2ex;mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0yMCAxMUg3LjgzbDUuNTktNS41OUwxMiA0bC04IDggOCA4IDEuNDEtMS40MUw3LjgzIDEzSDIwdi0yeiIvPjwvc3ZnPg==) no-repeat center/2ex 2ex}}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:visited{color:#54278f}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:active,.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:hover{color:#1a4480}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:before{bottom:-.2em;height:2ex;position:relative}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link,.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:active,.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:hover{text-decoration:none}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link span{text-decoration:underline}.usa-breadcrumb__list-item:nth-last-child(2) .usa-breadcrumb__link:before{margin-right:0}}@media (min-width:30em){.usa-breadcrumb__list-item{position:static}.usa-breadcrumb__list-item:not(:last-child):after{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMCA2IDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiLz48L3N2Zz4=) no-repeat 50%/2ex 2ex;content:"";display:inline-block;vertical-align:baseline;width:2ex}@supports((-webkit-mask:url("")) or (mask:url(""))){.usa-breadcrumb__list-item:not(:last-child):after{background:none;background-color:#71767a;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMCA2IDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiLz48L3N2Zz4=) no-repeat center/2ex 2ex;mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMCA2IDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiLz48L3N2Zz4=) no-repeat center/2ex 2ex}}.usa-breadcrumb__list-item:not(:last-child):after{bottom:-.2em;height:2ex;margin-left:0;margin-right:0;position:relative}}.usa-breadcrumb__link{color:#005ea2;display:inline;text-decoration:none}.usa-breadcrumb__link:visited{color:#54278f}.usa-breadcrumb__link:active,.usa-breadcrumb__link:hover{color:#1a4480}.usa-breadcrumb__link span{text-decoration:underline}@media (min-width:30em){.usa-breadcrumb--wrap{line-height:1.4}}.usa-breadcrumb--wrap .usa-breadcrumb__list-item{display:inline-block}.usa-button-group{display:flex;flex-direction:column;flex-wrap:wrap;list-style-type:none;margin:0 -.25rem;padding-left:0}@media (min-width:30em){.usa-button-group{flex-direction:row}}.usa-button-group__item{margin:.25rem}@media (min-width:30em){.usa-button-group__item:last-child{margin-right:0}}.usa-button-group__item .usa-button{margin-left:0;margin-right:0}.usa-button-group--segmented{flex-direction:row;flex-wrap:nowrap;justify-content:space-between;margin-left:0;margin-right:0}@media (min-width:30em){.usa-button-group--segmented{justify-content:flex-start}}.usa-button-group--segmented .usa-button{position:relative;width:calc(100% + 2px)}@media (min-width:30em){.usa-button-group--segmented .usa-button{width:auto}}.usa-button-group--segmented .usa-button:active,.usa-button-group--segmented .usa-button:hover{z-index:2}.usa-button-group--segmented .usa-button:focus{z-index:3}.usa-button-group--segmented .usa-button-group__item{margin-left:0;margin-right:0;width:100%}@media (min-width:30em){.usa-button-group--segmented .usa-button-group__item{width:auto}}.usa-button-group--segmented .usa-button-group__item:first-child>.usa-button{border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.usa-button-group--segmented .usa-button-group__item:last-child>.usa-button{border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-2px;margin-right:0;width:calc(100% + 2px)}@media (min-width:30em){.usa-button-group--segmented .usa-button-group__item:last-child>.usa-button{margin-left:-1px;width:auto}}.usa-button-group--segmented .usa-button-group__item:not(:first-child):not(:last-child)>.usa-button{border-radius:0;margin-left:-1px;margin-right:-1px}.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button:before{border-right:1px solid #1a4480;bottom:0;content:"";display:block;height:100%;position:absolute;right:1px;top:0;width:1px;z-index:3}.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--secondary:before{border-right-color:#b50909}.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--accent-cool:before{border-right-color:#28a0cb}.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--base:before{border-right-color:#565c65}.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--accent-cool:disabled:before,.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--base:disabled:before,.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--secondary:disabled:before{border-right-color:#71767a}.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button--outline:before,.usa-button-group--segmented .usa-button-group__item:not(:last-child) .usa-button:active:before{display:none}.usa-card-group,.usa-prose .usa-card-group{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-card-group{align-items:stretch;display:flex;flex-direction:column;flex-wrap:wrap;margin-left:-.5rem;margin-right:-.5rem}@media (min-width:40em){.usa-card-group{flex-direction:row}}.usa-card{max-width:none}.usa-card,.usa-card:last-child{margin-bottom:2.5rem}@media (min-width:40em){.usa-card,.usa-card:last-child{margin-bottom:2rem}}.usa-prose .usa-card{margin-bottom:2.5rem;max-width:none}.usa-prose .usa-card:last-child{margin-bottom:2.5rem}@media (min-width:40em){.usa-prose .usa-card,.usa-prose .usa-card:last-child{margin-bottom:2rem}}.usa-card__container{background-color:#fff;border:2px solid #dfe1e2;border-radius:.5rem;display:flex;flex-direction:column;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;height:100%;line-height:1.5;margin-left:.5rem;margin-right:.5rem;position:relative}.usa-card:not(.usa-card--flag) .usa-card__container>:only-child{padding:1.5rem}.usa-card .usa-card__img{display:block}.usa-card__header{padding:1.5rem 1.5rem .5rem}.usa-card__header:last-child{padding-bottom:1.5rem}.usa-card__heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;line-height:1.1;margin:0}.usa-card__media{min-height:1px;order:-1}.usa-card__img{background-color:#f0f0f0;border-top-left-radius:calc(.5rem - 2px);border-top-right-radius:calc(.5rem - 2px);overflow:hidden;position:relative}.usa-card__img img{display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.usa-card__media--inset{padding-left:1.5rem;padding-right:1.5rem;padding-top:1.5rem}.usa-card__media--inset .usa-card__img{border-radius:0}.usa-card__body{flex:1 1;flex-basis:auto;padding:.5rem 1.5rem}.usa-card__body:last-child{padding-bottom:1.5rem}.usa-card__body:first-child{padding-top:1.5rem}.usa-card__body:only-child{padding-bottom:1.5rem;padding-top:1.5rem}.usa-card__footer{padding:.5rem 1.5rem 1.5rem}.usa-card__footer .usa-button:only-of-type{margin-right:0}.usa-card__body>:last-child,.usa-card__header>:last-child{margin-bottom:0;padding-bottom:0}.usa-card__body>:first-child,.usa-card__header>:first-child{margin-top:0;padding-top:0}.usa-card__body>:only-child,.usa-card__header>:only-child{margin-bottom:0;margin-top:0;padding-bottom:0;padding-top:0}.usa-card__footer--exdent,.usa-card__header--exdent,.usa-card__media--exdent{margin-left:-2px;margin-right:-2px}.usa-card__footer--exdent>*,.usa-card__header--exdent>*{padding-left:2px;padding-right:2px}.usa-card__media--exdent{margin-top:-2px}.usa-card__media--exdent .usa-card__img{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.usa-card--header-first .usa-card__header{border-top-left-radius:calc(.5rem - 2px);border-top-right-radius:calc(.5rem - 2px);padding-bottom:1rem}.usa-card--header-first .usa-card__header--exdent{border-top-left-radius:.5rem;border-top-right-radius:.5rem;margin-top:-2px}.usa-card--header-first .usa-card__media--inset{padding-top:0}.usa-card--header-first .usa-card__media{order:0}.usa-card--header-first .usa-card__img{border-radius:0}.usa-card--header-first .usa-card__body{padding-top:1rem}@media (min-width:40em){.usa-card--flag .usa-card__media{bottom:0;display:flex;left:0;overflow:hidden;position:absolute;top:0;width:15rem}.usa-card--flag .usa-card__img{border-radius:0;border-bottom-left-radius:calc(.5rem - 2px);border-top-left-radius:calc(.5rem - 2px)}.usa-card--flag .usa-card__body,.usa-card--flag .usa-card__footer,.usa-card--flag .usa-card__header{margin-left:15rem}.usa-card--flag .usa-card__media--exdent{margin:-2px 0 -2px -2px}.usa-card--flag .usa-card__media--exdent .usa-card__img{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.usa-card--flag .usa-card__media--inset{padding-bottom:1.5rem;padding-right:0}.usa-card--flag .usa-card__media--inset .usa-card__img{border-radius:0}.usa-card--flag.usa-card--header-first .usa-card__header{padding-bottom:.5rem}.usa-card--flag.usa-card--header-first .usa-card__body{padding-top:.5rem}.usa-card--flag.usa-card--header-first .usa-card__media--inset{padding-top:1.5rem}.usa-card--flag.usa-card--media-right .usa-card__media{left:auto;right:0}.usa-card--flag.usa-card--media-right .usa-card__media--inset{padding-left:0;padding-right:1.5rem}.usa-card--flag.usa-card--media-right .usa-card__media--inset .usa-card__img{border-radius:0}.usa-card--flag.usa-card--media-right .usa-card__img{border-radius:0;border-bottom-right-radius:calc(.5rem - 2px);border-top-right-radius:calc(.5rem - 2px)}.usa-card--flag.usa-card--media-right .usa-card__body,.usa-card--flag.usa-card--media-right .usa-card__footer,.usa-card--flag.usa-card--media-right .usa-card__header{margin-left:0;margin-right:15rem}.usa-card--flag.usa-card--media-right .usa-card__media--exdent{margin-left:0;margin-right:-2px}.usa-card--flag.usa-card--media-right .usa-card__media--exdent .usa-card__img{border-radius:0;border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}}.usa-card:not(.usa-card--flag).usa-card__media--set-aspect{box-sizing:border-box;height:0;overflow:hidden;padding:0 0 56.25%;position:relative}.usa-card:not(.usa-card--flag).usa-card__media--set-aspect .usa-card__img{bottom:0;left:0;position:absolute;right:0;top:0}.usa-checklist{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-checklist__item{margin-bottom:0;margin-top:.5rem;text-indent:-2.5rem}.usa-checklist__item:before{content:" ";display:inline-block;height:1rem;margin-left:-.25rem;margin-right:.75rem;width:2rem}.usa-checklist__item.usa-checklist__item--checked:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiMwMDVlYTIiIGQ9Ik05IDE2LjE3IDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-position:50%;background-repeat:no-repeat;background-size:1.5rem}.usa-collection{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3;padding-left:0}.usa-collection__item{align-items:flex-start;border-top-style:solid;border-top-width:1px;display:flex;list-style-type:none;margin-bottom:1rem;margin-top:1rem;padding-left:0;padding-top:1rem}.usa-collection__item>li{margin-bottom:0;max-width:unset}.usa-prose .usa-collection{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3;padding-left:0}.usa-prose .usa-collection__item{align-items:flex-start;border-top-style:solid;border-top-width:1px;display:flex;list-style-type:none;margin-bottom:1rem;margin-top:1rem;padding-left:0;padding-top:1rem}.usa-prose .usa-collection__item>li{margin-bottom:0;max-width:unset}.usa-collection__calendar-date,.usa-collection__img{flex-shrink:0;margin-right:1rem;width:4rem}@media (min-width:40em){.usa-collection__calendar-date,.usa-collection__img{width:5rem}}.usa-collection__body{flex:1 1}.usa-collection__heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.13rem;line-height:1.3;margin-bottom:0;margin-top:0}.usa-collection__description{margin-bottom:.5rem;margin-top:.5rem}.usa-collection__meta{list-style-type:none;margin-bottom:0;margin-top:.25rem;padding-left:0}.usa-collection__meta>li{margin-bottom:0;max-width:unset}.usa-collection__meta-item{display:block;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:.93rem;line-height:1.3;margin-right:.5rem;margin-top:.25rem}.usa-collection__meta-item.usa-tag{background-color:#dfe1e2;color:#1b1b1b;display:inline-block;line-height:.9;margin-top:.25rem;padding-bottom:.25rem;padding-top:.25rem}.usa-collection__meta-item.usa-tag--new{background-color:#c05600;color:#fff}.usa-collection__calendar-date{text-decoration:none}.usa-collection__calendar-date-day,.usa-collection__calendar-date-month{display:block;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.13rem;font-weight:700;padding:.25rem;text-align:center}@media (min-width:40em){.usa-collection__calendar-date-day,.usa-collection__calendar-date-month{padding:.5rem}}.usa-collection__calendar-date-month{background-color:#005ea2;border-top-left-radius:2px;border-top-right-radius:2px;color:#fff}.usa-collection__calendar-date-day{border:1px solid #005ea2;border-bottom-left-radius:2px;border-bottom-right-radius:2px;color:#005ea2}.usa-collection--condensed .usa-collection__item{margin-bottom:.5rem;margin-top:.5rem;padding-top:.5rem}.usa-footer{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;overflow:hidden}.usa-footer>.grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.usa-footer>.grid-container{padding-left:2rem;padding-right:2rem}}.usa-footer__return-to-top{line-height:.9;padding-bottom:1.25rem;padding-top:1.25rem}.usa-footer__return-to-top a{color:#005ea2;text-decoration:underline}.usa-footer__return-to-top a:visited{color:#54278f}.usa-footer__return-to-top a:hover{color:#1a4480}.usa-footer__return-to-top a:active{color:#162e51}.usa-footer__return-to-top a:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-footer__nav{border-bottom:1px solid #a9aeb1;margin-left:auto;margin-right:auto;max-width:64rem;padding-left:0;padding-right:0}@media (min-width:64em){.usa-footer__nav{padding-left:2rem;padding-right:2rem}}@media (min-width:30em){.usa-footer__nav{border-bottom:none;padding-left:1rem;padding-right:1rem}}@media (min-width:30em)and (min-width:64em){.usa-footer__nav{padding-left:2rem;padding-right:2rem}}.usa-footer__nav>ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-footer__primary-section{background-color:#f0f0f0}.usa-footer__primary-section>.grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.usa-footer__primary-section>.grid-container{padding-left:2rem;padding-right:2rem}}.usa-footer__primary-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.usa-footer__primary-container{padding-left:2rem;padding-right:2rem}}.usa-footer__primary-content{line-height:1.1}.usa-footer__primary-link a,.usa-footer__secondary-link a{text-decoration:none}.usa-footer__primary-link a:hover,.usa-footer__secondary-link a:hover{text-decoration:underline}.usa-footer__primary-link{color:#1b1b1b;display:block;font-weight:700;padding:1rem;text-decoration:none}@media (min-width:30em){.usa-footer__primary-link{padding-left:0;padding-right:0}}.usa-footer__primary-link:hover{cursor:pointer;text-decoration:underline}.usa-footer__secondary-link{line-height:1.1;margin-left:1rem;padding:0}.usa-footer__secondary-link a{color:#005ea2;text-decoration:underline}.usa-footer__secondary-link a:visited{color:#54278f}.usa-footer__secondary-link a:hover{color:#1a4480}.usa-footer__secondary-link a:active{color:#162e51}.usa-footer__secondary-link a:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-footer__secondary-link+.usa-footer__secondary-link{padding-top:1rem}@media (min-width:30em){.usa-footer__secondary-link{margin-left:0}}.usa-footer__contact-info{line-height:1.1}.usa-footer__contact-info a{color:#1b1b1b;text-decoration:none}.usa-footer__contact-info a:hover{text-decoration:underline}@media (min-width:30em){.usa-footer__contact-info{justify-content:flex-end;margin-top:.5rem}}.usa-footer__primary-content{border-top:1px solid #a9aeb1}@media (min-width:30em){.usa-footer__primary-content{border:none}}.usa-sign-up{padding-bottom:2rem;padding-top:1.5rem}.usa-sign-up .usa-button,.usa-sign-up .usa-label{margin-top:.75rem}.usa-sign-up__heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:700;line-height:1.1;margin:0}.usa-footer__secondary-section{background-color:#dfe1e2;padding-bottom:1.25rem;padding-top:1.25rem}.usa-footer__secondary-section>.grid-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.usa-footer__secondary-section>.grid-container{padding-left:2rem;padding-right:2rem}}.usa-footer__secondary-section a{color:#1b1b1b}.usa-footer__logo{margin-bottom:.5rem;margin-top:.5rem}@media (min-width:30em){.usa-footer__logo{align-items:center;margin-bottom:0;margin-top:0}}.usa-footer__logo-img{max-width:5rem}.usa-footer__logo-heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:700;line-height:.9;margin-bottom:.5rem;margin-top:.5rem}.usa-footer__contact-links{margin-top:1.5rem}@media (min-width:30em){.usa-footer__contact-links{margin-top:0;text-align:right}}.usa-footer__contact-heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;line-height:1.1;margin-top:0}@media (min-width:30em){.usa-footer__contact-heading{margin-bottom:.25rem;margin-top:.25rem}}.usa-footer__social-links{line-height:.9;padding-bottom:.5rem}.usa-footer__social-links a{text-decoration:none}@media (min-width:30em){.usa-footer__social-links{justify-content:flex-end}}.usa-social-link{background-color:rgba(0,0,0,.1);background-position:50%;background-size:auto 2rem;display:inline-block;height:3rem;width:3rem}.usa-social-link span{left:-999em;position:absolute;right:auto}.usa-social-link--facebook{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTIyIDEyYzAtNS41Mi00LjQ4LTEwLTEwLTEwUzIgNi40OCAyIDEyYzAgNC44NCAzLjQ0IDguODcgOCA5LjhWMTVIOHYtM2gyVjkuNUMxMCA3LjU3IDExLjU3IDYgMTMuNSA2SDE2djNoLTJjLS41NSAwLTEgLjQ1LTEgMXYyaDN2M2gtM3Y2Ljk1YzUuMDUtLjUgOS00Ljc2IDktOS45NXoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-social-link--twitter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDJhMTAgMTAgMCAxIDAgMTAgMTBBMTAgMTAgMCAwIDAgMTIgMnptNSA4LjF2LjMxYTYuODEgNi44MSAwIDAgMS02Ljg2IDYuODYgNi43NCA2Ljc0IDAgMCAxLTMuNjktMS4wOCA1LjYzIDUuNjMgMCAwIDAgLjU4IDAgNC43OSA0Ljc5IDAgMCAwIDMtMSAyLjQxIDIuNDEgMCAwIDEtMi4yMy0xLjY4IDEuNzUgMS43NSAwIDAgMCAuNDYuMDUgMi41OSAyLjU5IDAgMCAwIC42My0uMDhBMi40MiAyLjQyIDAgMCAxIDcgMTEuMTFhMi4zMyAyLjMzIDAgMCAwIDEuMDkuMyAyLjQzIDIuNDMgMCAwIDEtLjc5LTMuMjUgNi44NCA2Ljg0IDAgMCAwIDUgMi41MyAyLjU5IDIuNTkgMCAwIDEtLjA3LS41NSAyLjQxIDIuNDEgMCAwIDEgMi40MS0yLjQxIDIuMzggMi4zOCAwIDAgMSAxLjc3Ljc2IDQuNjcgNC42NyAwIDAgMCAxLjQ5LS41OSAyLjM5IDIuMzkgMCAwIDEtMS4wNiAxLjM0IDQuNTUgNC41NSAwIDAgMCAxLjM5LS4zOUE1IDUgMCAwIDEgMTcgMTAuMXoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-social-link--youtube{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDJhMTAgMTAgMCAxIDAgMTAgMTBBMTAgMTAgMCAwIDAgMTIgMnptNS43NSAxMi45MUExLjQ5IDEuNDkgMCAwIDEgMTYuNjkgMTZhMzQuNjUgMzQuNjUgMCAwIDEtNC42OS4yNkEzNC42NSAzNC42NSAwIDAgMSA3LjMxIDE2YTEuNDkgMS40OSAwIDAgMS0xLjA2LTEuMDZBMTUuODggMTUuODggMCAwIDEgNiAxMmExNS44OCAxNS44OCAwIDAgMSAuMjUtMi45MUExLjQ5IDEuNDkgMCAwIDEgNy4zMSA4IDM0LjY1IDM0LjY1IDAgMCAxIDEyIDcuNzdhMzQuNjUgMzQuNjUgMCAwIDEgNC42OS4yMyAxLjQ5IDEuNDkgMCAwIDEgMS4wNiAxLjA2QTE1Ljg4IDE1Ljg4IDAgMCAxIDE4IDEyYTE1Ljg4IDE1Ljg4IDAgMCAxLS4yNSAyLjkxeiIvPjxwb2x5Z29uIHBvaW50cz0iMTAuNzcgMTMuNzggMTMuOTEgMTIgMTAuNzcgMTAuMjIgMTAuNzcgMTMuNzgiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-social-link--instagram{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDEwYTIgMiAwIDEgMCAyIDIgMiAyIDAgMCAwLTItMnoiLz48cGF0aCBkPSJNMTIgMmExMCAxMCAwIDEgMCAxMCAxMEExMCAxMCAwIDAgMCAxMiAyem02IDEyLjY5QTMuMzIgMy4zMiAwIDAgMSAxNC42OSAxOEg5LjMxQTMuMzIgMy4zMiAwIDAgMSA2IDE0LjY5VjkuMzFBMy4zMiAzLjMyIDAgMCAxIDkuMzEgNmg1LjM4QTMuMzIgMy4zMiAwIDAgMSAxOCA5LjMxeiIvPjxwYXRoIGQ9Ik0xNi45NCA5LjMxYTIuMjUgMi4yNSAwIDAgMC0yLjI1LTIuMjVIOS4zMWEyLjI1IDIuMjUgMCAwIDAtMi4yNSAyLjI1djUuMzhhMi4yNSAyLjI1IDAgMCAwIDIuMjUgMi4yNWg1LjM4YTIuMjUgMi4yNSAwIDAgMCAyLjI1LTIuMjV6TTEyIDE1LjA5QTMuMDkgMy4wOSAwIDEgMSAxNS4wOSAxMiAzLjA5IDMuMDkgMCAwIDEgMTIgMTUuMDl6bTMuNzctNS43NWEuNzkuNzkgMCAwIDEtLjU1LjIzLjgzLjgzIDAgMCAxLS41NS0uMjMuNzguNzggMCAwIDEgMC0xLjExLjgyLjgyIDAgMCAxIC41NS0uMjMuNzguNzggMCAwIDEgLjU1IDEuMzN6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-social-link--rss{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxjaXJjbGUgY3g9IjYuMTgiIGN5PSIxNy44MiIgcj0iMi4xOCIvPjxwYXRoIGQ9Ik00IDQuNDR2Mi44M2M3LjAzIDAgMTIuNzMgNS43IDEyLjczIDEyLjczaDIuODNjMC04LjU5LTYuOTctMTUuNTYtMTUuNTYtMTUuNTZ6bTAgNS42NnYyLjgzYzMuOSAwIDcuMDcgMy4xNyA3LjA3IDcuMDdoMi44M2MwLTUuNDctNC40My05LjktOS45LTkuOXoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}@media (min-width:30em){.usa-footer__address{justify-content:flex-end}}@media (min-width:64em){.usa-footer--slim .usa-footer__nav{padding-left:0;padding-right:0}}.usa-footer--slim .usa-footer__address{padding:1rem}@media (min-width:30em){.usa-footer--slim .usa-footer__address{padding:0}}.usa-footer--slim .usa-footer__logo{align-items:center}.usa-footer--slim .usa-footer__logo-img{max-width:3rem}.usa-footer--slim .usa-footer__contact-info{display:inline-block}@media (min-width:30em){.usa-footer--slim .usa-footer__contact-info{margin-top:0;padding-bottom:1rem;padding-top:1rem}}.usa-footer--big .usa-footer__nav{margin-left:-1rem;margin-right:-1rem}@media (min-width:30em){.usa-footer--big .usa-footer__nav{border-bottom:1px solid #a9aeb1;padding-top:2rem}}@media (min-width:40em){.usa-footer--big .usa-footer__nav{border-bottom:none;margin-left:0;margin-right:0;padding-left:0;padding-right:0}}.usa-footer--big .usa-footer__primary-link{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;font-weight:700;line-height:1.1;margin:0}@media (min-width:30em){.usa-footer--big .usa-footer__primary-link{margin-bottom:.5rem;padding-bottom:0;padding-top:0}.usa-footer--big .usa-footer__primary-link:hover{cursor:auto;text-decoration:none}}.usa-footer--big .usa-footer__primary-content--collapsible .usa-footer__primary-link{align-items:center;cursor:pointer;display:flex;justify-content:flex-start}.usa-footer--big .usa-footer__primary-content--collapsible .usa-footer__primary-link:before{align-items:center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xNi41OSA4LjU5IDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat;background-size:contain;content:"";display:inline-flex;height:1.25rem;justify-content:center;margin-left:-.25rem;margin-right:.25rem;width:1.25rem}@media (min-width:30em){.usa-footer--big .usa-footer__primary-content--collapsible .usa-footer__primary-link:before{content:none}}.usa-footer--big .usa-footer__primary-content--collapsible.hidden .usa-list--unstyled{display:none}.usa-footer--big .usa-footer__primary-content--collapsible.hidden .usa-footer__primary-link:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMCA2IDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-repeat:no-repeat}@media (min-width:30em){.usa-footer--big .usa-footer__primary-content--collapsible.hidden .usa-footer__primary-link{margin:0}}.usa-footer--big .usa-footer__primary-content--collapsible .usa-list--unstyled{padding-bottom:1.25rem;padding-left:1rem;padding-right:1rem}@media (min-width:30em){.usa-footer--big .usa-footer__primary-content--collapsible .usa-list--unstyled{padding:.75rem 0 2rem}}.usa-form{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3}@media (min-width:30em){.usa-form{max-width:20rem}}.usa-form .usa-input,.usa-form .usa-range,.usa-form .usa-select,.usa-form .usa-textarea{max-width:none}.usa-form .usa-input--2xs{max-width:4ex}.usa-form .usa-input--xs{max-width:7ex}.usa-form .usa-input--sm,.usa-form .usa-input--small{max-width:10ex}.usa-form .usa-input--md,.usa-form .usa-input--medium{max-width:20ex}.usa-form .usa-input--lg{max-width:30ex}.usa-form .usa-input--xl{max-width:40ex}.usa-form .usa-input--2xl{max-width:50ex}.usa-form .usa-button{margin-top:.5rem}@media (min-width:30em){.usa-form .usa-button{margin-top:1.5rem}}.usa-form a{color:#005ea2;text-decoration:underline}.usa-form a:visited{color:#54278f}.usa-form a:hover{color:#1a4480}.usa-form a:active{color:#162e51}.usa-form a:focus{outline:.25rem solid #2491ff;outline-offset:0}@media (min-width:30em){.usa-form--large{max-width:30rem}}.usa-form__note{float:right;font-size:.93rem;line-height:1.3;margin:.25rem 0 1rem}.usa-form__note,.usa-graphic-list{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}.usa-graphic-list{font-size:1.06rem;line-height:1.5}.usa-graphic-list .usa-graphic-list__row .usa-media-block{margin-bottom:2rem}@media (min-width:40em){.usa-graphic-list .usa-graphic-list__row .usa-media-block{margin-bottom:4rem}.usa-graphic-list .usa-graphic-list__row:last-child .usa-media-block{margin-bottom:0}}.usa-graphic-list .usa-graphic-list__row:last-child .usa-media-block:last-child{margin-bottom:0}.usa-graphic-list .usa-media-block__img{margin-right:1.5rem}.usa-graphic-list .usa-media-block__body>:first-child{margin-top:0}.usa-graphic-list__heading{clear:both;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:700;line-height:1.1;margin-bottom:0;margin-top:0}*+.usa-graphic-list__heading{margin-top:1.5em}.usa-graphic-list__heading+*{margin-top:1em}.usa-header{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;z-index:300}.usa-header:after{clear:both;content:"";display:block}.usa-header a{border-bottom:none}@media (min-width:64em){.usa-header .usa-search{float:right}.usa-header [role=search]{float:right;max-width:calc(27ch + 3rem);width:100%}}.usa-header [type=search]{min-width:0}@media (min-width:64em){.usa-header+.usa-hero{border-top:1px solid #fff}.usa-header+.usa-section,.usa-header+main{border-top:1px solid #dfe1e2}}@media (max-width:63.99em){.usa-logo{flex:1 1;font-size:.93rem;line-height:.9;margin-left:1rem}}@media (min-width:64em){.usa-logo{font-size:1.46rem;line-height:1.1;margin-bottom:1rem;margin-top:2rem}}.usa-logo a{color:#1b1b1b;text-decoration:none}.usa-logo__text{display:block;font-style:normal;font-weight:700;margin:0}.usa-menu-btn{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;background-color:#005ea2;border:0;border-radius:0;box-shadow:none;color:#005ea2;color:#fff;flex:0 1 auto;font-size:.87rem;font-weight:400;height:3rem;margin:0;padding:0 .75rem;text-align:left;text-align:center;text-decoration:underline;text-decoration:none;text-transform:uppercase}.usa-menu-btn:visited{color:#54278f}.usa-menu-btn:hover{color:#1a4480}.usa-menu-btn:active{color:#162e51}.usa-menu-btn:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-menu-btn:active,.usa-menu-btn:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}@media (min-width:64em){.usa-menu-btn{display:none}}.usa-menu-btn:hover{background-color:#1a4480;color:#fff;text-decoration:none}.usa-menu-btn:active,.usa-menu-btn:visited{color:#fff}.usa-overlay{background:#000;bottom:0;left:0;opacity:0;position:absolute;position:fixed;right:0;top:0;transition:opacity .2s ease-in-out;visibility:hidden;z-index:400}.usa-overlay.is-visible{opacity:.2;visibility:visible}@media (min-width:64em){.usa-header--basic .usa-navbar{position:relative;width:33%}.usa-header--basic .usa-nav{align-items:center;display:flex;flex-direction:row;justify-content:flex-end;padding:0 0 .25rem .5rem;width:100%}.usa-header--basic .usa-nav-container{align-items:flex-end;display:flex;justify-content:space-between}.usa-header--basic .usa-nav__link:hover,.usa-header--basic .usa-nav__primary-item>.usa-current{position:relative}.usa-header--basic .usa-nav__link:hover:after,.usa-header--basic .usa-nav__primary-item>.usa-current:after{background-color:#005ea2;border-radius:0;bottom:-.25rem;content:"";display:block;height:.25rem;left:1rem;position:absolute;right:1rem}.usa-header--basic .usa-nav__link[aria-expanded=true]:after,.usa-header--basic .usa-nav__link[aria-expanded=true]:hover:after{display:none}.usa-header--basic .usa-nav__primary{width:auto}.usa-header--basic .usa-nav__primary-item:last-of-type{position:relative}.usa-header--basic .usa-nav__primary-item:last-of-type .usa-nav__submenu{position:absolute;right:0}.usa-header--basic .usa-search{top:0}}.usa-header--basic.usa-header--megamenu .usa-nav__inner{display:flex;flex-direction:column}@media (min-width:64em){.usa-header--basic.usa-header--megamenu .usa-nav__inner{display:block;float:right;margin-top:-2.5rem}.usa-header--basic.usa-header--megamenu .usa-nav__primary-item:last-of-type{position:static}.usa-header--extended{padding-top:0}.usa-header--extended .usa-nav__primary-item>.usa-current,.usa-header--extended .usa-nav__primary-item>.usa-nav__link:hover{position:relative}.usa-header--extended .usa-nav__primary-item>.usa-current:after,.usa-header--extended .usa-nav__primary-item>.usa-nav__link:hover:after{background-color:#005ea2;border-radius:0;bottom:0;content:"";display:block;height:.25rem;left:1rem;position:absolute;right:1rem}.usa-header--extended .usa-nav__link[aria-expanded=true]:after,.usa-header--extended .usa-nav__link[aria-expanded=true]:hover:after{display:none}.usa-header--extended .usa-logo{font-size:2.13rem;margin:2rem 0 1.5rem;max-width:50%}.usa-header--extended .usa-navbar{display:block;height:auto;margin-left:auto;margin-right:auto;max-width:64rem;overflow:auto;padding-left:1rem;padding-right:1rem}}@media (min-width:64em)and (min-width:64em){.usa-header--extended .usa-navbar{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.usa-header--extended .usa-nav{border-top:1px solid #dfe1e2;padding:0;width:100%}.usa-header--extended .usa-nav__inner{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem;position:relative}}@media (min-width:64em)and (min-width:64em){.usa-header--extended .usa-nav__inner{padding-left:2rem;padding-right:2rem}}@media (min-width:64em){.usa-header--extended .usa-nav__primary{margin-left:-1rem}.usa-header--extended .usa-nav__primary:after{clear:both;content:"";display:block}.usa-header--extended .usa-nav__link{padding-bottom:1rem;padding-top:1rem}.usa-header--extended .usa-nav__submenu .usa-grid-full{padding-left:.75rem}.usa-header--extended .usa-nav__submenu.usa-megamenu{left:0;padding-left:2rem}}html.usa-js-loading .usa-nav__submenu,html.usa-js-loading .usa-nav__submenu.usa-megamenu{left:-999em;position:absolute;right:auto}.usa-hero{background-image:url(/justice40-tool/main/static/hero-64da0bc09eaff1000d48c416c82ea2db.png);background-position:50%;background-size:cover;color:#fff;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;padding-bottom:2rem;padding-top:2rem}.usa-hero__callout{background-color:#162e51;padding:2rem}@media (min-width:40em){.usa-hero__callout{max-width:20rem}}.usa-hero__heading{clear:both;color:#00bde3;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:2.13rem;font-weight:700;line-height:1.1;margin-bottom:0;margin-top:0}*+.usa-hero__heading{margin-top:1.5em}.usa-hero__heading+*{margin-top:1em}.usa-hero__heading--alt{color:#fff;display:block}.usa-icon{fill:currentColor;display:inline-block;height:1em;position:relative;width:1em}.usa-icon--size-3{height:1.5rem;width:1.5rem}.usa-icon--size-4{height:2rem;width:2rem}.usa-icon--size-5{height:2.5rem;width:2.5rem}.usa-icon--size-6{height:3rem;width:3rem}.usa-icon--size-7{height:3.5rem;width:3.5rem}.usa-icon--size-8{height:4rem;width:4rem}.usa-icon--size-9{height:4.5rem;width:4.5rem}.usa-layout-docs__sidenav{order:2;padding-top:2rem}@media (min-width:64em){.usa-layout-docs__sidenav{padding-top:0}.usa-layout-docs__main{order:2}}.usa-media-block{align-items:flex-start;display:flex}.usa-media-block__img{flex-shrink:0;margin-right:.5rem}.usa-media-block__body{flex:1 1}.usa-megamenu .usa-col{flex:1 1 auto}@media (min-width:64em){.usa-megamenu .usa-col{flex:4 1}.usa-megamenu.usa-nav__submenu{left:-33%;padding:2rem 0;right:0;width:auto}.usa-megamenu.usa-nav__submenu:before{right:100%}.usa-megamenu.usa-nav__submenu:after,.usa-megamenu.usa-nav__submenu:before{background-color:#162e51;bottom:0;content:"";display:block;position:absolute;top:0;width:100%}.usa-megamenu.usa-nav__submenu:after{left:100%}.usa-nav-container{margin-left:auto;margin-right:auto;max-width:64rem;padding-left:2rem;padding-right:2rem}.usa-nav-container:after{clear:both;content:"";display:block}}@media (min-width:64em)and (min-width:64em){.usa-nav-container{padding-left:2rem;padding-right:2rem}}.usa-navbar{height:3rem}@media (max-width:63.99em){.usa-navbar{align-items:center;border-bottom:1px solid #dfe1e2;display:flex}}@media (min-width:64em){.usa-navbar{border-bottom:none;display:inline-block;height:auto}}@-webkit-keyframes slidein-left{0%{-webkit-transform:translateX(15rem);transform:translateX(15rem)}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slidein-left{0%{-webkit-transform:translateX(15rem);transform:translateX(15rem)}to{-webkit-transform:translateX(0);transform:translateX(0)}}.usa-nav{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:.9}@media (max-width:63.99em){.usa-nav{background:#fff;border-right:0;bottom:0;display:none;flex-direction:column;overflow-y:auto;padding:1rem;position:absolute;position:fixed;right:0;top:0;width:15rem;z-index:500}.usa-nav.is-visible{-webkit-animation:slidein-left .3s ease-in-out;animation:slidein-left .3s ease-in-out;display:flex}}@media (min-width:64em){.usa-nav{float:right;position:relative}.usa-nav .usa-search{margin-left:1rem}}.usa-nav .usa-accordion{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:.9}@media (max-width:63.99em){.usa-nav__primary{list-style-type:none;margin-bottom:0;margin-top:1.5rem;order:2;padding-left:0}.usa-nav__primary>li{margin-bottom:0;max-width:unset}.usa-nav__primary-item{border-top:1px solid #dfe1e2}.usa-nav__primary a:not(.usa-button){color:#565c65;display:block;padding:.5rem 1rem;text-decoration:none}.usa-nav__primary a:not(.usa-button):hover{background-color:#f0f0f0;color:#005ea2;text-decoration:none}.usa-nav__primary a:not(.usa-button):focus{outline-offset:0}.usa-nav__primary .usa-current{color:#005ea2;font-weight:700;position:relative}.usa-nav__primary .usa-current:after{background-color:#005ea2;border-radius:99rem;bottom:.25rem;content:"";display:block;left:.25rem;position:absolute;top:.25rem;width:.25rem}}@media (max-width:63.99em)and (min-width:40em){.usa-nav__primary .usa-current{position:relative}.usa-nav__primary .usa-current:after{background-color:#005ea2;border-radius:99rem;bottom:.25rem;content:"";display:block;left:0;position:absolute;top:.25rem;width:.25rem}}@media (max-width:63.99em){.usa-nav__primary a{padding-bottom:.75rem;padding-top:.75rem}}@media (min-width:64em){.usa-nav__primary{display:flex}}.usa-nav__primary .usa-nav__primary-item a{text-decoration:none}.usa-nav__primary>.usa-nav__primary-item{line-height:1.1}@media (min-width:64em){.usa-nav__primary>.usa-nav__primary-item{font-size:.93rem;line-height:.9}.usa-nav__primary>.usa-nav__primary-item>a{color:#565c65;display:block;font-weight:700;line-height:.9;padding:1rem}.usa-nav__primary>.usa-nav__primary-item>a:hover{color:#005ea2}.usa-nav__primary a{padding-bottom:.5rem;padding-top:.5rem}}.usa-nav__primary button{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;border:0;border-radius:0;box-shadow:none;color:#005ea2;color:#565c65;font-weight:400;line-height:1.1;margin:0;padding:.75rem 1rem;text-align:left;text-decoration:underline;text-decoration:none}.usa-nav__primary button:visited{color:#54278f}.usa-nav__primary button:hover{color:#1a4480}.usa-nav__primary button:active{color:#162e51}.usa-nav__primary button:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-nav__primary button:active,.usa-nav__primary button:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}@media (min-width:64em){.usa-nav__primary button{font-size:.93rem;font-weight:700;line-height:.9;padding:1rem}}.usa-nav__primary button:hover{background-color:#f0f0f0;color:#005ea2;text-decoration:none}@media (min-width:64em){.usa-nav__primary button:hover{background-color:transparent}}.usa-nav__primary button[aria-expanded=false]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-position:right 0 center;background-repeat:no-repeat;background-size:1.25rem}@media (min-width:64em){.usa-nav__primary button[aria-expanded=false]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xNi41OSA4LjU5IDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-position:right .75rem top 53%;background-repeat:no-repeat;background-size:1rem}.usa-nav__primary button[aria-expanded=false]:hover{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiMxYTQ0ODAiIGQ9Ik0xNi41OSA4LjU5IDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-repeat:no-repeat}}.usa-nav__primary button[aria-expanded=true]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSAxM0g1di0yaDE0djJ6Ii8+PC9zdmc+),linear-gradient(transparent,transparent);background-position:right 0 center;background-repeat:no-repeat;background-size:1.25rem}@media (min-width:64em){.usa-nav__primary button[aria-expanded=true]{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#162e51;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Im0xMiA4LTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-position:right .75rem top 53%;background-repeat:no-repeat;background-size:1rem;color:#fff}.usa-nav__primary .usa-accordion__button span{margin-right:0;padding-right:1rem}}.usa-nav__secondary{margin-top:1rem}@media (min-width:64em){.usa-nav__secondary{align-items:flex-end;bottom:4rem;display:flex;flex-direction:column;font-size:.93rem;margin-top:.5rem;min-width:calc(27ch + 3rem);position:absolute;right:2rem}}.usa-nav__secondary .usa-search{margin-top:1rem;width:100%}@media (min-width:64em){.usa-nav__secondary .usa-search{margin-left:0;margin-top:.5rem}}.usa-nav__secondary-links{line-height:1.3;list-style-type:none;margin-bottom:0;margin-top:1.5rem;padding-left:0}@media (min-width:64em){.usa-nav__secondary-links{float:right;line-height:.9;margin-bottom:.25rem;margin-top:0}.usa-nav__secondary-links .usa-nav__secondary-item{display:inline;padding-left:.25rem}.usa-nav__secondary-links .usa-nav__secondary-item+.usa-nav__secondary-item:before{color:#dfe1e2;content:"|";padding-right:.25rem}}.usa-nav__secondary-links a{color:#71767a;display:inline-block;font-size:.93rem;text-decoration:none}.usa-nav__secondary-links a:hover{color:#005ea2;text-decoration:underline}@media (max-width:63.99em){.usa-nav__submenu{list-style-type:none;margin:0;padding-left:0}.usa-nav__submenu>li{margin-bottom:0;max-width:unset}.usa-nav__submenu-item{border-top:1px solid #dfe1e2;font-size:.93rem}.usa-nav__submenu .usa-current:after{display:none}}@media (max-width:63.99em)and (min-width:40em){.usa-nav__submenu .usa-current:after{display:none}}@media (max-width:63.99em){.usa-nav__submenu a:not(.usa-button){padding-left:2rem}.usa-nav__submenu .usa-nav__submenu a:not(.usa-button){padding-left:3rem}.usa-nav__submenu .usa-nav__submenu .usa-nav__submenu a:not(.usa-button){content:"foobar";padding-left:4rem}}@media (min-width:64em){.usa-nav__submenu{background-color:#162e51;list-style-type:none;margin-bottom:0;margin-top:0;padding:1rem;position:absolute;width:15rem;z-index:400}}.usa-nav__submenu[aria-hidden=true]{display:none}@media (min-width:64em){.usa-nav__submenu .usa-nav__submenu-item+*{margin-top:.75rem}.usa-nav__submenu .usa-nav__submenu-item a{color:#fff;line-height:1.3;padding:0}.usa-nav__submenu .usa-nav__submenu-item a:hover{background-color:transparent;color:#fff;padding:0;text-decoration:underline}}.usa-nav__submenu-list{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-nav__submenu-list>li{margin-bottom:0;max-width:unset}.usa-nav__submenu-list .usa-nav__submenu-list-item{font-size:.93rem;margin:0}.usa-nav__submenu-list .usa-nav__submenu-list-item a{line-height:1.3}.usa-nav__close{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;border:0;border-radius:0;box-shadow:none;color:#005ea2;color:currentColor;flex:none;float:right;font-weight:400;height:3rem;margin:-.75rem -1rem 1rem auto;padding:0;text-align:left;text-align:center;text-decoration:underline;width:3rem}.usa-nav__close:visited{color:#54278f}.usa-nav__close:hover{color:#1a4480}.usa-nav__close:active{color:#162e51}.usa-nav__close:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-nav__close:active,.usa-nav__close:hover{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;background-color:transparent;box-shadow:none;text-decoration:underline}.usa-nav__close:hover{color:currentColor;text-decoration:none}@media (min-width:64em){.usa-nav__close{display:none}}.usa-nav__close img{width:1.5rem}.usa-nav__close+*{clear:both}.usa-js-mobile-nav--active{overflow:hidden}.usa-process-list{counter-reset:usa-numbered-list;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;list-style-type:none;margin-bottom:0;margin-top:0;padding:20px 0 0 1rem;position:relative}.usa-process-list>li{margin-bottom:0;max-width:unset}.usa-process-list>.usa-process-list__item{max-width:72ex}.usa-process-list__item{border-left:.5rem solid #d9e8f6;font-size:1.06rem;margin-bottom:0;padding-bottom:2rem;padding-left:2rem}.usa-prose .usa-process-list{counter-reset:usa-numbered-list;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;list-style-type:none;margin-bottom:0;margin-top:0;padding:20px 0 0 1rem;position:relative}.usa-prose .usa-process-list>li{margin-bottom:0;max-width:unset}.usa-prose .usa-process-list>.usa-process-list__item{max-width:72ex}.usa-prose .usa-process-list__item{border-left:.5rem solid #d9e8f6;font-size:1.06rem;margin-bottom:0;padding-bottom:2rem;padding-left:2rem}.usa-process-list__item:last-child{border-left:.5rem solid transparent}.usa-process-list__item:before{align-items:center;background-color:#fff;border:.25rem solid #1b1b1b;border-radius:99rem;box-shadow:0 0 0 .25rem #fff;color:#1b1b1b;content:counter(usa-numbered-list,decimal);counter-increment:usa-numbered-list;display:flex;flex-direction:row;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:700;height:2.5rem;justify-content:center;left:0;line-height:.9;margin-top:-.4rem;position:absolute;width:2.5rem}.usa-process-list__item ul{list-style-type:disc}.usa-process-list__item ul li{margin-bottom:.25rem}.usa-process-list__item ul li:last-child{margin-bottom:0}.usa-process-list__item>:first-child{margin-top:0}.usa-process-list__item>:last-child{margin-bottom:0}.usa-process-list__heading{color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;font-weight:700;line-height:1.1;margin:0}.usa-process-list__heading+*{margin-top:.25rem}.usa-step-indicator{background-color:#fff;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.1;margin-bottom:2rem;margin-left:-1px;margin-right:-1px}@media (min-width:40em){.usa-step-indicator{margin-left:0;margin-right:0}}.usa-step-indicator__segments{counter-reset:usa-step-indicator;display:flex;list-style:none;margin:0;padding:0}.usa-step-indicator__segment{counter-increment:usa-step-indicator;flex:1 1;margin-left:1px;margin-right:1px;max-width:15rem;min-height:.5rem;position:relative}.usa-step-indicator__segment:after{background-color:#dfe1e2;content:"";display:block;height:.5rem;left:0;position:absolute;right:0;top:0}@media (min-width:40em){.usa-step-indicator__segment:after{height:.5rem}}.usa-step-indicator__segment--complete:after{background-color:#162e51}.usa-step-indicator__segment--complete .usa-step-indicator__segment-label{color:#162e51}.usa-step-indicator__segment--current:after{background-color:#005ea2}.usa-step-indicator__segment--current .usa-step-indicator__segment-label{color:#005ea2;font-weight:700}.usa-step-indicator__segment-label{display:none}@media (min-width:40em){.usa-step-indicator__segment-label{color:#565c65;display:block;font-size:1.06rem;margin-top:1rem;padding-right:2rem;text-align:left}}.usa-step-indicator__header{align-items:baseline;display:flex}.usa-step-indicator__heading{color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.13rem;font-weight:700;margin:1rem 0 0}@media (min-width:40em){.usa-step-indicator__heading{font-size:1.46rem;margin-top:2rem}}.usa-step-indicator__current-step{background-color:#005ea2;border-radius:99rem;color:#fff;display:inline-block;height:2.5rem;padding:calc(1.25rem - 1.1ex);text-align:center;width:2.5rem}.usa-step-indicator__current-step,.usa-step-indicator__total-steps{-webkit-font-feature-settings:"tnum" 1,"kern" 1;font-feature-settings:"tnum" 1,"kern" 1;font-weight:400}.usa-step-indicator__total-steps{color:#005ea2;margin-right:.5rem}@media (min-width:40em){.usa-step-indicator--counters-sm .usa-step-indicator__segment,.usa-step-indicator--counters .usa-step-indicator__segment{margin-left:0;margin-right:0;margin-top:1.25rem}.usa-step-indicator--counters-sm .usa-step-indicator__segment:before,.usa-step-indicator--counters .usa-step-indicator__segment:before{-webkit-font-feature-settings:"tnum" 1,"kern" 1;font-feature-settings:"tnum" 1,"kern" 1;background-color:#fff;border-radius:99rem;box-shadow:inset 0 0 0 .25rem #dfe1e2,0 0 0 .25rem #fff;color:#565c65;content:counter(usa-step-indicator);display:block;font-weight:700;height:2.5rem;left:0;line-height:.9;padding:calc(1.25rem - .9ex);position:absolute;text-align:center;top:-1rem;width:2.5rem;z-index:100}.usa-step-indicator--counters-sm .usa-step-indicator__segment:last-child:after,.usa-step-indicator--counters .usa-step-indicator__segment:last-child:after{display:none}}.usa-step-indicator--counters-sm .usa-step-indicator__segment--complete:before,.usa-step-indicator--counters .usa-step-indicator__segment--complete:before{background-color:#162e51;box-shadow:0 0 0 .25rem #fff;color:#fff}.usa-step-indicator--counters-sm .usa-step-indicator__segment--current:before,.usa-step-indicator--counters .usa-step-indicator__segment--current:before{background-color:#005ea2;box-shadow:0 0 0 .25rem #fff;color:#fff}@media (min-width:40em){.usa-step-indicator--counters-sm .usa-step-indicator__segment-label,.usa-step-indicator--counters .usa-step-indicator__segment-label{margin-top:2rem}.usa-step-indicator--counters-sm.usa-step-indicator--center .usa-step-indicator__segment:first-child:after,.usa-step-indicator--counters.usa-step-indicator--center .usa-step-indicator__segment:first-child:after{left:50%;right:0;width:auto}.usa-step-indicator--counters-sm.usa-step-indicator--center .usa-step-indicator__segment:last-child:after,.usa-step-indicator--counters.usa-step-indicator--center .usa-step-indicator__segment:last-child:after{display:block;left:0;right:50%;width:auto}.usa-step-indicator--counters-sm .usa-step-indicator__segment{margin-top:.75rem}.usa-step-indicator--counters-sm .usa-step-indicator__segment:before{border-radius:99rem;font-size:.93rem;height:1.5rem;padding:calc(.25rem + 1px);top:-.5rem;width:1.5rem}.usa-step-indicator--counters-sm .usa-step-indicator__segment:last-child:after{display:none}.usa-step-indicator--counters-sm .usa-step-indicator__segment-label{margin-top:1.5rem}}.usa-step-indicator--no-labels{margin-left:-1px;margin-right:-1px}.usa-step-indicator--no-labels .usa-step-indicator__segment{margin-left:1px;margin-right:1px;margin-top:0}.usa-step-indicator--no-labels .usa-step-indicator__segment:before{display:none}.usa-step-indicator--no-labels .usa-step-indicator__segment:last-child:after{display:block}.usa-step-indicator--no-labels .usa-step-indicator__heading{margin-top:1rem}.usa-step-indicator--no-labels .usa-step-indicator__segment-label{display:none}.usa-step-indicator--center{margin-left:-1px;margin-right:-1px}.usa-step-indicator--center .usa-step-indicator__segment{margin-left:1px;margin-right:1px}.usa-step-indicator--center .usa-step-indicator__segment:before{left:calc(50% - 1.375rem)}.usa-step-indicator--center .usa-step-indicator__segment-label{padding-left:.5rem;padding-right:.5rem;text-align:center}.usa-step-indicator--center.usa-step-indicator--no-labels .usa-step-indicator__segment:first-child:after{left:0}.usa-step-indicator--center.usa-step-indicator--no-labels .usa-step-indicator__segment:last-child:after{right:0}.usa-step-indicator--center.usa-step-indicator--counters-sm .usa-step-indicator__segment:before{left:calc(50% - .875rem)}.usa-search{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;position:relative}.usa-search:after{clear:both;content:"";display:block}.usa-search[role=search],.usa-search [role=search],.usa-search[role=search]>div{display:flex}.usa-search [type=submit]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdBNi40NzEgNi40NzEgMCAwIDAgMTYgOS41IDYuNSA2LjUgMCAxIDAgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-position:50%;background-repeat:no-repeat;background-size:1.5rem;border-bottom-left-radius:0;border-top-left-radius:0;height:2rem;margin:0;padding:0;width:3rem}@media (min-width:30em){.usa-search [type=submit]{background-image:none;padding-left:1rem;padding-right:1rem;width:auto}.usa-search--big .usa-search__input,.usa-search--big [type=search]{font-size:1.06rem;height:3rem}.usa-search--big .usa-search__submit,.usa-search--big [type=submit]{font-size:1.46rem;height:3rem;padding-left:2rem;padding-right:2rem;width:auto}.usa-search--small .usa-search__submit,.usa-search--small [type=submit]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdBNi40NzEgNi40NzEgMCAwIDAgMTYgOS41IDYuNSA2LjUgMCAxIDAgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz48L3N2Zz4=),linear-gradient(transparent,transparent);background-position:50%;background-repeat:no-repeat;background-size:1.5rem;width:3rem}}input[type=search]{-webkit-appearance:none;appearance:none;box-sizing:border-box}.usa-search__input,[type=search]{border-bottom-right-radius:0;border-right:none;border-top-right-radius:0;box-sizing:border-box;float:left;font-size:1rem;height:2rem;margin:0;padding-bottom:0;padding-top:0}.usa-search__submit-text{left:-999em;position:absolute;right:auto}@media (min-width:30em){.usa-search__submit-text{position:static}}.usa-section{padding-bottom:2rem;padding-top:2rem}@media (min-width:40em){.usa-section{padding-bottom:4rem;padding-top:4rem}}.usa-section--light{background-color:#f0f0f0}.usa-section--dark{background-color:#162e51;color:#fff}.usa-section--dark h1,.usa-section--dark h2,.usa-section--dark h3,.usa-section--dark h4,.usa-section--dark h5,.usa-section--dark h6{color:#00bde3}.usa-section--dark p{color:#fff}.usa-section--dark a{color:#dfe1e2}.usa-section--dark a:hover{color:#f0f0f0}.usa-section--dark a:active{color:#fff}.usa-sidenav{border-bottom:1px solid #dfe1e2;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.3;list-style-type:none;margin-bottom:0;margin-top:0;padding-left:0}.usa-sidenav>li{margin-bottom:0;max-width:unset}.usa-sidenav__item{border-top:1px solid #dfe1e2}.usa-sidenav a:not(.usa-button){color:#565c65;display:block;padding:.5rem 1rem;text-decoration:none}.usa-sidenav a:not(.usa-button):hover{background-color:#f0f0f0;color:#005ea2;text-decoration:none}.usa-sidenav a:not(.usa-button):focus{outline-offset:0}.usa-sidenav .usa-current{color:#005ea2;font-weight:700;position:relative}.usa-sidenav .usa-current:after{background-color:#005ea2;border-radius:99rem;bottom:.25rem;content:"";display:block;left:.25rem;position:absolute;top:.25rem;width:.25rem}@media (min-width:40em){.usa-sidenav .usa-current{position:relative}.usa-sidenav .usa-current:after{background-color:#005ea2;border-radius:99rem;bottom:.25rem;content:"";display:block;left:0;position:absolute;top:.25rem;width:.25rem}}.grid-container .usa-sidenav{margin-left:-1rem;margin-right:-1rem}@media (min-width:40em){.grid-container .usa-sidenav{margin-left:0;margin-right:0}}.usa-sidenav__sublist{font-size:1rem;list-style-type:none;margin:0;padding-left:0}.usa-sidenav__sublist>li{margin-bottom:0;max-width:unset}.usa-sidenav__sublist-item{border-top:1px solid #dfe1e2;font-size:.93rem}.usa-sidenav__sublist .usa-current:after{display:none}@media (min-width:40em){.usa-sidenav__sublist .usa-current:after{display:none}}.usa-sidenav__sublist a:not(.usa-button){padding-left:2rem}.usa-sidenav__sublist .usa-sidenav__sublist a:not(.usa-button){padding-left:3rem}.usa-sidenav__sublist .usa-sidenav__sublist .usa-sidenav__sublist a:not(.usa-button){content:"foobar";padding-left:4rem}.usa-site-alert{background-color:#f0f0f0;position:relative}.usa-site-alert .usa-alert{background-position-x:1rem;margin-left:auto;margin-right:auto;max-width:64rem;padding-left:1rem;padding-right:1rem}@media (min-width:64em){.usa-site-alert .usa-alert{background-position-x:2rem;padding-left:2rem;padding-right:2rem}}.usa-site-alert .usa-alert:before{display:none}.usa-site-alert .usa-alert .usa-alert__body>.usa-list,.usa-site-alert .usa-alert>.usa-list{padding-left:2ch}.usa-site-alert .usa-alert__body{display:block}@media (min-width:40em){.usa-site-alert .usa-alert__body{position:relative}}.usa-site-alert--info,.usa-site-alert--info .usa-alert{background-color:#e7f6f8;color:#1b1b1b}.usa-site-alert--info .usa-alert{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat}.usa-site-alert--info .usa-alert:before{background-color:#00bde3}.usa-site-alert--info .usa-alert .usa-alert__body{padding-left:3.75rem}.usa-site-alert--info .usa-alert .usa-link{color:#005ea2}.usa-site-alert--info .usa-alert .usa-link:visited{color:#54278f}.usa-site-alert--info .usa-alert .usa-link:active,.usa-site-alert--info .usa-alert .usa-link:hover{color:#1a4480}.usa-site-alert--info .usa-alert.usa-alert--no-icon{background-image:none}.usa-site-alert--info .usa-alert.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-site-alert--emergency{background-color:#9c3d10;color:#fff}.usa-site-alert--emergency .usa-alert{background-color:#9c3d10;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIvPjwvc3ZnPg==),linear-gradient(transparent,transparent);background-repeat:no-repeat;color:#fff}.usa-site-alert--emergency .usa-alert:before{background-color:#9c3d10}.usa-site-alert--emergency .usa-alert .usa-alert__body{padding-left:3.75rem}.usa-site-alert--emergency .usa-alert .usa-link,.usa-site-alert--emergency .usa-alert .usa-link:visited{color:#dfe1e2}.usa-site-alert--emergency .usa-alert .usa-link:active,.usa-site-alert--emergency .usa-alert .usa-link:hover{color:#f0f0f0}.usa-site-alert--emergency .usa-alert.usa-alert--no-icon{background-image:none}.usa-site-alert--emergency .usa-alert.usa-alert--no-icon .usa-alert__body{padding-left:0}.usa-site-alert--no-icon .usa-alert{background-image:none}.usa-site-alert--no-icon .usa-alert .usa-alert__body{padding-left:0}.usa-site-alert--slim .usa-alert{background-position:1.75rem .75rem;background-position-x:1rem;background-size:1.5rem;padding-bottom:.5rem;padding-top:.5rem}.usa-site-alert--slim .usa-alert .usa-alert__body{padding-left:2rem}.usa-site-alert--slim .usa-alert .usa-alert__text:only-child{margin-bottom:.25rem;padding-top:.25rem}@media (min-width:64em){.usa-site-alert--slim .usa-alert{background-position-x:2rem}}.usa-site-alert--no-heading .usa-alert{background-position-y:1rem}.usa-skipnav{background:transparent;color:#005ea2;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;left:0;line-height:1.5;padding:.5rem 1rem;position:absolute;text-decoration:underline;top:-3.8rem;transition:.2s ease-in-out;z-index:100}.usa-skipnav:visited{color:#54278f}.usa-skipnav:hover{color:#1a4480}.usa-skipnav:active{color:#162e51}.usa-skipnav:focus{outline:.25rem solid #2491ff;outline-offset:0}.usa-skipnav.usa-focus,.usa-skipnav:focus{background:#fff;left:0;position:absolute;top:0;transition:.2s ease-in-out}.usa-summary-box{background-color:#e7f6f8;border:1px solid #99deea;border-radius:.25rem;color:#1b1b1b;font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.06rem;line-height:1.5;padding:1.5rem;position:relative}.usa-summary-box .usa-list:last-child{margin-bottom:0}*+.usa-summary-box{margin-top:1rem}.usa-summary-box__body{display:table-cell;vertical-align:top}.usa-summary-box__heading{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-size:1.46rem;line-height:1.1;margin-bottom:.5rem;margin-top:0}.usa-summary-box__text{margin-bottom:0;margin-top:0}.usa-summary-box__text:only-child{margin-bottom:1px;padding-top:.25rem}.usa-summary-box__link{color:#005ea2}.usa-summary-box__link:visited{color:#54278f}.usa-summary-box__link:active,.usa-summary-box__link:hover{color:#1a4480}.usa-summary-box__link[href^="#"]:visited{color:#005ea2}.usa-summary-box__link[href^="#"]:hover{color:#1a4480}.usa-tooltip{display:inline-block;position:relative}.usa-tooltip__trigger{cursor:pointer}.usa-tooltip__trigger>svg{display:block;pointer-events:none}.usa-tooltip__body{background-color:#1b1b1b;border-radius:.25rem;bottom:0;color:#f0f0f0;display:none;font-size:1rem;left:0;opacity:0;padding:.5rem;pointer-events:none;position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);transition:opacity .08s ease-in-out;white-space:pre;width:auto;z-index:100000}.usa-tooltip__body:after{border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #1b1b1b;bottom:-5px;content:"";display:block;height:0;left:50%;margin-left:-5px;pointer-events:none;position:absolute;width:0}.usa-tooltip__body--wrap{white-space:normal;width:100%}.usa-tooltip__body.is-set{display:block}.usa-tooltip__body.is-visible{opacity:1}.usa-tooltip__body--bottom{bottom:auto;top:0}.usa-tooltip__body--bottom:after{border-bottom:5px solid #1b1b1b;border-left:5px solid transparent;border-right:5px solid transparent;border-top:0;bottom:auto;top:-5px}.usa-tooltip__body--right{top:auto;-webkit-transform:translateX(0);transform:translateX(0)}.usa-tooltip__body--right:after{border-bottom:5px solid transparent;border-left:0;border-right:5px solid #1b1b1b;border-top:5px solid transparent;bottom:0;left:-5px;margin:-5px 0 0;right:auto;top:50%}.usa-tooltip__body--left{left:0;right:auto;top:auto;-webkit-transform:translateX(0);transform:translateX(0)}.usa-tooltip__body--left:after{border-bottom:5px solid transparent;border-left:5px solid #1b1b1b;border-right:0;border-top:5px solid transparent;bottom:0;left:auto;margin:-5px 0 0;right:-5px;top:50%}[class*=font-mono-]{font-family:Roboto Mono Web,Bitstream Vera Sans Mono,Consolas,Courier,monospace}[class*=font-sans-]{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}[class*=font-serif-]{font-family:Merriweather Web,Georgia,Cambria,Times New Roman,Times,serif}[class*=font-body-],[class*=font-heading-],[class*=font-ui-]{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}[class*=font-code-]{font-family:Roboto Mono Web,Bitstream Vera Sans Mono,Consolas,Courier,monospace}[class*=font-alt-]{font-family:Merriweather Web,Georgia,Cambria,Times New Roman,Times,serif}.add-aspect-9x16{padding:0 0 177.77778%}.add-aspect-1x1,.add-aspect-9x16{box-sizing:border-box;height:0;overflow:hidden;position:relative}.add-aspect-1x1{padding:0 0 100%}.add-aspect-4x3{padding:0 0 75%}.add-aspect-4x3,.add-aspect-16x9{box-sizing:border-box;height:0;overflow:hidden;position:relative}.add-aspect-16x9{padding:0 0 56.25%}.add-aspect-2x1{box-sizing:border-box;height:0;overflow:hidden;padding:0 0 50%;position:relative}.add-list-reset{list-style:none;margin-bottom:0;margin-top:0;padding-left:0}.flex-align-start{align-items:flex-start}.flex-align-end{align-items:flex-end}.flex-align-center{align-items:center}.flex-align-stretch{align-items:stretch}.flex-align-baseline{align-items:baseline}.flex-align-self-start{align-self:flex-start}.flex-align-self-end{align-self:flex-end}.flex-align-self-center{align-self:center}.flex-align-self-stretch{align-self:stretch}.flex-align-self-baseline{align-self:baseline}.bg-transparent,.hover\:bg-transparent:hover{background-color:transparent}.bg-black,.hover\:bg-black:hover{background-color:#000}.bg-white,.hover\:bg-white:hover{background-color:#fff}.bg-red,.hover\:bg-red:hover{background-color:#e52207}.bg-orange,.hover\:bg-orange:hover{background-color:#e66f0e}.bg-gold,.hover\:bg-gold:hover{background-color:#ffbe2e}.bg-yellow,.hover\:bg-yellow:hover{background-color:#fee685}.bg-green,.hover\:bg-green:hover{background-color:#538200}.bg-mint,.hover\:bg-mint:hover{background-color:#04c585}.bg-cyan,.hover\:bg-cyan:hover{background-color:#009ec1}.bg-blue,.hover\:bg-blue:hover{background-color:#0076d6}.bg-indigo,.hover\:bg-indigo:hover{background-color:#676cc8}.bg-violet,.hover\:bg-violet:hover{background-color:#8168b3}.bg-magenta,.hover\:bg-magenta:hover{background-color:#d72d79}.bg-gray-5,.hover\:bg-gray-5:hover{background-color:#f0f0f0}.bg-gray-10,.hover\:bg-gray-10:hover{background-color:#e6e6e6}.bg-gray-30,.hover\:bg-gray-30:hover{background-color:#adadad}.bg-gray-50,.hover\:bg-gray-50:hover{background-color:#757575}.bg-gray-70,.hover\:bg-gray-70:hover{background-color:#454545}.bg-gray-90,.hover\:bg-gray-90:hover{background-color:#1b1b1b}.bg-base-lightest,.hover\:bg-base-lightest:hover{background-color:#f0f0f0}.bg-base-lighter,.hover\:bg-base-lighter:hover{background-color:#dfe1e2}.bg-base-light,.hover\:bg-base-light:hover{background-color:#a9aeb1}.bg-base,.hover\:bg-base:hover{background-color:#71767a}.bg-base-dark,.hover\:bg-base-dark:hover{background-color:#565c65}.bg-base-darker,.hover\:bg-base-darker:hover{background-color:#3d4551}.bg-base-darkest,.bg-ink,.hover\:bg-base-darkest:hover,.hover\:bg-ink:hover{background-color:#1b1b1b}.bg-primary-lighter,.hover\:bg-primary-lighter:hover{background-color:#d9e8f6}.bg-primary-light,.hover\:bg-primary-light:hover{background-color:#73b3e7}.bg-primary,.hover\:bg-primary:hover{background-color:#005ea2}.bg-primary-vivid,.hover\:bg-primary-vivid:hover{background-color:#0050d8}.bg-primary-dark,.hover\:bg-primary-dark:hover{background-color:#1a4480}.bg-primary-darker,.hover\:bg-primary-darker:hover{background-color:#162e51}.bg-secondary-lighter,.hover\:bg-secondary-lighter:hover{background-color:#f3e1e4}.bg-secondary-light,.hover\:bg-secondary-light:hover{background-color:#f2938c}.bg-secondary,.hover\:bg-secondary:hover{background-color:#d83933}.bg-secondary-vivid,.hover\:bg-secondary-vivid:hover{background-color:#e41d3d}.bg-secondary-dark,.hover\:bg-secondary-dark:hover{background-color:#b50909}.bg-secondary-darker,.hover\:bg-secondary-darker:hover{background-color:#8b0a03}.bg-accent-warm-darker,.hover\:bg-accent-warm-darker:hover{background-color:#775540}.bg-accent-warm-dark,.hover\:bg-accent-warm-dark:hover{background-color:#c05600}.bg-accent-warm,.hover\:bg-accent-warm:hover{background-color:#fa9441}.bg-accent-warm-light,.hover\:bg-accent-warm-light:hover{background-color:#ffbc78}.bg-accent-warm-lighter,.hover\:bg-accent-warm-lighter:hover{background-color:#f2e4d4}.bg-accent-cool-darker,.hover\:bg-accent-cool-darker:hover{background-color:#07648d}.bg-accent-cool-dark,.hover\:bg-accent-cool-dark:hover{background-color:#28a0cb}.bg-accent-cool,.hover\:bg-accent-cool:hover{background-color:#00bde3}.bg-accent-cool-light,.hover\:bg-accent-cool-light:hover{background-color:#97d4ea}.bg-accent-cool-lighter,.hover\:bg-accent-cool-lighter:hover{background-color:#e1f3f8}.border-1px,.hover\:border-1px:hover{border:1px solid}.border-y-1px,.hover\:border-y-1px:hover{border-bottom:1px solid;border-top:1px solid}.border-x-1px,.hover\:border-x-1px:hover{border-left:1px solid;border-right:1px solid}.border-top-1px,.hover\:border-top-1px:hover{border-top:1px solid}.border-right-1px,.hover\:border-right-1px:hover{border-right:1px solid}.border-bottom-1px,.hover\:border-bottom-1px:hover{border-bottom:1px solid}.border-left-1px,.hover\:border-left-1px:hover{border-left:1px solid}.border-2px,.hover\:border-2px:hover{border:2px solid}.border-y-2px,.hover\:border-y-2px:hover{border-bottom:2px solid;border-top:2px solid}.border-x-2px,.hover\:border-x-2px:hover{border-left:2px solid;border-right:2px solid}.border-top-2px,.hover\:border-top-2px:hover{border-top:2px solid}.border-right-2px,.hover\:border-right-2px:hover{border-right:2px solid}.border-bottom-2px,.hover\:border-bottom-2px:hover{border-bottom:2px solid}.border-left-2px,.hover\:border-left-2px:hover{border-left:2px solid}.border-05,.hover\:border-05:hover{border:.25rem solid}.border-y-05,.hover\:border-y-05:hover{border-bottom:.25rem solid;border-top:.25rem solid}.border-x-05,.hover\:border-x-05:hover{border-left:.25rem solid;border-right:.25rem solid}.border-top-05,.hover\:border-top-05:hover{border-top:.25rem solid}.border-right-05,.hover\:border-right-05:hover{border-right:.25rem solid}.border-bottom-05,.hover\:border-bottom-05:hover{border-bottom:.25rem solid}.border-left-05,.hover\:border-left-05:hover{border-left:.25rem solid}.border-1,.hover\:border-1:hover{border:.5rem solid}.border-y-1,.hover\:border-y-1:hover{border-bottom:.5rem solid;border-top:.5rem solid}.border-x-1,.hover\:border-x-1:hover{border-left:.5rem solid;border-right:.5rem solid}.border-top-1,.hover\:border-top-1:hover{border-top:.5rem solid}.border-right-1,.hover\:border-right-1:hover{border-right:.5rem solid}.border-bottom-1,.hover\:border-bottom-1:hover{border-bottom:.5rem solid}.border-left-1,.hover\:border-left-1:hover{border-left:.5rem solid}.border-105,.hover\:border-105:hover{border:.75rem solid}.border-y-105,.hover\:border-y-105:hover{border-bottom:.75rem solid;border-top:.75rem solid}.border-x-105,.hover\:border-x-105:hover{border-left:.75rem solid;border-right:.75rem solid}.border-top-105,.hover\:border-top-105:hover{border-top:.75rem solid}.border-right-105,.hover\:border-right-105:hover{border-right:.75rem solid}.border-bottom-105,.hover\:border-bottom-105:hover{border-bottom:.75rem solid}.border-left-105,.hover\:border-left-105:hover{border-left:.75rem solid}.border-2,.hover\:border-2:hover{border:1rem solid}.border-y-2,.hover\:border-y-2:hover{border-bottom:1rem solid;border-top:1rem solid}.border-x-2,.hover\:border-x-2:hover{border-left:1rem solid;border-right:1rem solid}.border-top-2,.hover\:border-top-2:hover{border-top:1rem solid}.border-right-2,.hover\:border-right-2:hover{border-right:1rem solid}.border-bottom-2,.hover\:border-bottom-2:hover{border-bottom:1rem solid}.border-left-2,.hover\:border-left-2:hover{border-left:1rem solid}.border-205,.hover\:border-205:hover{border:1.25rem solid}.border-y-205,.hover\:border-y-205:hover{border-bottom:1.25rem solid;border-top:1.25rem solid}.border-x-205,.hover\:border-x-205:hover{border-left:1.25rem solid;border-right:1.25rem solid}.border-top-205,.hover\:border-top-205:hover{border-top:1.25rem solid}.border-right-205,.hover\:border-right-205:hover{border-right:1.25rem solid}.border-bottom-205,.hover\:border-bottom-205:hover{border-bottom:1.25rem solid}.border-left-205,.hover\:border-left-205:hover{border-left:1.25rem solid}.border-3,.hover\:border-3:hover{border:1.5rem solid}.border-y-3,.hover\:border-y-3:hover{border-bottom:1.5rem solid;border-top:1.5rem solid}.border-x-3,.hover\:border-x-3:hover{border-left:1.5rem solid;border-right:1.5rem solid}.border-top-3,.hover\:border-top-3:hover{border-top:1.5rem solid}.border-right-3,.hover\:border-right-3:hover{border-right:1.5rem solid}.border-bottom-3,.hover\:border-bottom-3:hover{border-bottom:1.5rem solid}.border-left-3,.hover\:border-left-3:hover{border-left:1.5rem solid}.border-0,.hover\:border-0:hover{border:0 solid}.border-y-0,.hover\:border-y-0:hover{border-bottom:0 solid;border-top:0 solid}.border-x-0,.hover\:border-x-0:hover{border-left:0 solid;border-right:0 solid}.border-top-0,.hover\:border-top-0:hover{border-top:0 solid}.border-right-0,.hover\:border-right-0:hover{border-right:0 solid}.border-bottom-0,.hover\:border-bottom-0:hover{border-bottom:0 solid}.border-left-0,.hover\:border-left-0:hover{border-left:0 solid}.border,.hover\:border:hover{border:1px solid}.border-y,.hover\:border-y:hover{border-bottom:1px solid;border-top:1px solid}.border-x,.hover\:border-x:hover{border-left:1px solid;border-right:1px solid}.border-top,.hover\:border-top:hover{border-top:1px solid}.border-right,.hover\:border-right:hover{border-right:1px solid}.border-bottom,.hover\:border-bottom:hover{border-bottom:1px solid}.border-left,.hover\:border-left:hover{border-left:1px solid}.border-transparent,.hover\:border-transparent:hover{border-color:transparent}.border-black,.hover\:border-black:hover{border-color:#000}.border-white,.hover\:border-white:hover{border-color:#fff}.border-red,.hover\:border-red:hover{border-color:#e52207}.border-orange,.hover\:border-orange:hover{border-color:#e66f0e}.border-gold,.hover\:border-gold:hover{border-color:#ffbe2e}.border-yellow,.hover\:border-yellow:hover{border-color:#fee685}.border-green,.hover\:border-green:hover{border-color:#538200}.border-mint,.hover\:border-mint:hover{border-color:#04c585}.border-cyan,.hover\:border-cyan:hover{border-color:#009ec1}.border-blue,.hover\:border-blue:hover{border-color:#0076d6}.border-indigo,.hover\:border-indigo:hover{border-color:#676cc8}.border-violet,.hover\:border-violet:hover{border-color:#8168b3}.border-magenta,.hover\:border-magenta:hover{border-color:#d72d79}.border-gray-5,.hover\:border-gray-5:hover{border-color:#f0f0f0}.border-gray-10,.hover\:border-gray-10:hover{border-color:#e6e6e6}.border-gray-30,.hover\:border-gray-30:hover{border-color:#adadad}.border-gray-50,.hover\:border-gray-50:hover{border-color:#757575}.border-gray-70,.hover\:border-gray-70:hover{border-color:#454545}.border-gray-90,.hover\:border-gray-90:hover{border-color:#1b1b1b}.border-base-lightest,.hover\:border-base-lightest:hover{border-color:#f0f0f0}.border-base-lighter,.hover\:border-base-lighter:hover{border-color:#dfe1e2}.border-base-light,.hover\:border-base-light:hover{border-color:#a9aeb1}.border-base,.hover\:border-base:hover{border-color:#71767a}.border-base-dark,.hover\:border-base-dark:hover{border-color:#565c65}.border-base-darker,.hover\:border-base-darker:hover{border-color:#3d4551}.border-base-darkest,.border-ink,.hover\:border-base-darkest:hover,.hover\:border-ink:hover{border-color:#1b1b1b}.border-primary-lighter,.hover\:border-primary-lighter:hover{border-color:#d9e8f6}.border-primary-light,.hover\:border-primary-light:hover{border-color:#73b3e7}.border-primary,.hover\:border-primary:hover{border-color:#005ea2}.border-primary-vivid,.hover\:border-primary-vivid:hover{border-color:#0050d8}.border-primary-dark,.hover\:border-primary-dark:hover{border-color:#1a4480}.border-primary-darker,.hover\:border-primary-darker:hover{border-color:#162e51}.border-secondary-lighter,.hover\:border-secondary-lighter:hover{border-color:#f3e1e4}.border-secondary-light,.hover\:border-secondary-light:hover{border-color:#f2938c}.border-secondary,.hover\:border-secondary:hover{border-color:#d83933}.border-secondary-vivid,.hover\:border-secondary-vivid:hover{border-color:#e41d3d}.border-secondary-dark,.hover\:border-secondary-dark:hover{border-color:#b50909}.border-secondary-darker,.hover\:border-secondary-darker:hover{border-color:#8b0a03}.border-accent-warm-darker,.hover\:border-accent-warm-darker:hover{border-color:#775540}.border-accent-warm-dark,.hover\:border-accent-warm-dark:hover{border-color:#c05600}.border-accent-warm,.hover\:border-accent-warm:hover{border-color:#fa9441}.border-accent-warm-light,.hover\:border-accent-warm-light:hover{border-color:#ffbc78}.border-accent-warm-lighter,.hover\:border-accent-warm-lighter:hover{border-color:#f2e4d4}.border-accent-cool-darker,.hover\:border-accent-cool-darker:hover{border-color:#07648d}.border-accent-cool-dark,.hover\:border-accent-cool-dark:hover{border-color:#28a0cb}.border-accent-cool,.hover\:border-accent-cool:hover{border-color:#00bde3}.border-accent-cool-light,.hover\:border-accent-cool-light:hover{border-color:#97d4ea}.border-accent-cool-lighter,.hover\:border-accent-cool-lighter:hover{border-color:#e1f3f8}.radius-0{border-radius:0}.radius-top-0{border-top-left-radius:0;border-top-right-radius:0}.radius-right-0{border-bottom-right-radius:0;border-top-right-radius:0}.radius-bottom-0{border-bottom-left-radius:0;border-bottom-right-radius:0}.radius-left-0{border-bottom-left-radius:0;border-top-left-radius:0}.radius-none{border-radius:0}.radius-top-none{border-top-left-radius:0;border-top-right-radius:0}.radius-right-none{border-bottom-right-radius:0;border-top-right-radius:0}.radius-bottom-none{border-bottom-left-radius:0;border-bottom-right-radius:0}.radius-left-none{border-bottom-left-radius:0;border-top-left-radius:0}.radius-sm{border-radius:2px}.radius-top-sm{border-top-left-radius:2px;border-top-right-radius:2px}.radius-right-sm{border-bottom-right-radius:2px;border-top-right-radius:2px}.radius-bottom-sm{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.radius-left-sm{border-bottom-left-radius:2px;border-top-left-radius:2px}.radius-md{border-radius:.25rem}.radius-top-md{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.radius-right-md{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.radius-bottom-md{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.radius-left-md{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.radius-lg{border-radius:.5rem}.radius-top-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.radius-right-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.radius-bottom-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.radius-left-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.radius-pill{border-radius:99rem}.radius-top-pill{border-top-left-radius:99rem;border-top-right-radius:99rem}.radius-right-pill{border-bottom-right-radius:99rem;border-top-right-radius:99rem}.radius-bottom-pill{border-bottom-left-radius:99rem;border-bottom-right-radius:99rem}.radius-left-pill{border-bottom-left-radius:99rem;border-top-left-radius:99rem}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-solid{border-style:solid}.border-width-1px{border-width:1px}.border-y-width-1px{border-bottom-width:1px;border-top-width:1px}.border-x-width-1px{border-left-width:1px;border-right-width:1px}.border-top-width-1px{border-top-width:1px}.border-right-width-1px{border-right-width:1px}.border-bottom-width-1px{border-bottom-width:1px}.border-left-width-1px{border-left-width:1px}.border-width-2px{border-width:2px}.border-y-width-2px{border-bottom-width:2px;border-top-width:2px}.border-x-width-2px{border-left-width:2px;border-right-width:2px}.border-top-width-2px{border-top-width:2px}.border-right-width-2px{border-right-width:2px}.border-bottom-width-2px{border-bottom-width:2px}.border-left-width-2px{border-left-width:2px}.border-width-05{border-width:.25rem}.border-y-width-05{border-bottom-width:.25rem;border-top-width:.25rem}.border-x-width-05{border-left-width:.25rem;border-right-width:.25rem}.border-top-width-05{border-top-width:.25rem}.border-right-width-05{border-right-width:.25rem}.border-bottom-width-05{border-bottom-width:.25rem}.border-left-width-05{border-left-width:.25rem}.border-width-1{border-width:.5rem}.border-y-width-1{border-bottom-width:.5rem;border-top-width:.5rem}.border-x-width-1{border-left-width:.5rem;border-right-width:.5rem}.border-top-width-1{border-top-width:.5rem}.border-right-width-1{border-right-width:.5rem}.border-bottom-width-1{border-bottom-width:.5rem}.border-left-width-1{border-left-width:.5rem}.border-width-105{border-width:.75rem}.border-y-width-105{border-bottom-width:.75rem;border-top-width:.75rem}.border-x-width-105{border-left-width:.75rem;border-right-width:.75rem}.border-top-width-105{border-top-width:.75rem}.border-right-width-105{border-right-width:.75rem}.border-bottom-width-105{border-bottom-width:.75rem}.border-left-width-105{border-left-width:.75rem}.border-width-2{border-width:1rem}.border-y-width-2{border-bottom-width:1rem;border-top-width:1rem}.border-x-width-2{border-left-width:1rem;border-right-width:1rem}.border-top-width-2{border-top-width:1rem}.border-right-width-2{border-right-width:1rem}.border-bottom-width-2{border-bottom-width:1rem}.border-left-width-2{border-left-width:1rem}.border-width-205{border-width:1.25rem}.border-y-width-205{border-bottom-width:1.25rem;border-top-width:1.25rem}.border-x-width-205{border-left-width:1.25rem;border-right-width:1.25rem}.border-top-width-205{border-top-width:1.25rem}.border-right-width-205{border-right-width:1.25rem}.border-bottom-width-205{border-bottom-width:1.25rem}.border-left-width-205{border-left-width:1.25rem}.border-width-3{border-width:1.5rem}.border-y-width-3{border-bottom-width:1.5rem;border-top-width:1.5rem}.border-x-width-3{border-left-width:1.5rem;border-right-width:1.5rem}.border-top-width-3{border-top-width:1.5rem}.border-right-width-3{border-right-width:1.5rem}.border-bottom-width-3{border-bottom-width:1.5rem}.border-left-width-3{border-left-width:1.5rem}.border-width-0{border-width:0}.border-y-width-0{border-bottom-width:0;border-top-width:0}.border-x-width-0{border-left-width:0;border-right-width:0}.border-top-width-0{border-top-width:0}.border-right-width-0{border-right-width:0}.border-bottom-width-0{border-bottom-width:0}.border-left-width-0{border-left-width:0}.bottom-1px{bottom:1px}.bottom-2px{bottom:2px}.bottom-05{bottom:.25rem}.bottom-1{bottom:.5rem}.bottom-105{bottom:.75rem}.bottom-2{bottom:1rem}.bottom-205{bottom:1.25rem}.bottom-3{bottom:1.5rem}.bottom-neg-1px{bottom:-1px}.bottom-neg-2px{bottom:-2px}.bottom-neg-05{bottom:-.25rem}.bottom-neg-1{bottom:-.5rem}.bottom-neg-105{bottom:-.75rem}.bottom-neg-2{bottom:-1rem}.bottom-neg-205{bottom:-1.25rem}.bottom-neg-3{bottom:-1.5rem}.bottom-0{bottom:0}.bottom-auto{bottom:auto}.bottom-full{bottom:100%}.hover\:shadow-none:hover,.shadow-none{box-shadow:none}.hover\:shadow-1:hover,.shadow-1{box-shadow:0 1px .25rem 0 rgba(0,0,0,.1)}.hover\:shadow-2:hover,.shadow-2{box-shadow:0 .25rem .5rem 0 rgba(0,0,0,.1)}.hover\:shadow-3:hover,.shadow-3{box-shadow:0 .5rem 1rem 0 rgba(0,0,0,.1)}.hover\:shadow-4:hover,.shadow-4{box-shadow:0 .75rem 1.5rem 0 rgba(0,0,0,.1)}.hover\:shadow-5:hover,.shadow-5{box-shadow:0 1rem 2rem 0 rgba(0,0,0,.1)}.circle-1px{border-radius:50%;height:1px;width:1px}.circle-2px{border-radius:50%;height:2px;width:2px}.circle-05{border-radius:50%;height:.25rem;width:.25rem}.circle-1{border-radius:50%;height:.5rem;width:.5rem}.circle-105{border-radius:50%;height:.75rem;width:.75rem}.circle-2{border-radius:50%;height:1rem;width:1rem}.circle-205{border-radius:50%;height:1.25rem;width:1.25rem}.circle-3{border-radius:50%;height:1.5rem;width:1.5rem}.circle-4{border-radius:50%;height:2rem;width:2rem}.circle-5{border-radius:50%;height:2.5rem;width:2.5rem}.circle-6{border-radius:50%;height:3rem;width:3rem}.circle-7{border-radius:50%;height:3.5rem;width:3.5rem}.circle-8{border-radius:50%;height:4rem;width:4rem}.circle-9{border-radius:50%;height:4.5rem;width:4.5rem}.circle-10{border-radius:50%;height:5rem;width:5rem}.circle-15{border-radius:50%;height:7.5rem;width:7.5rem}.circle-card{border-radius:50%;height:10rem;width:10rem}.circle-card-lg{border-radius:50%;height:15rem;width:15rem}.circle-mobile{border-radius:50%;height:20rem;width:20rem}.clearfix:after{clear:both;content:"";display:block}.hover\:text-transparent:hover,.text-transparent{color:transparent}.hover\:text-black:hover,.text-black{color:#000}.hover\:text-white:hover,.text-white{color:#fff}.hover\:text-red:hover,.text-red{color:#e52207}.hover\:text-orange:hover,.text-orange{color:#e66f0e}.hover\:text-gold:hover,.text-gold{color:#ffbe2e}.hover\:text-yellow:hover,.text-yellow{color:#fee685}.hover\:text-green:hover,.text-green{color:#538200}.hover\:text-mint:hover,.text-mint{color:#04c585}.hover\:text-cyan:hover,.text-cyan{color:#009ec1}.hover\:text-blue:hover,.text-blue{color:#0076d6}.hover\:text-indigo:hover,.text-indigo{color:#676cc8}.hover\:text-violet:hover,.text-violet{color:#8168b3}.hover\:text-magenta:hover,.text-magenta{color:#d72d79}.hover\:text-gray-5:hover,.text-gray-5{color:#f0f0f0}.hover\:text-gray-10:hover,.text-gray-10{color:#e6e6e6}.hover\:text-gray-30:hover,.text-gray-30{color:#adadad}.hover\:text-gray-50:hover,.text-gray-50{color:#757575}.hover\:text-gray-70:hover,.text-gray-70{color:#454545}.hover\:text-gray-90:hover,.text-gray-90{color:#1b1b1b}.hover\:text-base-lightest:hover,.text-base-lightest{color:#f0f0f0}.hover\:text-base-lighter:hover,.text-base-lighter{color:#dfe1e2}.hover\:text-base-light:hover,.text-base-light{color:#a9aeb1}.hover\:text-base:hover,.text-base{color:#71767a}.hover\:text-base-dark:hover,.text-base-dark{color:#565c65}.hover\:text-base-darker:hover,.text-base-darker{color:#3d4551}.hover\:text-base-darkest:hover,.hover\:text-ink:hover,.text-base-darkest,.text-ink{color:#1b1b1b}.hover\:text-primary-lighter:hover,.text-primary-lighter{color:#d9e8f6}.hover\:text-primary-light:hover,.text-primary-light{color:#73b3e7}.hover\:text-primary:hover,.text-primary{color:#005ea2}.hover\:text-primary-vivid:hover,.text-primary-vivid{color:#0050d8}.hover\:text-primary-dark:hover,.text-primary-dark{color:#1a4480}.hover\:text-primary-darker:hover,.text-primary-darker{color:#162e51}.hover\:text-secondary-lighter:hover,.text-secondary-lighter{color:#f3e1e4}.hover\:text-secondary-light:hover,.text-secondary-light{color:#f2938c}.hover\:text-secondary:hover,.text-secondary{color:#d83933}.hover\:text-secondary-vivid:hover,.text-secondary-vivid{color:#e41d3d}.hover\:text-secondary-dark:hover,.text-secondary-dark{color:#b50909}.hover\:text-secondary-darker:hover,.text-secondary-darker{color:#8b0a03}.hover\:text-accent-warm-darker:hover,.text-accent-warm-darker{color:#775540}.hover\:text-accent-warm-dark:hover,.text-accent-warm-dark{color:#c05600}.hover\:text-accent-warm:hover,.text-accent-warm{color:#fa9441}.hover\:text-accent-warm-light:hover,.text-accent-warm-light{color:#ffbc78}.hover\:text-accent-warm-lighter:hover,.text-accent-warm-lighter{color:#f2e4d4}.hover\:text-accent-cool-darker:hover,.text-accent-cool-darker{color:#07648d}.hover\:text-accent-cool-dark:hover,.text-accent-cool-dark{color:#28a0cb}.hover\:text-accent-cool:hover,.text-accent-cool{color:#00bde3}.hover\:text-accent-cool-light:hover,.text-accent-cool-light{color:#97d4ea}.hover\:text-accent-cool-lighter:hover,.text-accent-cool-lighter{color:#e1f3f8}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.display-block{display:block}.display-flex{display:flex}.display-none{display:none}.display-inline{display:inline}.display-inline-block{display:inline-block}.display-inline-flex{display:inline-flex}.display-table{display:table}.display-table-cell{display:table-cell}.display-table-row{display:table-row}.flex-1{flex:1 1}.flex-2{flex:2 1}.flex-3{flex:3 1}.flex-4{flex:4 1}.flex-5{flex:5 1}.flex-6{flex:6 1}.flex-7{flex:7 1}.flex-8{flex:8 1}.flex-9{flex:9 1}.flex-10{flex:10 1}.flex-11{flex:11 1}.flex-12{flex:12 1}.flex-fill{flex:1 1}.flex-auto{flex:0 1 auto}.flex-row{flex-direction:row}.flex-column{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.float-left{float:left}.float-none{float:none}.float-right{float:right}.font-mono-3xs{font-size:.77rem}.font-mono-2xs{font-size:.83rem}.font-mono-xs{font-size:.89rem}.font-mono-sm{font-size:.95rem}.font-mono-md{font-size:1.01rem}.font-mono-lg{font-size:1.31rem}.font-mono-xl{font-size:1.91rem}.font-mono-2xl{font-size:2.38rem}.font-mono-3xl{font-size:2.86rem}.font-sans-3xs{font-size:.87rem}.font-sans-2xs{font-size:.93rem}.font-sans-xs{font-size:1rem}.font-sans-sm{font-size:1.06rem}.font-sans-md{font-size:1.13rem}.font-sans-lg{font-size:1.46rem}.font-sans-xl{font-size:2.13rem}.font-sans-2xl{font-size:2.66rem}.font-sans-3xl{font-size:3.19rem}.font-serif-3xs{font-size:.79rem}.font-serif-2xs{font-size:.85rem}.font-serif-xs{font-size:.91rem}.font-serif-sm{font-size:.98rem}.font-serif-md{font-size:1.04rem}.font-serif-lg{font-size:1.34rem}.font-serif-xl{font-size:1.95rem}.font-serif-2xl{font-size:2.44rem}.font-serif-3xl{font-size:2.93rem}.font-heading-3xs{font-size:.87rem}.font-heading-2xs{font-size:.93rem}.font-heading-xs{font-size:1rem}.font-heading-sm{font-size:1.06rem}.font-heading-md{font-size:1.13rem}.font-heading-lg{font-size:1.46rem}.font-heading-xl{font-size:2.13rem}.font-heading-2xl{font-size:2.66rem}.font-heading-3xl{font-size:3.19rem}.font-body-3xs{font-size:.87rem}.font-body-2xs{font-size:.93rem}.font-body-xs{font-size:1rem}.font-body-sm{font-size:1.06rem}.font-body-md{font-size:1.13rem}.font-body-lg{font-size:1.46rem}.font-body-xl{font-size:2.13rem}.font-body-2xl{font-size:2.66rem}.font-body-3xl{font-size:3.19rem}.font-code-3xs{font-size:.77rem}.font-code-2xs{font-size:.83rem}.font-code-xs{font-size:.89rem}.font-code-sm{font-size:.95rem}.font-code-md{font-size:1.01rem}.font-code-lg{font-size:1.31rem}.font-code-xl{font-size:1.91rem}.font-code-2xl{font-size:2.38rem}.font-code-3xl{font-size:2.86rem}.font-alt-3xs{font-size:.79rem}.font-alt-2xs{font-size:.85rem}.font-alt-xs{font-size:.91rem}.font-alt-sm{font-size:.98rem}.font-alt-md{font-size:1.04rem}.font-alt-lg{font-size:1.34rem}.font-alt-xl{font-size:1.95rem}.font-alt-2xl{font-size:2.44rem}.font-alt-3xl{font-size:2.93rem}.font-ui-3xs{font-size:.87rem}.font-ui-2xs{font-size:.93rem}.font-ui-xs{font-size:1rem}.font-ui-sm{font-size:1.06rem}.font-ui-md{font-size:1.13rem}.font-ui-lg{font-size:1.46rem}.font-ui-xl{font-size:2.13rem}.font-ui-2xl{font-size:2.66rem}.font-ui-3xl{font-size:3.19rem}.font-family-mono{font-family:Roboto Mono Web,Bitstream Vera Sans Mono,Consolas,Courier,monospace}.font-family-sans{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}.font-family-serif{font-family:Merriweather Web,Georgia,Cambria,Times New Roman,Times,serif}.font-family-body,.font-family-heading,.font-family-ui{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}.font-family-code{font-family:Roboto Mono Web,Bitstream Vera Sans Mono,Consolas,Courier,monospace}.font-family-alt{font-family:Merriweather Web,Georgia,Cambria,Times New Roman,Times,serif}.text-tabular{-webkit-font-feature-settings:"tnum" 1,"kern" 1;font-feature-settings:"tnum" 1,"kern" 1}.text-no-tabular{-webkit-font-feature-settings:"kern" 1;font-feature-settings:"kern" 1}.text-italic{font-style:italic}.text-no-italic{font-style:normal}.text-light{font-weight:300}.text-normal{font-weight:400}.text-bold{font-weight:700}.height-1px{height:1px}.height-2px{height:2px}.height-05{height:.25rem}.height-1{height:.5rem}.height-105{height:.75rem}.height-2{height:1rem}.height-205{height:1.25rem}.height-3{height:1.5rem}.height-4{height:2rem}.height-5{height:2.5rem}.height-6{height:3rem}.height-7{height:3.5rem}.height-8{height:4rem}.height-9{height:4.5rem}.height-10{height:5rem}.height-15{height:7.5rem}.height-card{height:10rem}.height-card-lg{height:15rem}.height-mobile{height:20rem}.height-0{height:0}.height-auto{height:auto}.height-full{height:100%}.height-viewport{height:100vh}.flex-justify-center{justify-content:center}.flex-justify-start{justify-content:flex-start}.flex-justify-end{justify-content:flex-end}.flex-justify{justify-content:space-between}.left-1px{left:1px}.left-2px{left:2px}.left-05{left:.25rem}.left-1{left:.5rem}.left-105{left:.75rem}.left-2{left:1rem}.left-205{left:1.25rem}.left-3{left:1.5rem}.left-neg-1px{left:-1px}.left-neg-2px{left:-2px}.left-neg-05{left:-.25rem}.left-neg-1{left:-.5rem}.left-neg-105{left:-.75rem}.left-neg-2{left:-1rem}.left-neg-205{left:-1.25rem}.left-neg-3{left:-1.5rem}.left-0{left:0}.left-auto{left:auto}.text-ls-auto{letter-spacing:normal}.text-ls-neg-3{letter-spacing:-.03em}.text-ls-neg-2{letter-spacing:-.02em}.text-ls-neg-1{letter-spacing:-.01em}.text-ls-1{letter-spacing:.025em}.text-ls-2{letter-spacing:.1em}.text-ls-3{letter-spacing:.15em}.line-height-sans-1{line-height:.9}.line-height-sans-2{line-height:1.1}.line-height-sans-3{line-height:1.3}.line-height-sans-4{line-height:1.4}.line-height-sans-5{line-height:1.5}.line-height-sans-6{line-height:1.6}.line-height-serif-1{line-height:1}.line-height-serif-2{line-height:1.2}.line-height-serif-3{line-height:1.4}.line-height-serif-4{line-height:1.5}.line-height-serif-5{line-height:1.7}.line-height-serif-6{line-height:1.8}.line-height-mono-1{line-height:1}.line-height-mono-2{line-height:1.3}.line-height-mono-3{line-height:1.4}.line-height-mono-4{line-height:1.6}.line-height-mono-5{line-height:1.7}.line-height-mono-6{line-height:1.8}.line-height-heading-1{line-height:.9}.line-height-heading-2{line-height:1.1}.line-height-heading-3{line-height:1.3}.line-height-heading-4{line-height:1.4}.line-height-heading-5{line-height:1.5}.line-height-heading-6{line-height:1.6}.line-height-ui-1{line-height:.9}.line-height-ui-2{line-height:1.1}.line-height-ui-3{line-height:1.3}.line-height-ui-4{line-height:1.4}.line-height-ui-5{line-height:1.5}.line-height-ui-6{line-height:1.6}.line-height-body-1{line-height:.9}.line-height-body-2{line-height:1.1}.line-height-body-3{line-height:1.3}.line-height-body-4{line-height:1.4}.line-height-body-5{line-height:1.5}.line-height-body-6{line-height:1.6}.line-height-code-1{line-height:1}.line-height-code-2{line-height:1.3}.line-height-code-3{line-height:1.4}.line-height-code-4{line-height:1.6}.line-height-code-5{line-height:1.7}.line-height-code-6{line-height:1.8}.line-height-alt-1{line-height:1}.line-height-alt-2{line-height:1.2}.line-height-alt-3{line-height:1.4}.line-height-alt-4{line-height:1.5}.line-height-alt-5{line-height:1.7}.line-height-alt-6{line-height:1.8}.margin-neg-1px{margin:-1px}.margin-neg-2px{margin:-2px}.margin-neg-05{margin:-.25rem}.margin-neg-1{margin:-.5rem}.margin-neg-105{margin:-.75rem}.margin-neg-2{margin:-1rem}.margin-neg-205{margin:-1.25rem}.margin-neg-3{margin:-1.5rem}.margin-1px{margin:1px}.margin-2px{margin:2px}.margin-05{margin:.25rem}.margin-1{margin:.5rem}.margin-105{margin:.75rem}.margin-2{margin:1rem}.margin-205{margin:1.25rem}.margin-3{margin:1.5rem}.margin-4{margin:2rem}.margin-5{margin:2.5rem}.margin-6{margin:3rem}.margin-7{margin:3.5rem}.margin-8{margin:4rem}.margin-9{margin:4.5rem}.margin-10{margin:5rem}.margin-15{margin:7.5rem}.margin-05em{margin:.5em}.margin-1em{margin:1em}.margin-105em{margin:1.5em}.margin-2em{margin:2em}.margin-0{margin:0}.margin-y-1px{margin-bottom:1px}.margin-top-1px,.margin-y-1px{margin-top:1px}.margin-bottom-1px{margin-bottom:1px}.margin-y-2px{margin-bottom:2px}.margin-top-2px,.margin-y-2px{margin-top:2px}.margin-bottom-2px{margin-bottom:2px}.margin-y-05{margin-bottom:.25rem}.margin-top-05,.margin-y-05{margin-top:.25rem}.margin-bottom-05{margin-bottom:.25rem}.margin-y-1{margin-bottom:.5rem}.margin-top-1,.margin-y-1{margin-top:.5rem}.margin-bottom-1{margin-bottom:.5rem}.margin-y-105{margin-bottom:.75rem}.margin-top-105,.margin-y-105{margin-top:.75rem}.margin-bottom-105{margin-bottom:.75rem}.margin-y-2{margin-bottom:1rem}.margin-top-2,.margin-y-2{margin-top:1rem}.margin-bottom-2{margin-bottom:1rem}.margin-y-205{margin-bottom:1.25rem}.margin-top-205,.margin-y-205{margin-top:1.25rem}.margin-bottom-205{margin-bottom:1.25rem}.margin-y-3{margin-bottom:1.5rem}.margin-top-3,.margin-y-3{margin-top:1.5rem}.margin-bottom-3{margin-bottom:1.5rem}.margin-y-neg-1px{margin-bottom:-1px;margin-top:-1px}.margin-top-neg-1px{margin-top:-1px}.margin-bottom-neg-1px{margin-bottom:-1px}.margin-y-neg-2px{margin-bottom:-2px;margin-top:-2px}.margin-top-neg-2px{margin-top:-2px}.margin-bottom-neg-2px{margin-bottom:-2px}.margin-y-neg-05{margin-bottom:-.25rem}.margin-top-neg-05,.margin-y-neg-05{margin-top:-.25rem}.margin-bottom-neg-05{margin-bottom:-.25rem}.margin-y-neg-1{margin-bottom:-.5rem}.margin-top-neg-1,.margin-y-neg-1{margin-top:-.5rem}.margin-bottom-neg-1{margin-bottom:-.5rem}.margin-y-neg-105{margin-bottom:-.75rem}.margin-top-neg-105,.margin-y-neg-105{margin-top:-.75rem}.margin-bottom-neg-105{margin-bottom:-.75rem}.margin-y-neg-2{margin-bottom:-1rem}.margin-top-neg-2,.margin-y-neg-2{margin-top:-1rem}.margin-bottom-neg-2{margin-bottom:-1rem}.margin-y-neg-205{margin-bottom:-1.25rem}.margin-top-neg-205,.margin-y-neg-205{margin-top:-1.25rem}.margin-bottom-neg-205{margin-bottom:-1.25rem}.margin-y-neg-3{margin-bottom:-1.5rem}.margin-top-neg-3,.margin-y-neg-3{margin-top:-1.5rem}.margin-bottom-neg-3{margin-bottom:-1.5rem}.margin-y-4{margin-bottom:2rem}.margin-top-4,.margin-y-4{margin-top:2rem}.margin-bottom-4{margin-bottom:2rem}.margin-y-5{margin-bottom:2.5rem}.margin-top-5,.margin-y-5{margin-top:2.5rem}.margin-bottom-5{margin-bottom:2.5rem}.margin-y-6{margin-bottom:3rem}.margin-top-6,.margin-y-6{margin-top:3rem}.margin-bottom-6{margin-bottom:3rem}.margin-y-7{margin-bottom:3.5rem}.margin-top-7,.margin-y-7{margin-top:3.5rem}.margin-bottom-7{margin-bottom:3.5rem}.margin-y-8{margin-bottom:4rem}.margin-top-8,.margin-y-8{margin-top:4rem}.margin-bottom-8{margin-bottom:4rem}.margin-y-9{margin-bottom:4.5rem}.margin-top-9,.margin-y-9{margin-top:4.5rem}.margin-bottom-9{margin-bottom:4.5rem}.margin-y-10{margin-bottom:5rem}.margin-top-10,.margin-y-10{margin-top:5rem}.margin-bottom-10{margin-bottom:5rem}.margin-y-15{margin-bottom:7.5rem}.margin-top-15,.margin-y-15{margin-top:7.5rem}.margin-bottom-15{margin-bottom:7.5rem}.margin-y-05em{margin-bottom:.5em}.margin-top-05em,.margin-y-05em{margin-top:.5em}.margin-bottom-05em{margin-bottom:.5em}.margin-y-1em{margin-bottom:1em}.margin-top-1em,.margin-y-1em{margin-top:1em}.margin-bottom-1em{margin-bottom:1em}.margin-y-105em{margin-bottom:1.5em}.margin-top-105em,.margin-y-105em{margin-top:1.5em}.margin-bottom-105em{margin-bottom:1.5em}.margin-y-2em{margin-bottom:2em}.margin-top-2em,.margin-y-2em{margin-top:2em}.margin-bottom-2em{margin-bottom:2em}.margin-y-0{margin-bottom:0}.margin-top-0,.margin-y-0{margin-top:0}.margin-bottom-0{margin-bottom:0}.margin-y-auto{margin-bottom:auto}.margin-top-auto,.margin-y-auto{margin-top:auto}.margin-bottom-auto{margin-bottom:auto}.margin-x-1px{margin-left:1px}.margin-right-1px,.margin-x-1px{margin-right:1px}.margin-left-1px{margin-left:1px}.margin-x-2px{margin-left:2px}.margin-right-2px,.margin-x-2px{margin-right:2px}.margin-left-2px{margin-left:2px}.margin-x-05{margin-left:.25rem}.margin-right-05,.margin-x-05{margin-right:.25rem}.margin-left-05{margin-left:.25rem}.margin-x-1{margin-left:.5rem}.margin-right-1,.margin-x-1{margin-right:.5rem}.margin-left-1{margin-left:.5rem}.margin-x-105{margin-left:.75rem}.margin-right-105,.margin-x-105{margin-right:.75rem}.margin-left-105{margin-left:.75rem}.margin-x-2{margin-left:1rem}.margin-right-2,.margin-x-2{margin-right:1rem}.margin-left-2{margin-left:1rem}.margin-x-205{margin-left:1.25rem}.margin-right-205,.margin-x-205{margin-right:1.25rem}.margin-left-205{margin-left:1.25rem}.margin-x-3{margin-left:1.5rem}.margin-right-3,.margin-x-3{margin-right:1.5rem}.margin-left-3{margin-left:1.5rem}.margin-x-neg-1px{margin-left:-1px;margin-right:-1px}.margin-right-neg-1px{margin-right:-1px}.margin-left-neg-1px{margin-left:-1px}.margin-x-neg-2px{margin-left:-2px;margin-right:-2px}.margin-right-neg-2px{margin-right:-2px}.margin-left-neg-2px{margin-left:-2px}.margin-x-neg-05{margin-left:-.25rem}.margin-right-neg-05,.margin-x-neg-05{margin-right:-.25rem}.margin-left-neg-05{margin-left:-.25rem}.margin-x-neg-1{margin-left:-.5rem}.margin-right-neg-1,.margin-x-neg-1{margin-right:-.5rem}.margin-left-neg-1{margin-left:-.5rem}.margin-x-neg-105{margin-left:-.75rem}.margin-right-neg-105,.margin-x-neg-105{margin-right:-.75rem}.margin-left-neg-105{margin-left:-.75rem}.margin-x-neg-2{margin-left:-1rem}.margin-right-neg-2,.margin-x-neg-2{margin-right:-1rem}.margin-left-neg-2{margin-left:-1rem}.margin-x-neg-205{margin-left:-1.25rem}.margin-right-neg-205,.margin-x-neg-205{margin-right:-1.25rem}.margin-left-neg-205{margin-left:-1.25rem}.margin-x-neg-3{margin-left:-1.5rem}.margin-right-neg-3,.margin-x-neg-3{margin-right:-1.5rem}.margin-left-neg-3{margin-left:-1.5rem}.margin-x-4{margin-left:2rem}.margin-right-4,.margin-x-4{margin-right:2rem}.margin-left-4{margin-left:2rem}.margin-x-5{margin-left:2.5rem}.margin-right-5,.margin-x-5{margin-right:2.5rem}.margin-left-5{margin-left:2.5rem}.margin-x-6{margin-left:3rem}.margin-right-6,.margin-x-6{margin-right:3rem}.margin-left-6{margin-left:3rem}.margin-x-7{margin-left:3.5rem}.margin-right-7,.margin-x-7{margin-right:3.5rem}.margin-left-7{margin-left:3.5rem}.margin-x-8{margin-left:4rem}.margin-right-8,.margin-x-8{margin-right:4rem}.margin-left-8{margin-left:4rem}.margin-x-9{margin-left:4.5rem}.margin-right-9,.margin-x-9{margin-right:4.5rem}.margin-left-9{margin-left:4.5rem}.margin-x-10{margin-left:5rem}.margin-right-10,.margin-x-10{margin-right:5rem}.margin-left-10{margin-left:5rem}.margin-x-15{margin-left:7.5rem}.margin-right-15,.margin-x-15{margin-right:7.5rem}.margin-left-15{margin-left:7.5rem}.margin-x-card{margin-left:10rem}.margin-right-card,.margin-x-card{margin-right:10rem}.margin-left-card{margin-left:10rem}.margin-x-card-lg{margin-left:15rem}.margin-right-card-lg,.margin-x-card-lg{margin-right:15rem}.margin-left-card-lg{margin-left:15rem}.margin-x-mobile{margin-left:20rem}.margin-right-mobile,.margin-x-mobile{margin-right:20rem}.margin-left-mobile{margin-left:20rem}.margin-x-05em{margin-left:.5em}.margin-right-05em,.margin-x-05em{margin-right:.5em}.margin-left-05em{margin-left:.5em}.margin-x-1em{margin-left:1em}.margin-right-1em,.margin-x-1em{margin-right:1em}.margin-left-1em{margin-left:1em}.margin-x-105em{margin-left:1.5em}.margin-right-105em,.margin-x-105em{margin-right:1.5em}.margin-left-105em{margin-left:1.5em}.margin-x-2em{margin-left:2em}.margin-right-2em,.margin-x-2em{margin-right:2em}.margin-left-2em{margin-left:2em}.margin-x-0{margin-left:0}.margin-right-0,.margin-x-0{margin-right:0}.margin-left-0{margin-left:0}.margin-x-auto{margin-left:auto}.margin-right-auto,.margin-x-auto{margin-right:auto}.margin-left-auto{margin-left:auto}.maxh-05{max-height:.25rem}.maxh-1{max-height:.5rem}.maxh-105{max-height:.75rem}.maxh-2{max-height:1rem}.maxh-205{max-height:1.25rem}.maxh-3{max-height:1.5rem}.maxh-4{max-height:2rem}.maxh-5{max-height:2.5rem}.maxh-6{max-height:3rem}.maxh-7{max-height:3.5rem}.maxh-8{max-height:4rem}.maxh-9{max-height:4.5rem}.maxh-10{max-height:5rem}.maxh-15{max-height:7.5rem}.maxh-card{max-height:10rem}.maxh-card-lg{max-height:15rem}.maxh-mobile{max-height:20rem}.maxh-mobile-lg{max-height:30rem}.maxh-tablet{max-height:40rem}.maxh-tablet-lg{max-height:55rem}.maxh-none{max-height:none}.maxh-viewport{max-height:100vh}.maxw-05{max-width:.25rem}.maxw-1{max-width:.5rem}.maxw-105{max-width:.75rem}.maxw-2{max-width:1rem}.maxw-205{max-width:1.25rem}.maxw-3{max-width:1.5rem}.maxw-4{max-width:2rem}.maxw-5{max-width:2.5rem}.maxw-6{max-width:3rem}.maxw-7{max-width:3.5rem}.maxw-8{max-width:4rem}.maxw-9{max-width:4.5rem}.maxw-10{max-width:5rem}.maxw-15{max-width:7.5rem}.maxw-card{max-width:10rem}.maxw-card-lg{max-width:15rem}.maxw-mobile{max-width:20rem}.maxw-mobile-lg{max-width:30rem}.maxw-tablet{max-width:40rem}.maxw-tablet-lg{max-width:55rem}.maxw-desktop{max-width:64rem}.maxw-desktop-lg{max-width:75rem}.maxw-widescreen{max-width:87.5rem}.maxw-none{max-width:none}.maxw-full{max-width:100%}.measure-1{max-width:44ex}.measure-2{max-width:60ex}.measure-3{max-width:64ex}.measure-4{max-width:68ex}.measure-5{max-width:72ex}.measure-6{max-width:88ex}.measure-none{max-width:none}.minh-1px{min-height:1px}.minh-2px{min-height:2px}.minh-05{min-height:.25rem}.minh-1{min-height:.5rem}.minh-105{min-height:.75rem}.minh-2{min-height:1rem}.minh-205{min-height:1.25rem}.minh-3{min-height:1.5rem}.minh-4{min-height:2rem}.minh-5{min-height:2.5rem}.minh-6{min-height:3rem}.minh-7{min-height:3.5rem}.minh-8{min-height:4rem}.minh-9{min-height:4.5rem}.minh-10{min-height:5rem}.minh-15{min-height:7.5rem}.minh-card{min-height:10rem}.minh-card-lg{min-height:15rem}.minh-mobile{min-height:20rem}.minh-mobile-lg{min-height:30rem}.minh-tablet{min-height:40rem}.minh-tablet-lg{min-height:55rem}.minh-0{min-height:0}.minh-full{min-height:100%}.minh-viewport{min-height:100vh}.minw-05{min-width:.25rem}.minw-1{min-width:.5rem}.minw-105{min-width:.75rem}.minw-2{min-width:1rem}.minw-205{min-width:1.25rem}.minw-3{min-width:1.5rem}.minw-4{min-width:2rem}.minw-5{min-width:2.5rem}.minw-6{min-width:3rem}.minw-7{min-width:3.5rem}.minw-8{min-width:4rem}.minw-9{min-width:4.5rem}.minw-10{min-width:5rem}.minw-15{min-width:7.5rem}.minw-0{min-width:0}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.order-first{order:-1}.order-last{order:999}.order-0,.order-initial{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.outline-1px{outline:1px solid}.outline-2px{outline:2px solid}.outline-0{outline:0 solid}.outline-05{outline:.25rem solid}.outline-transparent{outline-color:transparent}.outline-black{outline-color:#000}.outline-white{outline-color:#fff}.outline-red{outline-color:#e52207}.outline-orange{outline-color:#e66f0e}.outline-gold{outline-color:#ffbe2e}.outline-yellow{outline-color:#fee685}.outline-green{outline-color:#538200}.outline-mint{outline-color:#04c585}.outline-cyan{outline-color:#009ec1}.outline-blue{outline-color:#0076d6}.outline-indigo{outline-color:#676cc8}.outline-violet{outline-color:#8168b3}.outline-magenta{outline-color:#d72d79}.outline-gray-5{outline-color:#f0f0f0}.outline-gray-10{outline-color:#e6e6e6}.outline-gray-30{outline-color:#adadad}.outline-gray-50{outline-color:#757575}.outline-gray-70{outline-color:#454545}.outline-gray-90{outline-color:#1b1b1b}.outline-base-lightest{outline-color:#f0f0f0}.outline-base-lighter{outline-color:#dfe1e2}.outline-base-light{outline-color:#a9aeb1}.outline-base{outline-color:#71767a}.outline-base-dark{outline-color:#565c65}.outline-base-darker{outline-color:#3d4551}.outline-base-darkest,.outline-ink{outline-color:#1b1b1b}.outline-primary-lighter{outline-color:#d9e8f6}.outline-primary-light{outline-color:#73b3e7}.outline-primary{outline-color:#005ea2}.outline-primary-vivid{outline-color:#0050d8}.outline-primary-dark{outline-color:#1a4480}.outline-primary-darker{outline-color:#162e51}.outline-secondary-lighter{outline-color:#f3e1e4}.outline-secondary-light{outline-color:#f2938c}.outline-secondary{outline-color:#d83933}.outline-secondary-vivid{outline-color:#e41d3d}.outline-secondary-dark{outline-color:#b50909}.outline-secondary-darker{outline-color:#8b0a03}.outline-accent-warm-darker{outline-color:#775540}.outline-accent-warm-dark{outline-color:#c05600}.outline-accent-warm{outline-color:#fa9441}.outline-accent-warm-light{outline-color:#ffbc78}.outline-accent-warm-lighter{outline-color:#f2e4d4}.outline-accent-cool-darker{outline-color:#07648d}.outline-accent-cool-dark{outline-color:#28a0cb}.outline-accent-cool{outline-color:#00bde3}.outline-accent-cool-light{outline-color:#97d4ea}.outline-accent-cool-lighter{outline-color:#e1f3f8}.overflow-hidden{overflow:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-scroll{overflow:scroll}.overflow-y-scroll{overflow-y:scroll}.overflow-x-scroll{overflow-x:scroll}.overflow-auto{overflow:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-auto{overflow-x:auto}.overflow-visible{overflow:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-visible{overflow-x:visible}.padding-1px{padding:1px}.padding-y-1px{padding-bottom:1px;padding-top:1px}.padding-x-1px{padding-left:1px;padding-right:1px}.padding-top-1px{padding-top:1px}.padding-right-1px{padding-right:1px}.padding-bottom-1px{padding-bottom:1px}.padding-left-1px{padding-left:1px}.padding-2px{padding:2px}.padding-y-2px{padding-bottom:2px;padding-top:2px}.padding-x-2px{padding-left:2px;padding-right:2px}.padding-top-2px{padding-top:2px}.padding-right-2px{padding-right:2px}.padding-bottom-2px{padding-bottom:2px}.padding-left-2px{padding-left:2px}.padding-05{padding:.25rem}.padding-y-05{padding-bottom:.25rem;padding-top:.25rem}.padding-x-05{padding-left:.25rem;padding-right:.25rem}.padding-top-05{padding-top:.25rem}.padding-right-05{padding-right:.25rem}.padding-bottom-05{padding-bottom:.25rem}.padding-left-05{padding-left:.25rem}.padding-1{padding:.5rem}.padding-y-1{padding-bottom:.5rem;padding-top:.5rem}.padding-x-1{padding-left:.5rem;padding-right:.5rem}.padding-top-1{padding-top:.5rem}.padding-right-1{padding-right:.5rem}.padding-bottom-1{padding-bottom:.5rem}.padding-left-1{padding-left:.5rem}.padding-105{padding:.75rem}.padding-y-105{padding-bottom:.75rem;padding-top:.75rem}.padding-x-105{padding-left:.75rem;padding-right:.75rem}.padding-top-105{padding-top:.75rem}.padding-right-105{padding-right:.75rem}.padding-bottom-105{padding-bottom:.75rem}.padding-left-105{padding-left:.75rem}.padding-2{padding:1rem}.padding-y-2{padding-bottom:1rem;padding-top:1rem}.padding-x-2{padding-left:1rem;padding-right:1rem}.padding-top-2{padding-top:1rem}.padding-right-2{padding-right:1rem}.padding-bottom-2{padding-bottom:1rem}.padding-left-2{padding-left:1rem}.padding-205{padding:1.25rem}.padding-y-205{padding-bottom:1.25rem;padding-top:1.25rem}.padding-x-205{padding-left:1.25rem;padding-right:1.25rem}.padding-top-205{padding-top:1.25rem}.padding-right-205{padding-right:1.25rem}.padding-bottom-205{padding-bottom:1.25rem}.padding-left-205{padding-left:1.25rem}.padding-3{padding:1.5rem}.padding-y-3{padding-bottom:1.5rem;padding-top:1.5rem}.padding-x-3{padding-left:1.5rem;padding-right:1.5rem}.padding-top-3{padding-top:1.5rem}.padding-right-3{padding-right:1.5rem}.padding-bottom-3{padding-bottom:1.5rem}.padding-left-3{padding-left:1.5rem}.padding-4{padding:2rem}.padding-y-4{padding-bottom:2rem;padding-top:2rem}.padding-x-4{padding-left:2rem;padding-right:2rem}.padding-top-4{padding-top:2rem}.padding-right-4{padding-right:2rem}.padding-bottom-4{padding-bottom:2rem}.padding-left-4{padding-left:2rem}.padding-5{padding:2.5rem}.padding-y-5{padding-bottom:2.5rem;padding-top:2.5rem}.padding-x-5{padding-left:2.5rem;padding-right:2.5rem}.padding-top-5{padding-top:2.5rem}.padding-right-5{padding-right:2.5rem}.padding-bottom-5{padding-bottom:2.5rem}.padding-left-5{padding-left:2.5rem}.padding-6{padding:3rem}.padding-y-6{padding-bottom:3rem;padding-top:3rem}.padding-x-6{padding-left:3rem;padding-right:3rem}.padding-top-6{padding-top:3rem}.padding-right-6{padding-right:3rem}.padding-bottom-6{padding-bottom:3rem}.padding-left-6{padding-left:3rem}.padding-7{padding:3.5rem}.padding-y-7{padding-bottom:3.5rem;padding-top:3.5rem}.padding-x-7{padding-left:3.5rem;padding-right:3.5rem}.padding-top-7{padding-top:3.5rem}.padding-right-7{padding-right:3.5rem}.padding-bottom-7{padding-bottom:3.5rem}.padding-left-7{padding-left:3.5rem}.padding-8{padding:4rem}.padding-y-8{padding-bottom:4rem;padding-top:4rem}.padding-x-8{padding-left:4rem;padding-right:4rem}.padding-top-8{padding-top:4rem}.padding-right-8{padding-right:4rem}.padding-bottom-8{padding-bottom:4rem}.padding-left-8{padding-left:4rem}.padding-9{padding:4.5rem}.padding-y-9{padding-bottom:4.5rem;padding-top:4.5rem}.padding-x-9{padding-left:4.5rem;padding-right:4.5rem}.padding-top-9{padding-top:4.5rem}.padding-right-9{padding-right:4.5rem}.padding-bottom-9{padding-bottom:4.5rem}.padding-left-9{padding-left:4.5rem}.padding-10{padding:5rem}.padding-y-10{padding-bottom:5rem;padding-top:5rem}.padding-x-10{padding-left:5rem;padding-right:5rem}.padding-top-10{padding-top:5rem}.padding-right-10{padding-right:5rem}.padding-bottom-10{padding-bottom:5rem}.padding-left-10{padding-left:5rem}.padding-15{padding:7.5rem}.padding-y-15{padding-bottom:7.5rem;padding-top:7.5rem}.padding-x-15{padding-left:7.5rem;padding-right:7.5rem}.padding-top-15{padding-top:7.5rem}.padding-right-15{padding-right:7.5rem}.padding-bottom-15{padding-bottom:7.5rem}.padding-left-15{padding-left:7.5rem}.padding-0{padding:0}.padding-y-0{padding-bottom:0;padding-top:0}.padding-x-0{padding-left:0;padding-right:0}.padding-top-0{padding-top:0}.padding-right-0{padding-right:0}.padding-bottom-0{padding-bottom:0}.padding-left-0{padding-left:0}.pin-all{bottom:0;top:0}.pin-all,.pin-x{left:0;position:absolute;right:0}.pin-y{top:0}.pin-bottom,.pin-y{bottom:0;position:absolute}.pin-left{left:0;position:absolute}.pin-right{position:absolute;right:0}.pin-top{position:absolute;top:0}.pin-none{bottom:auto;left:auto;position:static;right:auto;top:auto}.position-absolute{position:absolute}.position-fixed{position:fixed}.position-relative{position:relative}.position-static{position:static}.position-sticky{position:sticky}.right-1px{right:1px}.right-2px{right:2px}.right-05{right:.25rem}.right-1{right:.5rem}.right-105{right:.75rem}.right-2{right:1rem}.right-205{right:1.25rem}.right-3{right:1.5rem}.right-neg-1px{right:-1px}.right-neg-2px{right:-2px}.right-neg-05{right:-.25rem}.right-neg-1{right:-.5rem}.right-neg-105{right:-.75rem}.right-neg-2{right:-1rem}.right-neg-205{right:-1.25rem}.right-neg-3{right:-1.5rem}.right-0{right:0}.right-auto{right:auto}.square-1px{height:1px;width:1px}.square-2px{height:2px;width:2px}.square-05{height:.25rem;width:.25rem}.square-1{height:.5rem;width:.5rem}.square-105{height:.75rem;width:.75rem}.square-2{height:1rem;width:1rem}.square-205{height:1.25rem;width:1.25rem}.square-3{height:1.5rem;width:1.5rem}.square-4{height:2rem;width:2rem}.square-5{height:2.5rem;width:2.5rem}.square-6{height:3rem;width:3rem}.square-7{height:3.5rem;width:3.5rem}.square-8{height:4rem;width:4rem}.square-9{height:4.5rem;width:4.5rem}.square-10{height:5rem;width:5rem}.square-15{height:7.5rem;width:7.5rem}.square-card{height:10rem;width:10rem}.square-card-lg{height:15rem;width:15rem}.square-mobile{height:20rem;width:20rem}.text-center{text-align:center}.text-left{text-align:left}.text-justify{text-align:justify}.text-right{text-align:right}.hover\:text-strike:hover,.text-strike{text-decoration:line-through}.hover\:text-underline:hover,.text-underline{text-decoration:underline}.hover\:text-no-strike:hover,.hover\:text-no-underline:hover,.text-no-strike,.text-no-underline{text-decoration:none}.hover\:underline-red:hover,.underline-red{-webkit-text-decoration-color:#e52207;text-decoration-color:#e52207}.hover\:underline-orange:hover,.underline-orange{-webkit-text-decoration-color:#e66f0e;text-decoration-color:#e66f0e}.hover\:underline-gold:hover,.underline-gold{-webkit-text-decoration-color:#ffbe2e;text-decoration-color:#ffbe2e}.hover\:underline-yellow:hover,.underline-yellow{-webkit-text-decoration-color:#fee685;text-decoration-color:#fee685}.hover\:underline-green:hover,.underline-green{-webkit-text-decoration-color:#538200;text-decoration-color:#538200}.hover\:underline-mint:hover,.underline-mint{-webkit-text-decoration-color:#04c585;text-decoration-color:#04c585}.hover\:underline-cyan:hover,.underline-cyan{-webkit-text-decoration-color:#009ec1;text-decoration-color:#009ec1}.hover\:underline-blue:hover,.underline-blue{-webkit-text-decoration-color:#0076d6;text-decoration-color:#0076d6}.hover\:underline-indigo:hover,.underline-indigo{-webkit-text-decoration-color:#676cc8;text-decoration-color:#676cc8}.hover\:underline-violet:hover,.underline-violet{-webkit-text-decoration-color:#8168b3;text-decoration-color:#8168b3}.hover\:underline-magenta:hover,.underline-magenta{-webkit-text-decoration-color:#d72d79;text-decoration-color:#d72d79}.hover\:underline-gray-5:hover,.underline-gray-5{-webkit-text-decoration-color:#f0f0f0;text-decoration-color:#f0f0f0}.hover\:underline-gray-10:hover,.underline-gray-10{-webkit-text-decoration-color:#e6e6e6;text-decoration-color:#e6e6e6}.hover\:underline-gray-30:hover,.underline-gray-30{-webkit-text-decoration-color:#adadad;text-decoration-color:#adadad}.hover\:underline-gray-50:hover,.underline-gray-50{-webkit-text-decoration-color:#757575;text-decoration-color:#757575}.hover\:underline-gray-70:hover,.underline-gray-70{-webkit-text-decoration-color:#454545;text-decoration-color:#454545}.hover\:underline-gray-90:hover,.underline-gray-90{-webkit-text-decoration-color:#1b1b1b;text-decoration-color:#1b1b1b}.hover\:underline-base-lightest:hover,.underline-base-lightest{-webkit-text-decoration-color:#f0f0f0;text-decoration-color:#f0f0f0}.hover\:underline-base-lighter:hover,.underline-base-lighter{-webkit-text-decoration-color:#dfe1e2;text-decoration-color:#dfe1e2}.hover\:underline-base-light:hover,.underline-base-light{-webkit-text-decoration-color:#a9aeb1;text-decoration-color:#a9aeb1}.hover\:underline-base:hover,.underline-base{-webkit-text-decoration-color:#71767a;text-decoration-color:#71767a}.hover\:underline-base-dark:hover,.underline-base-dark{-webkit-text-decoration-color:#565c65;text-decoration-color:#565c65}.hover\:underline-base-darker:hover,.underline-base-darker{-webkit-text-decoration-color:#3d4551;text-decoration-color:#3d4551}.hover\:underline-base-darkest:hover,.hover\:underline-ink:hover,.underline-base-darkest,.underline-ink{-webkit-text-decoration-color:#1b1b1b;text-decoration-color:#1b1b1b}.hover\:underline-primary-lighter:hover,.underline-primary-lighter{-webkit-text-decoration-color:#d9e8f6;text-decoration-color:#d9e8f6}.hover\:underline-primary-light:hover,.underline-primary-light{-webkit-text-decoration-color:#73b3e7;text-decoration-color:#73b3e7}.hover\:underline-primary:hover,.underline-primary{-webkit-text-decoration-color:#005ea2;text-decoration-color:#005ea2}.hover\:underline-primary-vivid:hover,.underline-primary-vivid{-webkit-text-decoration-color:#0050d8;text-decoration-color:#0050d8}.hover\:underline-primary-dark:hover,.underline-primary-dark{-webkit-text-decoration-color:#1a4480;text-decoration-color:#1a4480}.hover\:underline-primary-darker:hover,.underline-primary-darker{-webkit-text-decoration-color:#162e51;text-decoration-color:#162e51}.hover\:underline-secondary-lighter:hover,.underline-secondary-lighter{-webkit-text-decoration-color:#f3e1e4;text-decoration-color:#f3e1e4}.hover\:underline-secondary-light:hover,.underline-secondary-light{-webkit-text-decoration-color:#f2938c;text-decoration-color:#f2938c}.hover\:underline-secondary:hover,.underline-secondary{-webkit-text-decoration-color:#d83933;text-decoration-color:#d83933}.hover\:underline-secondary-vivid:hover,.underline-secondary-vivid{-webkit-text-decoration-color:#e41d3d;text-decoration-color:#e41d3d}.hover\:underline-secondary-dark:hover,.underline-secondary-dark{-webkit-text-decoration-color:#b50909;text-decoration-color:#b50909}.hover\:underline-secondary-darker:hover,.underline-secondary-darker{-webkit-text-decoration-color:#8b0a03;text-decoration-color:#8b0a03}.hover\:underline-accent-warm-darker:hover,.underline-accent-warm-darker{-webkit-text-decoration-color:#775540;text-decoration-color:#775540}.hover\:underline-accent-warm-dark:hover,.underline-accent-warm-dark{-webkit-text-decoration-color:#c05600;text-decoration-color:#c05600}.hover\:underline-accent-warm:hover,.underline-accent-warm{-webkit-text-decoration-color:#fa9441;text-decoration-color:#fa9441}.hover\:underline-accent-warm-light:hover,.underline-accent-warm-light{-webkit-text-decoration-color:#ffbc78;text-decoration-color:#ffbc78}.hover\:underline-accent-warm-lighter:hover,.underline-accent-warm-lighter{-webkit-text-decoration-color:#f2e4d4;text-decoration-color:#f2e4d4}.hover\:underline-accent-cool-darker:hover,.underline-accent-cool-darker{-webkit-text-decoration-color:#07648d;text-decoration-color:#07648d}.hover\:underline-accent-cool-dark:hover,.underline-accent-cool-dark{-webkit-text-decoration-color:#28a0cb;text-decoration-color:#28a0cb}.hover\:underline-accent-cool:hover,.underline-accent-cool{-webkit-text-decoration-color:#00bde3;text-decoration-color:#00bde3}.hover\:underline-accent-cool-light:hover,.underline-accent-cool-light{-webkit-text-decoration-color:#97d4ea;text-decoration-color:#97d4ea}.hover\:underline-accent-cool-lighter:hover,.underline-accent-cool-lighter{-webkit-text-decoration-color:#e1f3f8;text-decoration-color:#e1f3f8}.text-indent-0{text-indent:0}.text-indent-05{text-indent:.25rem}.text-indent-1{text-indent:.5rem}.text-indent-105{text-indent:.75rem}.text-indent-2{text-indent:1rem}.text-indent-205{text-indent:1.25rem}.text-indent-3{text-indent:1.5rem}.text-indent-neg-05{text-indent:-.25rem}.text-indent-neg-1{text-indent:-.5rem}.text-indent-neg-105{text-indent:-.75rem}.text-indent-neg-2{text-indent:-1rem}.text-indent-neg-205{text-indent:-1.25rem}.text-indent-neg-3{text-indent:-1.5rem}.text-indent-4{text-indent:2rem}.text-indent-5{text-indent:2.5rem}.text-indent-6{text-indent:3rem}.text-indent-7{text-indent:3.5rem}.text-indent-8{text-indent:4rem}.text-indent-9{text-indent:4.5rem}.text-indent-10{text-indent:5rem}.text-indent-15{text-indent:7.5rem}.text-indent-neg-4{text-indent:-2rem}.text-indent-neg-5{text-indent:-2.5rem}.text-indent-neg-6{text-indent:-3rem}.text-indent-neg-7{text-indent:-3.5rem}.text-indent-neg-8{text-indent:-4rem}.text-indent-neg-9{text-indent:-4.5rem}.text-indent-neg-10{text-indent:-5rem}.text-indent-neg-15{text-indent:-7.5rem}.text-uppercase{text-transform:uppercase}.text-no-uppercase{text-transform:none}.text-lowercase{text-transform:lowercase}.text-no-lowercase{text-transform:none}.top-1px{top:1px}.top-2px{top:2px}.top-05{top:.25rem}.top-1{top:.5rem}.top-105{top:.75rem}.top-2{top:1rem}.top-205{top:1.25rem}.top-3{top:1.5rem}.top-neg-1px{top:-1px}.top-neg-2px{top:-2px}.top-neg-05{top:-.25rem}.top-neg-1{top:-.5rem}.top-neg-105{top:-.75rem}.top-neg-2{top:-1rem}.top-neg-205{top:-1.25rem}.top-neg-3{top:-1.5rem}.top-0{top:0}.top-auto{top:auto}.text-baseline{vertical-align:baseline}.text-bottom{vertical-align:bottom}.text-middle{vertical-align:middle}.text-sub{vertical-align:sub}.text-super{vertical-align:super}.text-tbottom{vertical-align:text-bottom}.text-ttop{vertical-align:text-top}.text-top{vertical-align:top}.text-pre{white-space:pre}.text-pre-line{white-space:pre-line}.text-pre-wrap{white-space:pre-wrap}.text-wrap{white-space:normal}.text-no-wrap{white-space:nowrap}.width-1px{width:1px}.width-2px{width:2px}.width-05{width:.25rem}.width-1{width:.5rem}.width-105{width:.75rem}.width-2{width:1rem}.width-205{width:1.25rem}.width-3{width:1.5rem}.width-4{width:2rem}.width-5{width:2.5rem}.width-6{width:3rem}.width-7{width:3.5rem}.width-8{width:4rem}.width-9{width:4.5rem}.width-10{width:5rem}.width-15{width:7.5rem}.width-card{width:10rem}.width-card-lg{width:15rem}.width-mobile{width:20rem}.width-mobile-lg{width:30rem}.width-tablet{width:40rem}.width-tablet-lg{width:55rem}.width-desktop{width:64rem}.width-desktop-lg{width:75rem}.width-widescreen{width:87.5rem}.width-0{width:0}.width-full{width:100%}.width-auto{width:auto}.z-auto{z-index:auto}.z-bottom{z-index:-100}.z-top{z-index:99999}.z-0{z-index:0}.z-100{z-index:100}.z-200{z-index:200}.z-300{z-index:300}.z-400{z-index:400}.z-500{z-index:500}@media (min-width:30em){.mobile-lg\:border-1px,.mobile-lg\:hover\:border-1px:hover{border:1px solid}.mobile-lg\:border-y-1px,.mobile-lg\:hover\:border-y-1px:hover{border-bottom:1px solid;border-top:1px solid}.mobile-lg\:border-x-1px,.mobile-lg\:hover\:border-x-1px:hover{border-left:1px solid;border-right:1px solid}.mobile-lg\:border-top-1px,.mobile-lg\:hover\:border-top-1px:hover{border-top:1px solid}.mobile-lg\:border-right-1px,.mobile-lg\:hover\:border-right-1px:hover{border-right:1px solid}.mobile-lg\:border-bottom-1px,.mobile-lg\:hover\:border-bottom-1px:hover{border-bottom:1px solid}.mobile-lg\:border-left-1px,.mobile-lg\:hover\:border-left-1px:hover{border-left:1px solid}.mobile-lg\:border-2px,.mobile-lg\:hover\:border-2px:hover{border:2px solid}.mobile-lg\:border-y-2px,.mobile-lg\:hover\:border-y-2px:hover{border-bottom:2px solid;border-top:2px solid}.mobile-lg\:border-x-2px,.mobile-lg\:hover\:border-x-2px:hover{border-left:2px solid;border-right:2px solid}.mobile-lg\:border-top-2px,.mobile-lg\:hover\:border-top-2px:hover{border-top:2px solid}.mobile-lg\:border-right-2px,.mobile-lg\:hover\:border-right-2px:hover{border-right:2px solid}.mobile-lg\:border-bottom-2px,.mobile-lg\:hover\:border-bottom-2px:hover{border-bottom:2px solid}.mobile-lg\:border-left-2px,.mobile-lg\:hover\:border-left-2px:hover{border-left:2px solid}.mobile-lg\:border-05,.mobile-lg\:hover\:border-05:hover{border:.25rem solid}.mobile-lg\:border-y-05,.mobile-lg\:hover\:border-y-05:hover{border-bottom:.25rem solid;border-top:.25rem solid}.mobile-lg\:border-x-05,.mobile-lg\:hover\:border-x-05:hover{border-left:.25rem solid;border-right:.25rem solid}.mobile-lg\:border-top-05,.mobile-lg\:hover\:border-top-05:hover{border-top:.25rem solid}.mobile-lg\:border-right-05,.mobile-lg\:hover\:border-right-05:hover{border-right:.25rem solid}.mobile-lg\:border-bottom-05,.mobile-lg\:hover\:border-bottom-05:hover{border-bottom:.25rem solid}.mobile-lg\:border-left-05,.mobile-lg\:hover\:border-left-05:hover{border-left:.25rem solid}.mobile-lg\:border-1,.mobile-lg\:hover\:border-1:hover{border:.5rem solid}.mobile-lg\:border-y-1,.mobile-lg\:hover\:border-y-1:hover{border-bottom:.5rem solid;border-top:.5rem solid}.mobile-lg\:border-x-1,.mobile-lg\:hover\:border-x-1:hover{border-left:.5rem solid;border-right:.5rem solid}.mobile-lg\:border-top-1,.mobile-lg\:hover\:border-top-1:hover{border-top:.5rem solid}.mobile-lg\:border-right-1,.mobile-lg\:hover\:border-right-1:hover{border-right:.5rem solid}.mobile-lg\:border-bottom-1,.mobile-lg\:hover\:border-bottom-1:hover{border-bottom:.5rem solid}.mobile-lg\:border-left-1,.mobile-lg\:hover\:border-left-1:hover{border-left:.5rem solid}.mobile-lg\:border-105,.mobile-lg\:hover\:border-105:hover{border:.75rem solid}.mobile-lg\:border-y-105,.mobile-lg\:hover\:border-y-105:hover{border-bottom:.75rem solid;border-top:.75rem solid}.mobile-lg\:border-x-105,.mobile-lg\:hover\:border-x-105:hover{border-left:.75rem solid;border-right:.75rem solid}.mobile-lg\:border-top-105,.mobile-lg\:hover\:border-top-105:hover{border-top:.75rem solid}.mobile-lg\:border-right-105,.mobile-lg\:hover\:border-right-105:hover{border-right:.75rem solid}.mobile-lg\:border-bottom-105,.mobile-lg\:hover\:border-bottom-105:hover{border-bottom:.75rem solid}.mobile-lg\:border-left-105,.mobile-lg\:hover\:border-left-105:hover{border-left:.75rem solid}.mobile-lg\:border-2,.mobile-lg\:hover\:border-2:hover{border:1rem solid}.mobile-lg\:border-y-2,.mobile-lg\:hover\:border-y-2:hover{border-bottom:1rem solid;border-top:1rem solid}.mobile-lg\:border-x-2,.mobile-lg\:hover\:border-x-2:hover{border-left:1rem solid;border-right:1rem solid}.mobile-lg\:border-top-2,.mobile-lg\:hover\:border-top-2:hover{border-top:1rem solid}.mobile-lg\:border-right-2,.mobile-lg\:hover\:border-right-2:hover{border-right:1rem solid}.mobile-lg\:border-bottom-2,.mobile-lg\:hover\:border-bottom-2:hover{border-bottom:1rem solid}.mobile-lg\:border-left-2,.mobile-lg\:hover\:border-left-2:hover{border-left:1rem solid}.mobile-lg\:border-205,.mobile-lg\:hover\:border-205:hover{border:1.25rem solid}.mobile-lg\:border-y-205,.mobile-lg\:hover\:border-y-205:hover{border-bottom:1.25rem solid;border-top:1.25rem solid}.mobile-lg\:border-x-205,.mobile-lg\:hover\:border-x-205:hover{border-left:1.25rem solid;border-right:1.25rem solid}.mobile-lg\:border-top-205,.mobile-lg\:hover\:border-top-205:hover{border-top:1.25rem solid}.mobile-lg\:border-right-205,.mobile-lg\:hover\:border-right-205:hover{border-right:1.25rem solid}.mobile-lg\:border-bottom-205,.mobile-lg\:hover\:border-bottom-205:hover{border-bottom:1.25rem solid}.mobile-lg\:border-left-205,.mobile-lg\:hover\:border-left-205:hover{border-left:1.25rem solid}.mobile-lg\:border-3,.mobile-lg\:hover\:border-3:hover{border:1.5rem solid}.mobile-lg\:border-y-3,.mobile-lg\:hover\:border-y-3:hover{border-bottom:1.5rem solid;border-top:1.5rem solid}.mobile-lg\:border-x-3,.mobile-lg\:hover\:border-x-3:hover{border-left:1.5rem solid;border-right:1.5rem solid}.mobile-lg\:border-top-3,.mobile-lg\:hover\:border-top-3:hover{border-top:1.5rem solid}.mobile-lg\:border-right-3,.mobile-lg\:hover\:border-right-3:hover{border-right:1.5rem solid}.mobile-lg\:border-bottom-3,.mobile-lg\:hover\:border-bottom-3:hover{border-bottom:1.5rem solid}.mobile-lg\:border-left-3,.mobile-lg\:hover\:border-left-3:hover{border-left:1.5rem solid}.mobile-lg\:border-0,.mobile-lg\:hover\:border-0:hover{border:0 solid}.mobile-lg\:border-y-0,.mobile-lg\:hover\:border-y-0:hover{border-bottom:0 solid;border-top:0 solid}.mobile-lg\:border-x-0,.mobile-lg\:hover\:border-x-0:hover{border-left:0 solid;border-right:0 solid}.mobile-lg\:border-top-0,.mobile-lg\:hover\:border-top-0:hover{border-top:0 solid}.mobile-lg\:border-right-0,.mobile-lg\:hover\:border-right-0:hover{border-right:0 solid}.mobile-lg\:border-bottom-0,.mobile-lg\:hover\:border-bottom-0:hover{border-bottom:0 solid}.mobile-lg\:border-left-0,.mobile-lg\:hover\:border-left-0:hover{border-left:0 solid}.mobile-lg\:border,.mobile-lg\:hover\:border:hover{border:1px solid}.mobile-lg\:border-y,.mobile-lg\:hover\:border-y:hover{border-bottom:1px solid;border-top:1px solid}.mobile-lg\:border-x,.mobile-lg\:hover\:border-x:hover{border-left:1px solid;border-right:1px solid}.mobile-lg\:border-top,.mobile-lg\:hover\:border-top:hover{border-top:1px solid}.mobile-lg\:border-right,.mobile-lg\:hover\:border-right:hover{border-right:1px solid}.mobile-lg\:border-bottom,.mobile-lg\:hover\:border-bottom:hover{border-bottom:1px solid}.mobile-lg\:border-left,.mobile-lg\:hover\:border-left:hover{border-left:1px solid}.mobile-lg\:border-transparent,.mobile-lg\:hover\:border-transparent:hover{border-color:transparent}.mobile-lg\:border-black,.mobile-lg\:hover\:border-black:hover{border-color:#000}.mobile-lg\:border-white,.mobile-lg\:hover\:border-white:hover{border-color:#fff}.mobile-lg\:border-red,.mobile-lg\:hover\:border-red:hover{border-color:#e52207}.mobile-lg\:border-orange,.mobile-lg\:hover\:border-orange:hover{border-color:#e66f0e}.mobile-lg\:border-gold,.mobile-lg\:hover\:border-gold:hover{border-color:#ffbe2e}.mobile-lg\:border-yellow,.mobile-lg\:hover\:border-yellow:hover{border-color:#fee685}.mobile-lg\:border-green,.mobile-lg\:hover\:border-green:hover{border-color:#538200}.mobile-lg\:border-mint,.mobile-lg\:hover\:border-mint:hover{border-color:#04c585}.mobile-lg\:border-cyan,.mobile-lg\:hover\:border-cyan:hover{border-color:#009ec1}.mobile-lg\:border-blue,.mobile-lg\:hover\:border-blue:hover{border-color:#0076d6}.mobile-lg\:border-indigo,.mobile-lg\:hover\:border-indigo:hover{border-color:#676cc8}.mobile-lg\:border-violet,.mobile-lg\:hover\:border-violet:hover{border-color:#8168b3}.mobile-lg\:border-magenta,.mobile-lg\:hover\:border-magenta:hover{border-color:#d72d79}.mobile-lg\:border-gray-5,.mobile-lg\:hover\:border-gray-5:hover{border-color:#f0f0f0}.mobile-lg\:border-gray-10,.mobile-lg\:hover\:border-gray-10:hover{border-color:#e6e6e6}.mobile-lg\:border-gray-30,.mobile-lg\:hover\:border-gray-30:hover{border-color:#adadad}.mobile-lg\:border-gray-50,.mobile-lg\:hover\:border-gray-50:hover{border-color:#757575}.mobile-lg\:border-gray-70,.mobile-lg\:hover\:border-gray-70:hover{border-color:#454545}.mobile-lg\:border-gray-90,.mobile-lg\:hover\:border-gray-90:hover{border-color:#1b1b1b}.mobile-lg\:border-base-lightest,.mobile-lg\:hover\:border-base-lightest:hover{border-color:#f0f0f0}.mobile-lg\:border-base-lighter,.mobile-lg\:hover\:border-base-lighter:hover{border-color:#dfe1e2}.mobile-lg\:border-base-light,.mobile-lg\:hover\:border-base-light:hover{border-color:#a9aeb1}.mobile-lg\:border-base,.mobile-lg\:hover\:border-base:hover{border-color:#71767a}.mobile-lg\:border-base-dark,.mobile-lg\:hover\:border-base-dark:hover{border-color:#565c65}.mobile-lg\:border-base-darker,.mobile-lg\:hover\:border-base-darker:hover{border-color:#3d4551}.mobile-lg\:border-base-darkest,.mobile-lg\:border-ink,.mobile-lg\:hover\:border-base-darkest:hover,.mobile-lg\:hover\:border-ink:hover{border-color:#1b1b1b}.mobile-lg\:border-primary-lighter,.mobile-lg\:hover\:border-primary-lighter:hover{border-color:#d9e8f6}.mobile-lg\:border-primary-light,.mobile-lg\:hover\:border-primary-light:hover{border-color:#73b3e7}.mobile-lg\:border-primary,.mobile-lg\:hover\:border-primary:hover{border-color:#005ea2}.mobile-lg\:border-primary-vivid,.mobile-lg\:hover\:border-primary-vivid:hover{border-color:#0050d8}.mobile-lg\:border-primary-dark,.mobile-lg\:hover\:border-primary-dark:hover{border-color:#1a4480}.mobile-lg\:border-primary-darker,.mobile-lg\:hover\:border-primary-darker:hover{border-color:#162e51}.mobile-lg\:border-secondary-lighter,.mobile-lg\:hover\:border-secondary-lighter:hover{border-color:#f3e1e4}.mobile-lg\:border-secondary-light,.mobile-lg\:hover\:border-secondary-light:hover{border-color:#f2938c}.mobile-lg\:border-secondary,.mobile-lg\:hover\:border-secondary:hover{border-color:#d83933}.mobile-lg\:border-secondary-vivid,.mobile-lg\:hover\:border-secondary-vivid:hover{border-color:#e41d3d}.mobile-lg\:border-secondary-dark,.mobile-lg\:hover\:border-secondary-dark:hover{border-color:#b50909}.mobile-lg\:border-secondary-darker,.mobile-lg\:hover\:border-secondary-darker:hover{border-color:#8b0a03}.mobile-lg\:border-accent-warm-darker,.mobile-lg\:hover\:border-accent-warm-darker:hover{border-color:#775540}.mobile-lg\:border-accent-warm-dark,.mobile-lg\:hover\:border-accent-warm-dark:hover{border-color:#c05600}.mobile-lg\:border-accent-warm,.mobile-lg\:hover\:border-accent-warm:hover{border-color:#fa9441}.mobile-lg\:border-accent-warm-light,.mobile-lg\:hover\:border-accent-warm-light:hover{border-color:#ffbc78}.mobile-lg\:border-accent-warm-lighter,.mobile-lg\:hover\:border-accent-warm-lighter:hover{border-color:#f2e4d4}.mobile-lg\:border-accent-cool-darker,.mobile-lg\:hover\:border-accent-cool-darker:hover{border-color:#07648d}.mobile-lg\:border-accent-cool-dark,.mobile-lg\:hover\:border-accent-cool-dark:hover{border-color:#28a0cb}.mobile-lg\:border-accent-cool,.mobile-lg\:hover\:border-accent-cool:hover{border-color:#00bde3}.mobile-lg\:border-accent-cool-light,.mobile-lg\:hover\:border-accent-cool-light:hover{border-color:#97d4ea}.mobile-lg\:border-accent-cool-lighter,.mobile-lg\:hover\:border-accent-cool-lighter:hover{border-color:#e1f3f8}.mobile-lg\:radius-0{border-radius:0}.mobile-lg\:radius-top-0{border-top-left-radius:0;border-top-right-radius:0}.mobile-lg\:radius-right-0{border-bottom-right-radius:0;border-top-right-radius:0}.mobile-lg\:radius-bottom-0{border-bottom-left-radius:0;border-bottom-right-radius:0}.mobile-lg\:radius-left-0{border-bottom-left-radius:0;border-top-left-radius:0}.mobile-lg\:radius-none{border-radius:0}.mobile-lg\:radius-top-none{border-top-left-radius:0;border-top-right-radius:0}.mobile-lg\:radius-right-none{border-bottom-right-radius:0;border-top-right-radius:0}.mobile-lg\:radius-bottom-none{border-bottom-left-radius:0;border-bottom-right-radius:0}.mobile-lg\:radius-left-none{border-bottom-left-radius:0;border-top-left-radius:0}.mobile-lg\:radius-sm{border-radius:2px}.mobile-lg\:radius-top-sm{border-top-left-radius:2px;border-top-right-radius:2px}.mobile-lg\:radius-right-sm{border-bottom-right-radius:2px;border-top-right-radius:2px}.mobile-lg\:radius-bottom-sm{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.mobile-lg\:radius-left-sm{border-bottom-left-radius:2px;border-top-left-radius:2px}.mobile-lg\:radius-md{border-radius:.25rem}.mobile-lg\:radius-top-md{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.mobile-lg\:radius-right-md{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.mobile-lg\:radius-bottom-md{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.mobile-lg\:radius-left-md{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.mobile-lg\:radius-lg{border-radius:.5rem}.mobile-lg\:radius-top-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.mobile-lg\:radius-right-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.mobile-lg\:radius-bottom-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.mobile-lg\:radius-left-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.mobile-lg\:radius-pill{border-radius:99rem}.mobile-lg\:radius-top-pill{border-top-left-radius:99rem;border-top-right-radius:99rem}.mobile-lg\:radius-right-pill{border-bottom-right-radius:99rem;border-top-right-radius:99rem}.mobile-lg\:radius-bottom-pill{border-bottom-left-radius:99rem;border-bottom-right-radius:99rem}.mobile-lg\:radius-left-pill{border-bottom-left-radius:99rem;border-top-left-radius:99rem}.mobile-lg\:display-block{display:block}.mobile-lg\:display-flex{display:flex}.mobile-lg\:display-none{display:none}.mobile-lg\:display-inline{display:inline}.mobile-lg\:display-inline-block{display:inline-block}.mobile-lg\:display-inline-flex{display:inline-flex}.mobile-lg\:display-table{display:table}.mobile-lg\:display-table-cell{display:table-cell}.mobile-lg\:display-table-row{display:table-row}.mobile-lg\:font-mono-3xs{font-size:.77rem}.mobile-lg\:font-mono-2xs{font-size:.83rem}.mobile-lg\:font-mono-xs{font-size:.89rem}.mobile-lg\:font-mono-sm{font-size:.95rem}.mobile-lg\:font-mono-md{font-size:1.01rem}.mobile-lg\:font-mono-lg{font-size:1.31rem}.mobile-lg\:font-mono-xl{font-size:1.91rem}.mobile-lg\:font-mono-2xl{font-size:2.38rem}.mobile-lg\:font-mono-3xl{font-size:2.86rem}.mobile-lg\:font-sans-3xs{font-size:.87rem}.mobile-lg\:font-sans-2xs{font-size:.93rem}.mobile-lg\:font-sans-xs{font-size:1rem}.mobile-lg\:font-sans-sm{font-size:1.06rem}.mobile-lg\:font-sans-md{font-size:1.13rem}.mobile-lg\:font-sans-lg{font-size:1.46rem}.mobile-lg\:font-sans-xl{font-size:2.13rem}.mobile-lg\:font-sans-2xl{font-size:2.66rem}.mobile-lg\:font-sans-3xl{font-size:3.19rem}.mobile-lg\:font-serif-3xs{font-size:.79rem}.mobile-lg\:font-serif-2xs{font-size:.85rem}.mobile-lg\:font-serif-xs{font-size:.91rem}.mobile-lg\:font-serif-sm{font-size:.98rem}.mobile-lg\:font-serif-md{font-size:1.04rem}.mobile-lg\:font-serif-lg{font-size:1.34rem}.mobile-lg\:font-serif-xl{font-size:1.95rem}.mobile-lg\:font-serif-2xl{font-size:2.44rem}.mobile-lg\:font-serif-3xl{font-size:2.93rem}.mobile-lg\:font-heading-3xs{font-size:.87rem}.mobile-lg\:font-heading-2xs{font-size:.93rem}.mobile-lg\:font-heading-xs{font-size:1rem}.mobile-lg\:font-heading-sm{font-size:1.06rem}.mobile-lg\:font-heading-md{font-size:1.13rem}.mobile-lg\:font-heading-lg{font-size:1.46rem}.mobile-lg\:font-heading-xl{font-size:2.13rem}.mobile-lg\:font-heading-2xl{font-size:2.66rem}.mobile-lg\:font-heading-3xl{font-size:3.19rem}.mobile-lg\:font-body-3xs{font-size:.87rem}.mobile-lg\:font-body-2xs{font-size:.93rem}.mobile-lg\:font-body-xs{font-size:1rem}.mobile-lg\:font-body-sm{font-size:1.06rem}.mobile-lg\:font-body-md{font-size:1.13rem}.mobile-lg\:font-body-lg{font-size:1.46rem}.mobile-lg\:font-body-xl{font-size:2.13rem}.mobile-lg\:font-body-2xl{font-size:2.66rem}.mobile-lg\:font-body-3xl{font-size:3.19rem}.mobile-lg\:font-code-3xs{font-size:.77rem}.mobile-lg\:font-code-2xs{font-size:.83rem}.mobile-lg\:font-code-xs{font-size:.89rem}.mobile-lg\:font-code-sm{font-size:.95rem}.mobile-lg\:font-code-md{font-size:1.01rem}.mobile-lg\:font-code-lg{font-size:1.31rem}.mobile-lg\:font-code-xl{font-size:1.91rem}.mobile-lg\:font-code-2xl{font-size:2.38rem}.mobile-lg\:font-code-3xl{font-size:2.86rem}.mobile-lg\:font-alt-3xs{font-size:.79rem}.mobile-lg\:font-alt-2xs{font-size:.85rem}.mobile-lg\:font-alt-xs{font-size:.91rem}.mobile-lg\:font-alt-sm{font-size:.98rem}.mobile-lg\:font-alt-md{font-size:1.04rem}.mobile-lg\:font-alt-lg{font-size:1.34rem}.mobile-lg\:font-alt-xl{font-size:1.95rem}.mobile-lg\:font-alt-2xl{font-size:2.44rem}.mobile-lg\:font-alt-3xl{font-size:2.93rem}.mobile-lg\:font-ui-3xs{font-size:.87rem}.mobile-lg\:font-ui-2xs{font-size:.93rem}.mobile-lg\:font-ui-xs{font-size:1rem}.mobile-lg\:font-ui-sm{font-size:1.06rem}.mobile-lg\:font-ui-md{font-size:1.13rem}.mobile-lg\:font-ui-lg{font-size:1.46rem}.mobile-lg\:font-ui-xl{font-size:2.13rem}.mobile-lg\:font-ui-2xl{font-size:2.66rem}.mobile-lg\:font-ui-3xl{font-size:3.19rem}.mobile-lg\:text-light{font-weight:300}.mobile-lg\:text-normal{font-weight:400}.mobile-lg\:text-bold{font-weight:700}.mobile-lg\:flex-justify-center{justify-content:center}.mobile-lg\:flex-justify-start{justify-content:flex-start}.mobile-lg\:flex-justify-end{justify-content:flex-end}.mobile-lg\:flex-justify{justify-content:space-between}.mobile-lg\:line-height-sans-1{line-height:.9}.mobile-lg\:line-height-sans-2{line-height:1.1}.mobile-lg\:line-height-sans-3{line-height:1.3}.mobile-lg\:line-height-sans-4{line-height:1.4}.mobile-lg\:line-height-sans-5{line-height:1.5}.mobile-lg\:line-height-sans-6{line-height:1.6}.mobile-lg\:line-height-serif-1{line-height:1}.mobile-lg\:line-height-serif-2{line-height:1.2}.mobile-lg\:line-height-serif-3{line-height:1.4}.mobile-lg\:line-height-serif-4{line-height:1.5}.mobile-lg\:line-height-serif-5{line-height:1.7}.mobile-lg\:line-height-serif-6{line-height:1.8}.mobile-lg\:line-height-mono-1{line-height:1}.mobile-lg\:line-height-mono-2{line-height:1.3}.mobile-lg\:line-height-mono-3{line-height:1.4}.mobile-lg\:line-height-mono-4{line-height:1.6}.mobile-lg\:line-height-mono-5{line-height:1.7}.mobile-lg\:line-height-mono-6{line-height:1.8}.mobile-lg\:line-height-heading-1{line-height:.9}.mobile-lg\:line-height-heading-2{line-height:1.1}.mobile-lg\:line-height-heading-3{line-height:1.3}.mobile-lg\:line-height-heading-4{line-height:1.4}.mobile-lg\:line-height-heading-5{line-height:1.5}.mobile-lg\:line-height-heading-6{line-height:1.6}.mobile-lg\:line-height-ui-1{line-height:.9}.mobile-lg\:line-height-ui-2{line-height:1.1}.mobile-lg\:line-height-ui-3{line-height:1.3}.mobile-lg\:line-height-ui-4{line-height:1.4}.mobile-lg\:line-height-ui-5{line-height:1.5}.mobile-lg\:line-height-ui-6{line-height:1.6}.mobile-lg\:line-height-body-1{line-height:.9}.mobile-lg\:line-height-body-2{line-height:1.1}.mobile-lg\:line-height-body-3{line-height:1.3}.mobile-lg\:line-height-body-4{line-height:1.4}.mobile-lg\:line-height-body-5{line-height:1.5}.mobile-lg\:line-height-body-6{line-height:1.6}.mobile-lg\:line-height-code-1{line-height:1}.mobile-lg\:line-height-code-2{line-height:1.3}.mobile-lg\:line-height-code-3{line-height:1.4}.mobile-lg\:line-height-code-4{line-height:1.6}.mobile-lg\:line-height-code-5{line-height:1.7}.mobile-lg\:line-height-code-6{line-height:1.8}.mobile-lg\:line-height-alt-1{line-height:1}.mobile-lg\:line-height-alt-2{line-height:1.2}.mobile-lg\:line-height-alt-3{line-height:1.4}.mobile-lg\:line-height-alt-4{line-height:1.5}.mobile-lg\:line-height-alt-5{line-height:1.7}.mobile-lg\:line-height-alt-6{line-height:1.8}.mobile-lg\:margin-neg-1px{margin:-1px}.mobile-lg\:margin-neg-2px{margin:-2px}.mobile-lg\:margin-neg-05{margin:-.25rem}.mobile-lg\:margin-neg-1{margin:-.5rem}.mobile-lg\:margin-neg-105{margin:-.75rem}.mobile-lg\:margin-neg-2{margin:-1rem}.mobile-lg\:margin-neg-205{margin:-1.25rem}.mobile-lg\:margin-neg-3{margin:-1.5rem}.mobile-lg\:margin-1px{margin:1px}.mobile-lg\:margin-2px{margin:2px}.mobile-lg\:margin-05{margin:.25rem}.mobile-lg\:margin-1{margin:.5rem}.mobile-lg\:margin-105{margin:.75rem}.mobile-lg\:margin-2{margin:1rem}.mobile-lg\:margin-205{margin:1.25rem}.mobile-lg\:margin-3{margin:1.5rem}.mobile-lg\:margin-4{margin:2rem}.mobile-lg\:margin-5{margin:2.5rem}.mobile-lg\:margin-6{margin:3rem}.mobile-lg\:margin-7{margin:3.5rem}.mobile-lg\:margin-8{margin:4rem}.mobile-lg\:margin-9{margin:4.5rem}.mobile-lg\:margin-10{margin:5rem}.mobile-lg\:margin-15{margin:7.5rem}.mobile-lg\:margin-05em{margin:.5em}.mobile-lg\:margin-1em{margin:1em}.mobile-lg\:margin-105em{margin:1.5em}.mobile-lg\:margin-2em{margin:2em}.mobile-lg\:margin-0{margin:0}.mobile-lg\:margin-y-1px{margin-bottom:1px;margin-top:1px}.mobile-lg\:margin-top-1px{margin-top:1px}.mobile-lg\:margin-bottom-1px{margin-bottom:1px}.mobile-lg\:margin-y-2px{margin-bottom:2px;margin-top:2px}.mobile-lg\:margin-top-2px{margin-top:2px}.mobile-lg\:margin-bottom-2px{margin-bottom:2px}.mobile-lg\:margin-y-05{margin-bottom:.25rem;margin-top:.25rem}.mobile-lg\:margin-top-05{margin-top:.25rem}.mobile-lg\:margin-bottom-05{margin-bottom:.25rem}.mobile-lg\:margin-y-1{margin-bottom:.5rem;margin-top:.5rem}.mobile-lg\:margin-top-1{margin-top:.5rem}.mobile-lg\:margin-bottom-1{margin-bottom:.5rem}.mobile-lg\:margin-y-105{margin-bottom:.75rem;margin-top:.75rem}.mobile-lg\:margin-top-105{margin-top:.75rem}.mobile-lg\:margin-bottom-105{margin-bottom:.75rem}.mobile-lg\:margin-y-2{margin-bottom:1rem;margin-top:1rem}.mobile-lg\:margin-top-2{margin-top:1rem}.mobile-lg\:margin-bottom-2{margin-bottom:1rem}.mobile-lg\:margin-y-205{margin-bottom:1.25rem;margin-top:1.25rem}.mobile-lg\:margin-top-205{margin-top:1.25rem}.mobile-lg\:margin-bottom-205{margin-bottom:1.25rem}.mobile-lg\:margin-y-3{margin-bottom:1.5rem;margin-top:1.5rem}.mobile-lg\:margin-top-3{margin-top:1.5rem}.mobile-lg\:margin-bottom-3{margin-bottom:1.5rem}.mobile-lg\:margin-y-neg-1px{margin-bottom:-1px;margin-top:-1px}.mobile-lg\:margin-top-neg-1px{margin-top:-1px}.mobile-lg\:margin-bottom-neg-1px{margin-bottom:-1px}.mobile-lg\:margin-y-neg-2px{margin-bottom:-2px;margin-top:-2px}.mobile-lg\:margin-top-neg-2px{margin-top:-2px}.mobile-lg\:margin-bottom-neg-2px{margin-bottom:-2px}.mobile-lg\:margin-y-neg-05{margin-bottom:-.25rem;margin-top:-.25rem}.mobile-lg\:margin-top-neg-05{margin-top:-.25rem}.mobile-lg\:margin-bottom-neg-05{margin-bottom:-.25rem}.mobile-lg\:margin-y-neg-1{margin-bottom:-.5rem;margin-top:-.5rem}.mobile-lg\:margin-top-neg-1{margin-top:-.5rem}.mobile-lg\:margin-bottom-neg-1{margin-bottom:-.5rem}.mobile-lg\:margin-y-neg-105{margin-bottom:-.75rem;margin-top:-.75rem}.mobile-lg\:margin-top-neg-105{margin-top:-.75rem}.mobile-lg\:margin-bottom-neg-105{margin-bottom:-.75rem}.mobile-lg\:margin-y-neg-2{margin-bottom:-1rem;margin-top:-1rem}.mobile-lg\:margin-top-neg-2{margin-top:-1rem}.mobile-lg\:margin-bottom-neg-2{margin-bottom:-1rem}.mobile-lg\:margin-y-neg-205{margin-bottom:-1.25rem;margin-top:-1.25rem}.mobile-lg\:margin-top-neg-205{margin-top:-1.25rem}.mobile-lg\:margin-bottom-neg-205{margin-bottom:-1.25rem}.mobile-lg\:margin-y-neg-3{margin-bottom:-1.5rem;margin-top:-1.5rem}.mobile-lg\:margin-top-neg-3{margin-top:-1.5rem}.mobile-lg\:margin-bottom-neg-3{margin-bottom:-1.5rem}.mobile-lg\:margin-y-4{margin-bottom:2rem;margin-top:2rem}.mobile-lg\:margin-top-4{margin-top:2rem}.mobile-lg\:margin-bottom-4{margin-bottom:2rem}.mobile-lg\:margin-y-5{margin-bottom:2.5rem;margin-top:2.5rem}.mobile-lg\:margin-top-5{margin-top:2.5rem}.mobile-lg\:margin-bottom-5{margin-bottom:2.5rem}.mobile-lg\:margin-y-6{margin-bottom:3rem;margin-top:3rem}.mobile-lg\:margin-top-6{margin-top:3rem}.mobile-lg\:margin-bottom-6{margin-bottom:3rem}.mobile-lg\:margin-y-7{margin-bottom:3.5rem;margin-top:3.5rem}.mobile-lg\:margin-top-7{margin-top:3.5rem}.mobile-lg\:margin-bottom-7{margin-bottom:3.5rem}.mobile-lg\:margin-y-8{margin-bottom:4rem;margin-top:4rem}.mobile-lg\:margin-top-8{margin-top:4rem}.mobile-lg\:margin-bottom-8{margin-bottom:4rem}.mobile-lg\:margin-y-9{margin-bottom:4.5rem;margin-top:4.5rem}.mobile-lg\:margin-top-9{margin-top:4.5rem}.mobile-lg\:margin-bottom-9{margin-bottom:4.5rem}.mobile-lg\:margin-y-10{margin-bottom:5rem;margin-top:5rem}.mobile-lg\:margin-top-10{margin-top:5rem}.mobile-lg\:margin-bottom-10{margin-bottom:5rem}.mobile-lg\:margin-y-15{margin-bottom:7.5rem;margin-top:7.5rem}.mobile-lg\:margin-top-15{margin-top:7.5rem}.mobile-lg\:margin-bottom-15{margin-bottom:7.5rem}.mobile-lg\:margin-y-05em{margin-bottom:.5em;margin-top:.5em}.mobile-lg\:margin-top-05em{margin-top:.5em}.mobile-lg\:margin-bottom-05em{margin-bottom:.5em}.mobile-lg\:margin-y-1em{margin-bottom:1em;margin-top:1em}.mobile-lg\:margin-top-1em{margin-top:1em}.mobile-lg\:margin-bottom-1em{margin-bottom:1em}.mobile-lg\:margin-y-105em{margin-bottom:1.5em;margin-top:1.5em}.mobile-lg\:margin-top-105em{margin-top:1.5em}.mobile-lg\:margin-bottom-105em{margin-bottom:1.5em}.mobile-lg\:margin-y-2em{margin-bottom:2em;margin-top:2em}.mobile-lg\:margin-top-2em{margin-top:2em}.mobile-lg\:margin-bottom-2em{margin-bottom:2em}.mobile-lg\:margin-y-0{margin-bottom:0;margin-top:0}.mobile-lg\:margin-top-0{margin-top:0}.mobile-lg\:margin-bottom-0{margin-bottom:0}.mobile-lg\:margin-y-auto{margin-bottom:auto;margin-top:auto}.mobile-lg\:margin-top-auto{margin-top:auto}.mobile-lg\:margin-bottom-auto{margin-bottom:auto}.mobile-lg\:margin-x-1px{margin-left:1px;margin-right:1px}.mobile-lg\:margin-right-1px{margin-right:1px}.mobile-lg\:margin-left-1px{margin-left:1px}.mobile-lg\:margin-x-2px{margin-left:2px;margin-right:2px}.mobile-lg\:margin-right-2px{margin-right:2px}.mobile-lg\:margin-left-2px{margin-left:2px}.mobile-lg\:margin-x-05{margin-left:.25rem;margin-right:.25rem}.mobile-lg\:margin-right-05{margin-right:.25rem}.mobile-lg\:margin-left-05{margin-left:.25rem}.mobile-lg\:margin-x-1{margin-left:.5rem;margin-right:.5rem}.mobile-lg\:margin-right-1{margin-right:.5rem}.mobile-lg\:margin-left-1{margin-left:.5rem}.mobile-lg\:margin-x-105{margin-left:.75rem;margin-right:.75rem}.mobile-lg\:margin-right-105{margin-right:.75rem}.mobile-lg\:margin-left-105{margin-left:.75rem}.mobile-lg\:margin-x-2{margin-left:1rem;margin-right:1rem}.mobile-lg\:margin-right-2{margin-right:1rem}.mobile-lg\:margin-left-2{margin-left:1rem}.mobile-lg\:margin-x-205{margin-left:1.25rem;margin-right:1.25rem}.mobile-lg\:margin-right-205{margin-right:1.25rem}.mobile-lg\:margin-left-205{margin-left:1.25rem}.mobile-lg\:margin-x-3{margin-left:1.5rem;margin-right:1.5rem}.mobile-lg\:margin-right-3{margin-right:1.5rem}.mobile-lg\:margin-left-3{margin-left:1.5rem}.mobile-lg\:margin-x-neg-1px{margin-left:-1px;margin-right:-1px}.mobile-lg\:margin-right-neg-1px{margin-right:-1px}.mobile-lg\:margin-left-neg-1px{margin-left:-1px}.mobile-lg\:margin-x-neg-2px{margin-left:-2px;margin-right:-2px}.mobile-lg\:margin-right-neg-2px{margin-right:-2px}.mobile-lg\:margin-left-neg-2px{margin-left:-2px}.mobile-lg\:margin-x-neg-05{margin-left:-.25rem;margin-right:-.25rem}.mobile-lg\:margin-right-neg-05{margin-right:-.25rem}.mobile-lg\:margin-left-neg-05{margin-left:-.25rem}.mobile-lg\:margin-x-neg-1{margin-left:-.5rem;margin-right:-.5rem}.mobile-lg\:margin-right-neg-1{margin-right:-.5rem}.mobile-lg\:margin-left-neg-1{margin-left:-.5rem}.mobile-lg\:margin-x-neg-105{margin-left:-.75rem;margin-right:-.75rem}.mobile-lg\:margin-right-neg-105{margin-right:-.75rem}.mobile-lg\:margin-left-neg-105{margin-left:-.75rem}.mobile-lg\:margin-x-neg-2{margin-left:-1rem;margin-right:-1rem}.mobile-lg\:margin-right-neg-2{margin-right:-1rem}.mobile-lg\:margin-left-neg-2{margin-left:-1rem}.mobile-lg\:margin-x-neg-205{margin-left:-1.25rem;margin-right:-1.25rem}.mobile-lg\:margin-right-neg-205{margin-right:-1.25rem}.mobile-lg\:margin-left-neg-205{margin-left:-1.25rem}.mobile-lg\:margin-x-neg-3{margin-left:-1.5rem;margin-right:-1.5rem}.mobile-lg\:margin-right-neg-3{margin-right:-1.5rem}.mobile-lg\:margin-left-neg-3{margin-left:-1.5rem}.mobile-lg\:margin-x-4{margin-left:2rem;margin-right:2rem}.mobile-lg\:margin-right-4{margin-right:2rem}.mobile-lg\:margin-left-4{margin-left:2rem}.mobile-lg\:margin-x-5{margin-left:2.5rem;margin-right:2.5rem}.mobile-lg\:margin-right-5{margin-right:2.5rem}.mobile-lg\:margin-left-5{margin-left:2.5rem}.mobile-lg\:margin-x-6{margin-left:3rem;margin-right:3rem}.mobile-lg\:margin-right-6{margin-right:3rem}.mobile-lg\:margin-left-6{margin-left:3rem}.mobile-lg\:margin-x-7{margin-left:3.5rem;margin-right:3.5rem}.mobile-lg\:margin-right-7{margin-right:3.5rem}.mobile-lg\:margin-left-7{margin-left:3.5rem}.mobile-lg\:margin-x-8{margin-left:4rem;margin-right:4rem}.mobile-lg\:margin-right-8{margin-right:4rem}.mobile-lg\:margin-left-8{margin-left:4rem}.mobile-lg\:margin-x-9{margin-left:4.5rem;margin-right:4.5rem}.mobile-lg\:margin-right-9{margin-right:4.5rem}.mobile-lg\:margin-left-9{margin-left:4.5rem}.mobile-lg\:margin-x-10{margin-left:5rem;margin-right:5rem}.mobile-lg\:margin-right-10{margin-right:5rem}.mobile-lg\:margin-left-10{margin-left:5rem}.mobile-lg\:margin-x-15{margin-left:7.5rem;margin-right:7.5rem}.mobile-lg\:margin-right-15{margin-right:7.5rem}.mobile-lg\:margin-left-15{margin-left:7.5rem}.mobile-lg\:margin-x-card{margin-left:10rem;margin-right:10rem}.mobile-lg\:margin-right-card{margin-right:10rem}.mobile-lg\:margin-left-card{margin-left:10rem}.mobile-lg\:margin-x-card-lg{margin-left:15rem;margin-right:15rem}.mobile-lg\:margin-right-card-lg{margin-right:15rem}.mobile-lg\:margin-left-card-lg{margin-left:15rem}.mobile-lg\:margin-x-mobile{margin-left:20rem;margin-right:20rem}.mobile-lg\:margin-right-mobile{margin-right:20rem}.mobile-lg\:margin-left-mobile{margin-left:20rem}.mobile-lg\:margin-x-05em{margin-left:.5em;margin-right:.5em}.mobile-lg\:margin-right-05em{margin-right:.5em}.mobile-lg\:margin-left-05em{margin-left:.5em}.mobile-lg\:margin-x-1em{margin-left:1em;margin-right:1em}.mobile-lg\:margin-right-1em{margin-right:1em}.mobile-lg\:margin-left-1em{margin-left:1em}.mobile-lg\:margin-x-105em{margin-left:1.5em;margin-right:1.5em}.mobile-lg\:margin-right-105em{margin-right:1.5em}.mobile-lg\:margin-left-105em{margin-left:1.5em}.mobile-lg\:margin-x-2em{margin-left:2em;margin-right:2em}.mobile-lg\:margin-right-2em{margin-right:2em}.mobile-lg\:margin-left-2em{margin-left:2em}.mobile-lg\:margin-x-0{margin-left:0;margin-right:0}.mobile-lg\:margin-right-0{margin-right:0}.mobile-lg\:margin-left-0{margin-left:0}.mobile-lg\:margin-x-auto{margin-left:auto;margin-right:auto}.mobile-lg\:margin-right-auto{margin-right:auto}.mobile-lg\:margin-left-auto{margin-left:auto}.mobile-lg\:measure-1{max-width:44ex}.mobile-lg\:measure-2{max-width:60ex}.mobile-lg\:measure-3{max-width:64ex}.mobile-lg\:measure-4{max-width:68ex}.mobile-lg\:measure-5{max-width:72ex}.mobile-lg\:measure-6{max-width:88ex}.mobile-lg\:measure-none{max-width:none}.mobile-lg\:order-first{order:-1}.mobile-lg\:order-last{order:999}.mobile-lg\:order-0,.mobile-lg\:order-initial{order:0}.mobile-lg\:order-1{order:1}.mobile-lg\:order-2{order:2}.mobile-lg\:order-3{order:3}.mobile-lg\:order-4{order:4}.mobile-lg\:order-5{order:5}.mobile-lg\:order-6{order:6}.mobile-lg\:order-7{order:7}.mobile-lg\:order-8{order:8}.mobile-lg\:order-9{order:9}.mobile-lg\:order-10{order:10}.mobile-lg\:order-11{order:11}.mobile-lg\:padding-1px{padding:1px}.mobile-lg\:padding-y-1px{padding-bottom:1px;padding-top:1px}.mobile-lg\:padding-x-1px{padding-left:1px;padding-right:1px}.mobile-lg\:padding-top-1px{padding-top:1px}.mobile-lg\:padding-right-1px{padding-right:1px}.mobile-lg\:padding-bottom-1px{padding-bottom:1px}.mobile-lg\:padding-left-1px{padding-left:1px}.mobile-lg\:padding-2px{padding:2px}.mobile-lg\:padding-y-2px{padding-bottom:2px;padding-top:2px}.mobile-lg\:padding-x-2px{padding-left:2px;padding-right:2px}.mobile-lg\:padding-top-2px{padding-top:2px}.mobile-lg\:padding-right-2px{padding-right:2px}.mobile-lg\:padding-bottom-2px{padding-bottom:2px}.mobile-lg\:padding-left-2px{padding-left:2px}.mobile-lg\:padding-05{padding:.25rem}.mobile-lg\:padding-y-05{padding-bottom:.25rem;padding-top:.25rem}.mobile-lg\:padding-x-05{padding-left:.25rem;padding-right:.25rem}.mobile-lg\:padding-top-05{padding-top:.25rem}.mobile-lg\:padding-right-05{padding-right:.25rem}.mobile-lg\:padding-bottom-05{padding-bottom:.25rem}.mobile-lg\:padding-left-05{padding-left:.25rem}.mobile-lg\:padding-1{padding:.5rem}.mobile-lg\:padding-y-1{padding-bottom:.5rem;padding-top:.5rem}.mobile-lg\:padding-x-1{padding-left:.5rem;padding-right:.5rem}.mobile-lg\:padding-top-1{padding-top:.5rem}.mobile-lg\:padding-right-1{padding-right:.5rem}.mobile-lg\:padding-bottom-1{padding-bottom:.5rem}.mobile-lg\:padding-left-1{padding-left:.5rem}.mobile-lg\:padding-105{padding:.75rem}.mobile-lg\:padding-y-105{padding-bottom:.75rem;padding-top:.75rem}.mobile-lg\:padding-x-105{padding-left:.75rem;padding-right:.75rem}.mobile-lg\:padding-top-105{padding-top:.75rem}.mobile-lg\:padding-right-105{padding-right:.75rem}.mobile-lg\:padding-bottom-105{padding-bottom:.75rem}.mobile-lg\:padding-left-105{padding-left:.75rem}.mobile-lg\:padding-2{padding:1rem}.mobile-lg\:padding-y-2{padding-bottom:1rem;padding-top:1rem}.mobile-lg\:padding-x-2{padding-left:1rem;padding-right:1rem}.mobile-lg\:padding-top-2{padding-top:1rem}.mobile-lg\:padding-right-2{padding-right:1rem}.mobile-lg\:padding-bottom-2{padding-bottom:1rem}.mobile-lg\:padding-left-2{padding-left:1rem}.mobile-lg\:padding-205{padding:1.25rem}.mobile-lg\:padding-y-205{padding-bottom:1.25rem;padding-top:1.25rem}.mobile-lg\:padding-x-205{padding-left:1.25rem;padding-right:1.25rem}.mobile-lg\:padding-top-205{padding-top:1.25rem}.mobile-lg\:padding-right-205{padding-right:1.25rem}.mobile-lg\:padding-bottom-205{padding-bottom:1.25rem}.mobile-lg\:padding-left-205{padding-left:1.25rem}.mobile-lg\:padding-3{padding:1.5rem}.mobile-lg\:padding-y-3{padding-bottom:1.5rem;padding-top:1.5rem}.mobile-lg\:padding-x-3{padding-left:1.5rem;padding-right:1.5rem}.mobile-lg\:padding-top-3{padding-top:1.5rem}.mobile-lg\:padding-right-3{padding-right:1.5rem}.mobile-lg\:padding-bottom-3{padding-bottom:1.5rem}.mobile-lg\:padding-left-3{padding-left:1.5rem}.mobile-lg\:padding-4{padding:2rem}.mobile-lg\:padding-y-4{padding-bottom:2rem;padding-top:2rem}.mobile-lg\:padding-x-4{padding-left:2rem;padding-right:2rem}.mobile-lg\:padding-top-4{padding-top:2rem}.mobile-lg\:padding-right-4{padding-right:2rem}.mobile-lg\:padding-bottom-4{padding-bottom:2rem}.mobile-lg\:padding-left-4{padding-left:2rem}.mobile-lg\:padding-5{padding:2.5rem}.mobile-lg\:padding-y-5{padding-bottom:2.5rem;padding-top:2.5rem}.mobile-lg\:padding-x-5{padding-left:2.5rem;padding-right:2.5rem}.mobile-lg\:padding-top-5{padding-top:2.5rem}.mobile-lg\:padding-right-5{padding-right:2.5rem}.mobile-lg\:padding-bottom-5{padding-bottom:2.5rem}.mobile-lg\:padding-left-5{padding-left:2.5rem}.mobile-lg\:padding-6{padding:3rem}.mobile-lg\:padding-y-6{padding-bottom:3rem;padding-top:3rem}.mobile-lg\:padding-x-6{padding-left:3rem;padding-right:3rem}.mobile-lg\:padding-top-6{padding-top:3rem}.mobile-lg\:padding-right-6{padding-right:3rem}.mobile-lg\:padding-bottom-6{padding-bottom:3rem}.mobile-lg\:padding-left-6{padding-left:3rem}.mobile-lg\:padding-7{padding:3.5rem}.mobile-lg\:padding-y-7{padding-bottom:3.5rem;padding-top:3.5rem}.mobile-lg\:padding-x-7{padding-left:3.5rem;padding-right:3.5rem}.mobile-lg\:padding-top-7{padding-top:3.5rem}.mobile-lg\:padding-right-7{padding-right:3.5rem}.mobile-lg\:padding-bottom-7{padding-bottom:3.5rem}.mobile-lg\:padding-left-7{padding-left:3.5rem}.mobile-lg\:padding-8{padding:4rem}.mobile-lg\:padding-y-8{padding-bottom:4rem;padding-top:4rem}.mobile-lg\:padding-x-8{padding-left:4rem;padding-right:4rem}.mobile-lg\:padding-top-8{padding-top:4rem}.mobile-lg\:padding-right-8{padding-right:4rem}.mobile-lg\:padding-bottom-8{padding-bottom:4rem}.mobile-lg\:padding-left-8{padding-left:4rem}.mobile-lg\:padding-9{padding:4.5rem}.mobile-lg\:padding-y-9{padding-bottom:4.5rem;padding-top:4.5rem}.mobile-lg\:padding-x-9{padding-left:4.5rem;padding-right:4.5rem}.mobile-lg\:padding-top-9{padding-top:4.5rem}.mobile-lg\:padding-right-9{padding-right:4.5rem}.mobile-lg\:padding-bottom-9{padding-bottom:4.5rem}.mobile-lg\:padding-left-9{padding-left:4.5rem}.mobile-lg\:padding-10{padding:5rem}.mobile-lg\:padding-y-10{padding-bottom:5rem;padding-top:5rem}.mobile-lg\:padding-x-10{padding-left:5rem;padding-right:5rem}.mobile-lg\:padding-top-10{padding-top:5rem}.mobile-lg\:padding-right-10{padding-right:5rem}.mobile-lg\:padding-bottom-10{padding-bottom:5rem}.mobile-lg\:padding-left-10{padding-left:5rem}.mobile-lg\:padding-15{padding:7.5rem}.mobile-lg\:padding-y-15{padding-bottom:7.5rem;padding-top:7.5rem}.mobile-lg\:padding-x-15{padding-left:7.5rem;padding-right:7.5rem}.mobile-lg\:padding-top-15{padding-top:7.5rem}.mobile-lg\:padding-right-15{padding-right:7.5rem}.mobile-lg\:padding-bottom-15{padding-bottom:7.5rem}.mobile-lg\:padding-left-15{padding-left:7.5rem}.mobile-lg\:padding-0{padding:0}.mobile-lg\:padding-y-0{padding-bottom:0;padding-top:0}.mobile-lg\:padding-x-0{padding-left:0;padding-right:0}.mobile-lg\:padding-top-0{padding-top:0}.mobile-lg\:padding-right-0{padding-right:0}.mobile-lg\:padding-bottom-0{padding-bottom:0}.mobile-lg\:padding-left-0{padding-left:0}.mobile-lg\:width-1px{width:1px}.mobile-lg\:width-2px{width:2px}.mobile-lg\:width-05{width:.25rem}.mobile-lg\:width-1{width:.5rem}.mobile-lg\:width-105{width:.75rem}.mobile-lg\:width-2{width:1rem}.mobile-lg\:width-205{width:1.25rem}.mobile-lg\:width-3{width:1.5rem}.mobile-lg\:width-4{width:2rem}.mobile-lg\:width-5{width:2.5rem}.mobile-lg\:width-6{width:3rem}.mobile-lg\:width-7{width:3.5rem}.mobile-lg\:width-8{width:4rem}.mobile-lg\:width-9{width:4.5rem}.mobile-lg\:width-10{width:5rem}.mobile-lg\:width-15{width:7.5rem}.mobile-lg\:width-card{width:10rem}.mobile-lg\:width-card-lg{width:15rem}.mobile-lg\:width-mobile{width:20rem}.mobile-lg\:width-mobile-lg{width:30rem}.mobile-lg\:width-tablet{width:40rem}.mobile-lg\:width-tablet-lg{width:55rem}.mobile-lg\:width-desktop{width:64rem}.mobile-lg\:width-desktop-lg{width:75rem}.mobile-lg\:width-widescreen{width:87.5rem}.mobile-lg\:width-0{width:0}.mobile-lg\:width-full{width:100%}.mobile-lg\:width-auto{width:auto}}@media (min-width:40em){.tablet\:border-1px,.tablet\:hover\:border-1px:hover{border:1px solid}.tablet\:border-y-1px,.tablet\:hover\:border-y-1px:hover{border-bottom:1px solid;border-top:1px solid}.tablet\:border-x-1px,.tablet\:hover\:border-x-1px:hover{border-left:1px solid;border-right:1px solid}.tablet\:border-top-1px,.tablet\:hover\:border-top-1px:hover{border-top:1px solid}.tablet\:border-right-1px,.tablet\:hover\:border-right-1px:hover{border-right:1px solid}.tablet\:border-bottom-1px,.tablet\:hover\:border-bottom-1px:hover{border-bottom:1px solid}.tablet\:border-left-1px,.tablet\:hover\:border-left-1px:hover{border-left:1px solid}.tablet\:border-2px,.tablet\:hover\:border-2px:hover{border:2px solid}.tablet\:border-y-2px,.tablet\:hover\:border-y-2px:hover{border-bottom:2px solid;border-top:2px solid}.tablet\:border-x-2px,.tablet\:hover\:border-x-2px:hover{border-left:2px solid;border-right:2px solid}.tablet\:border-top-2px,.tablet\:hover\:border-top-2px:hover{border-top:2px solid}.tablet\:border-right-2px,.tablet\:hover\:border-right-2px:hover{border-right:2px solid}.tablet\:border-bottom-2px,.tablet\:hover\:border-bottom-2px:hover{border-bottom:2px solid}.tablet\:border-left-2px,.tablet\:hover\:border-left-2px:hover{border-left:2px solid}.tablet\:border-05,.tablet\:hover\:border-05:hover{border:.25rem solid}.tablet\:border-y-05,.tablet\:hover\:border-y-05:hover{border-bottom:.25rem solid;border-top:.25rem solid}.tablet\:border-x-05,.tablet\:hover\:border-x-05:hover{border-left:.25rem solid;border-right:.25rem solid}.tablet\:border-top-05,.tablet\:hover\:border-top-05:hover{border-top:.25rem solid}.tablet\:border-right-05,.tablet\:hover\:border-right-05:hover{border-right:.25rem solid}.tablet\:border-bottom-05,.tablet\:hover\:border-bottom-05:hover{border-bottom:.25rem solid}.tablet\:border-left-05,.tablet\:hover\:border-left-05:hover{border-left:.25rem solid}.tablet\:border-1,.tablet\:hover\:border-1:hover{border:.5rem solid}.tablet\:border-y-1,.tablet\:hover\:border-y-1:hover{border-bottom:.5rem solid;border-top:.5rem solid}.tablet\:border-x-1,.tablet\:hover\:border-x-1:hover{border-left:.5rem solid;border-right:.5rem solid}.tablet\:border-top-1,.tablet\:hover\:border-top-1:hover{border-top:.5rem solid}.tablet\:border-right-1,.tablet\:hover\:border-right-1:hover{border-right:.5rem solid}.tablet\:border-bottom-1,.tablet\:hover\:border-bottom-1:hover{border-bottom:.5rem solid}.tablet\:border-left-1,.tablet\:hover\:border-left-1:hover{border-left:.5rem solid}.tablet\:border-105,.tablet\:hover\:border-105:hover{border:.75rem solid}.tablet\:border-y-105,.tablet\:hover\:border-y-105:hover{border-bottom:.75rem solid;border-top:.75rem solid}.tablet\:border-x-105,.tablet\:hover\:border-x-105:hover{border-left:.75rem solid;border-right:.75rem solid}.tablet\:border-top-105,.tablet\:hover\:border-top-105:hover{border-top:.75rem solid}.tablet\:border-right-105,.tablet\:hover\:border-right-105:hover{border-right:.75rem solid}.tablet\:border-bottom-105,.tablet\:hover\:border-bottom-105:hover{border-bottom:.75rem solid}.tablet\:border-left-105,.tablet\:hover\:border-left-105:hover{border-left:.75rem solid}.tablet\:border-2,.tablet\:hover\:border-2:hover{border:1rem solid}.tablet\:border-y-2,.tablet\:hover\:border-y-2:hover{border-bottom:1rem solid;border-top:1rem solid}.tablet\:border-x-2,.tablet\:hover\:border-x-2:hover{border-left:1rem solid;border-right:1rem solid}.tablet\:border-top-2,.tablet\:hover\:border-top-2:hover{border-top:1rem solid}.tablet\:border-right-2,.tablet\:hover\:border-right-2:hover{border-right:1rem solid}.tablet\:border-bottom-2,.tablet\:hover\:border-bottom-2:hover{border-bottom:1rem solid}.tablet\:border-left-2,.tablet\:hover\:border-left-2:hover{border-left:1rem solid}.tablet\:border-205,.tablet\:hover\:border-205:hover{border:1.25rem solid}.tablet\:border-y-205,.tablet\:hover\:border-y-205:hover{border-bottom:1.25rem solid;border-top:1.25rem solid}.tablet\:border-x-205,.tablet\:hover\:border-x-205:hover{border-left:1.25rem solid;border-right:1.25rem solid}.tablet\:border-top-205,.tablet\:hover\:border-top-205:hover{border-top:1.25rem solid}.tablet\:border-right-205,.tablet\:hover\:border-right-205:hover{border-right:1.25rem solid}.tablet\:border-bottom-205,.tablet\:hover\:border-bottom-205:hover{border-bottom:1.25rem solid}.tablet\:border-left-205,.tablet\:hover\:border-left-205:hover{border-left:1.25rem solid}.tablet\:border-3,.tablet\:hover\:border-3:hover{border:1.5rem solid}.tablet\:border-y-3,.tablet\:hover\:border-y-3:hover{border-bottom:1.5rem solid;border-top:1.5rem solid}.tablet\:border-x-3,.tablet\:hover\:border-x-3:hover{border-left:1.5rem solid;border-right:1.5rem solid}.tablet\:border-top-3,.tablet\:hover\:border-top-3:hover{border-top:1.5rem solid}.tablet\:border-right-3,.tablet\:hover\:border-right-3:hover{border-right:1.5rem solid}.tablet\:border-bottom-3,.tablet\:hover\:border-bottom-3:hover{border-bottom:1.5rem solid}.tablet\:border-left-3,.tablet\:hover\:border-left-3:hover{border-left:1.5rem solid}.tablet\:border-0,.tablet\:hover\:border-0:hover{border:0 solid}.tablet\:border-y-0,.tablet\:hover\:border-y-0:hover{border-bottom:0 solid;border-top:0 solid}.tablet\:border-x-0,.tablet\:hover\:border-x-0:hover{border-left:0 solid;border-right:0 solid}.tablet\:border-top-0,.tablet\:hover\:border-top-0:hover{border-top:0 solid}.tablet\:border-right-0,.tablet\:hover\:border-right-0:hover{border-right:0 solid}.tablet\:border-bottom-0,.tablet\:hover\:border-bottom-0:hover{border-bottom:0 solid}.tablet\:border-left-0,.tablet\:hover\:border-left-0:hover{border-left:0 solid}.tablet\:border,.tablet\:hover\:border:hover{border:1px solid}.tablet\:border-y,.tablet\:hover\:border-y:hover{border-bottom:1px solid;border-top:1px solid}.tablet\:border-x,.tablet\:hover\:border-x:hover{border-left:1px solid;border-right:1px solid}.tablet\:border-top,.tablet\:hover\:border-top:hover{border-top:1px solid}.tablet\:border-right,.tablet\:hover\:border-right:hover{border-right:1px solid}.tablet\:border-bottom,.tablet\:hover\:border-bottom:hover{border-bottom:1px solid}.tablet\:border-left,.tablet\:hover\:border-left:hover{border-left:1px solid}.tablet\:border-transparent,.tablet\:hover\:border-transparent:hover{border-color:transparent}.tablet\:border-black,.tablet\:hover\:border-black:hover{border-color:#000}.tablet\:border-white,.tablet\:hover\:border-white:hover{border-color:#fff}.tablet\:border-red,.tablet\:hover\:border-red:hover{border-color:#e52207}.tablet\:border-orange,.tablet\:hover\:border-orange:hover{border-color:#e66f0e}.tablet\:border-gold,.tablet\:hover\:border-gold:hover{border-color:#ffbe2e}.tablet\:border-yellow,.tablet\:hover\:border-yellow:hover{border-color:#fee685}.tablet\:border-green,.tablet\:hover\:border-green:hover{border-color:#538200}.tablet\:border-mint,.tablet\:hover\:border-mint:hover{border-color:#04c585}.tablet\:border-cyan,.tablet\:hover\:border-cyan:hover{border-color:#009ec1}.tablet\:border-blue,.tablet\:hover\:border-blue:hover{border-color:#0076d6}.tablet\:border-indigo,.tablet\:hover\:border-indigo:hover{border-color:#676cc8}.tablet\:border-violet,.tablet\:hover\:border-violet:hover{border-color:#8168b3}.tablet\:border-magenta,.tablet\:hover\:border-magenta:hover{border-color:#d72d79}.tablet\:border-gray-5,.tablet\:hover\:border-gray-5:hover{border-color:#f0f0f0}.tablet\:border-gray-10,.tablet\:hover\:border-gray-10:hover{border-color:#e6e6e6}.tablet\:border-gray-30,.tablet\:hover\:border-gray-30:hover{border-color:#adadad}.tablet\:border-gray-50,.tablet\:hover\:border-gray-50:hover{border-color:#757575}.tablet\:border-gray-70,.tablet\:hover\:border-gray-70:hover{border-color:#454545}.tablet\:border-gray-90,.tablet\:hover\:border-gray-90:hover{border-color:#1b1b1b}.tablet\:border-base-lightest,.tablet\:hover\:border-base-lightest:hover{border-color:#f0f0f0}.tablet\:border-base-lighter,.tablet\:hover\:border-base-lighter:hover{border-color:#dfe1e2}.tablet\:border-base-light,.tablet\:hover\:border-base-light:hover{border-color:#a9aeb1}.tablet\:border-base,.tablet\:hover\:border-base:hover{border-color:#71767a}.tablet\:border-base-dark,.tablet\:hover\:border-base-dark:hover{border-color:#565c65}.tablet\:border-base-darker,.tablet\:hover\:border-base-darker:hover{border-color:#3d4551}.tablet\:border-base-darkest,.tablet\:border-ink,.tablet\:hover\:border-base-darkest:hover,.tablet\:hover\:border-ink:hover{border-color:#1b1b1b}.tablet\:border-primary-lighter,.tablet\:hover\:border-primary-lighter:hover{border-color:#d9e8f6}.tablet\:border-primary-light,.tablet\:hover\:border-primary-light:hover{border-color:#73b3e7}.tablet\:border-primary,.tablet\:hover\:border-primary:hover{border-color:#005ea2}.tablet\:border-primary-vivid,.tablet\:hover\:border-primary-vivid:hover{border-color:#0050d8}.tablet\:border-primary-dark,.tablet\:hover\:border-primary-dark:hover{border-color:#1a4480}.tablet\:border-primary-darker,.tablet\:hover\:border-primary-darker:hover{border-color:#162e51}.tablet\:border-secondary-lighter,.tablet\:hover\:border-secondary-lighter:hover{border-color:#f3e1e4}.tablet\:border-secondary-light,.tablet\:hover\:border-secondary-light:hover{border-color:#f2938c}.tablet\:border-secondary,.tablet\:hover\:border-secondary:hover{border-color:#d83933}.tablet\:border-secondary-vivid,.tablet\:hover\:border-secondary-vivid:hover{border-color:#e41d3d}.tablet\:border-secondary-dark,.tablet\:hover\:border-secondary-dark:hover{border-color:#b50909}.tablet\:border-secondary-darker,.tablet\:hover\:border-secondary-darker:hover{border-color:#8b0a03}.tablet\:border-accent-warm-darker,.tablet\:hover\:border-accent-warm-darker:hover{border-color:#775540}.tablet\:border-accent-warm-dark,.tablet\:hover\:border-accent-warm-dark:hover{border-color:#c05600}.tablet\:border-accent-warm,.tablet\:hover\:border-accent-warm:hover{border-color:#fa9441}.tablet\:border-accent-warm-light,.tablet\:hover\:border-accent-warm-light:hover{border-color:#ffbc78}.tablet\:border-accent-warm-lighter,.tablet\:hover\:border-accent-warm-lighter:hover{border-color:#f2e4d4}.tablet\:border-accent-cool-darker,.tablet\:hover\:border-accent-cool-darker:hover{border-color:#07648d}.tablet\:border-accent-cool-dark,.tablet\:hover\:border-accent-cool-dark:hover{border-color:#28a0cb}.tablet\:border-accent-cool,.tablet\:hover\:border-accent-cool:hover{border-color:#00bde3}.tablet\:border-accent-cool-light,.tablet\:hover\:border-accent-cool-light:hover{border-color:#97d4ea}.tablet\:border-accent-cool-lighter,.tablet\:hover\:border-accent-cool-lighter:hover{border-color:#e1f3f8}.tablet\:radius-0{border-radius:0}.tablet\:radius-top-0{border-top-left-radius:0;border-top-right-radius:0}.tablet\:radius-right-0{border-bottom-right-radius:0;border-top-right-radius:0}.tablet\:radius-bottom-0{border-bottom-left-radius:0;border-bottom-right-radius:0}.tablet\:radius-left-0{border-bottom-left-radius:0;border-top-left-radius:0}.tablet\:radius-none{border-radius:0}.tablet\:radius-top-none{border-top-left-radius:0;border-top-right-radius:0}.tablet\:radius-right-none{border-bottom-right-radius:0;border-top-right-radius:0}.tablet\:radius-bottom-none{border-bottom-left-radius:0;border-bottom-right-radius:0}.tablet\:radius-left-none{border-bottom-left-radius:0;border-top-left-radius:0}.tablet\:radius-sm{border-radius:2px}.tablet\:radius-top-sm{border-top-left-radius:2px;border-top-right-radius:2px}.tablet\:radius-right-sm{border-bottom-right-radius:2px;border-top-right-radius:2px}.tablet\:radius-bottom-sm{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.tablet\:radius-left-sm{border-bottom-left-radius:2px;border-top-left-radius:2px}.tablet\:radius-md{border-radius:.25rem}.tablet\:radius-top-md{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.tablet\:radius-right-md{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.tablet\:radius-bottom-md{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.tablet\:radius-left-md{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.tablet\:radius-lg{border-radius:.5rem}.tablet\:radius-top-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.tablet\:radius-right-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.tablet\:radius-bottom-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.tablet\:radius-left-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.tablet\:radius-pill{border-radius:99rem}.tablet\:radius-top-pill{border-top-left-radius:99rem;border-top-right-radius:99rem}.tablet\:radius-right-pill{border-bottom-right-radius:99rem;border-top-right-radius:99rem}.tablet\:radius-bottom-pill{border-bottom-left-radius:99rem;border-bottom-right-radius:99rem}.tablet\:radius-left-pill{border-bottom-left-radius:99rem;border-top-left-radius:99rem}.tablet\:display-block{display:block}.tablet\:display-flex{display:flex}.tablet\:display-none{display:none}.tablet\:display-inline{display:inline}.tablet\:display-inline-block{display:inline-block}.tablet\:display-inline-flex{display:inline-flex}.tablet\:display-table{display:table}.tablet\:display-table-cell{display:table-cell}.tablet\:display-table-row{display:table-row}.tablet\:font-mono-3xs{font-size:.77rem}.tablet\:font-mono-2xs{font-size:.83rem}.tablet\:font-mono-xs{font-size:.89rem}.tablet\:font-mono-sm{font-size:.95rem}.tablet\:font-mono-md{font-size:1.01rem}.tablet\:font-mono-lg{font-size:1.31rem}.tablet\:font-mono-xl{font-size:1.91rem}.tablet\:font-mono-2xl{font-size:2.38rem}.tablet\:font-mono-3xl{font-size:2.86rem}.tablet\:font-sans-3xs{font-size:.87rem}.tablet\:font-sans-2xs{font-size:.93rem}.tablet\:font-sans-xs{font-size:1rem}.tablet\:font-sans-sm{font-size:1.06rem}.tablet\:font-sans-md{font-size:1.13rem}.tablet\:font-sans-lg{font-size:1.46rem}.tablet\:font-sans-xl{font-size:2.13rem}.tablet\:font-sans-2xl{font-size:2.66rem}.tablet\:font-sans-3xl{font-size:3.19rem}.tablet\:font-serif-3xs{font-size:.79rem}.tablet\:font-serif-2xs{font-size:.85rem}.tablet\:font-serif-xs{font-size:.91rem}.tablet\:font-serif-sm{font-size:.98rem}.tablet\:font-serif-md{font-size:1.04rem}.tablet\:font-serif-lg{font-size:1.34rem}.tablet\:font-serif-xl{font-size:1.95rem}.tablet\:font-serif-2xl{font-size:2.44rem}.tablet\:font-serif-3xl{font-size:2.93rem}.tablet\:font-heading-3xs{font-size:.87rem}.tablet\:font-heading-2xs{font-size:.93rem}.tablet\:font-heading-xs{font-size:1rem}.tablet\:font-heading-sm{font-size:1.06rem}.tablet\:font-heading-md{font-size:1.13rem}.tablet\:font-heading-lg{font-size:1.46rem}.tablet\:font-heading-xl{font-size:2.13rem}.tablet\:font-heading-2xl{font-size:2.66rem}.tablet\:font-heading-3xl{font-size:3.19rem}.tablet\:font-body-3xs{font-size:.87rem}.tablet\:font-body-2xs{font-size:.93rem}.tablet\:font-body-xs{font-size:1rem}.tablet\:font-body-sm{font-size:1.06rem}.tablet\:font-body-md{font-size:1.13rem}.tablet\:font-body-lg{font-size:1.46rem}.tablet\:font-body-xl{font-size:2.13rem}.tablet\:font-body-2xl{font-size:2.66rem}.tablet\:font-body-3xl{font-size:3.19rem}.tablet\:font-code-3xs{font-size:.77rem}.tablet\:font-code-2xs{font-size:.83rem}.tablet\:font-code-xs{font-size:.89rem}.tablet\:font-code-sm{font-size:.95rem}.tablet\:font-code-md{font-size:1.01rem}.tablet\:font-code-lg{font-size:1.31rem}.tablet\:font-code-xl{font-size:1.91rem}.tablet\:font-code-2xl{font-size:2.38rem}.tablet\:font-code-3xl{font-size:2.86rem}.tablet\:font-alt-3xs{font-size:.79rem}.tablet\:font-alt-2xs{font-size:.85rem}.tablet\:font-alt-xs{font-size:.91rem}.tablet\:font-alt-sm{font-size:.98rem}.tablet\:font-alt-md{font-size:1.04rem}.tablet\:font-alt-lg{font-size:1.34rem}.tablet\:font-alt-xl{font-size:1.95rem}.tablet\:font-alt-2xl{font-size:2.44rem}.tablet\:font-alt-3xl{font-size:2.93rem}.tablet\:font-ui-3xs{font-size:.87rem}.tablet\:font-ui-2xs{font-size:.93rem}.tablet\:font-ui-xs{font-size:1rem}.tablet\:font-ui-sm{font-size:1.06rem}.tablet\:font-ui-md{font-size:1.13rem}.tablet\:font-ui-lg{font-size:1.46rem}.tablet\:font-ui-xl{font-size:2.13rem}.tablet\:font-ui-2xl{font-size:2.66rem}.tablet\:font-ui-3xl{font-size:3.19rem}.tablet\:text-light{font-weight:300}.tablet\:text-normal{font-weight:400}.tablet\:text-bold{font-weight:700}.tablet\:flex-justify-center{justify-content:center}.tablet\:flex-justify-start{justify-content:flex-start}.tablet\:flex-justify-end{justify-content:flex-end}.tablet\:flex-justify{justify-content:space-between}.tablet\:line-height-sans-1{line-height:.9}.tablet\:line-height-sans-2{line-height:1.1}.tablet\:line-height-sans-3{line-height:1.3}.tablet\:line-height-sans-4{line-height:1.4}.tablet\:line-height-sans-5{line-height:1.5}.tablet\:line-height-sans-6{line-height:1.6}.tablet\:line-height-serif-1{line-height:1}.tablet\:line-height-serif-2{line-height:1.2}.tablet\:line-height-serif-3{line-height:1.4}.tablet\:line-height-serif-4{line-height:1.5}.tablet\:line-height-serif-5{line-height:1.7}.tablet\:line-height-serif-6{line-height:1.8}.tablet\:line-height-mono-1{line-height:1}.tablet\:line-height-mono-2{line-height:1.3}.tablet\:line-height-mono-3{line-height:1.4}.tablet\:line-height-mono-4{line-height:1.6}.tablet\:line-height-mono-5{line-height:1.7}.tablet\:line-height-mono-6{line-height:1.8}.tablet\:line-height-heading-1{line-height:.9}.tablet\:line-height-heading-2{line-height:1.1}.tablet\:line-height-heading-3{line-height:1.3}.tablet\:line-height-heading-4{line-height:1.4}.tablet\:line-height-heading-5{line-height:1.5}.tablet\:line-height-heading-6{line-height:1.6}.tablet\:line-height-ui-1{line-height:.9}.tablet\:line-height-ui-2{line-height:1.1}.tablet\:line-height-ui-3{line-height:1.3}.tablet\:line-height-ui-4{line-height:1.4}.tablet\:line-height-ui-5{line-height:1.5}.tablet\:line-height-ui-6{line-height:1.6}.tablet\:line-height-body-1{line-height:.9}.tablet\:line-height-body-2{line-height:1.1}.tablet\:line-height-body-3{line-height:1.3}.tablet\:line-height-body-4{line-height:1.4}.tablet\:line-height-body-5{line-height:1.5}.tablet\:line-height-body-6{line-height:1.6}.tablet\:line-height-code-1{line-height:1}.tablet\:line-height-code-2{line-height:1.3}.tablet\:line-height-code-3{line-height:1.4}.tablet\:line-height-code-4{line-height:1.6}.tablet\:line-height-code-5{line-height:1.7}.tablet\:line-height-code-6{line-height:1.8}.tablet\:line-height-alt-1{line-height:1}.tablet\:line-height-alt-2{line-height:1.2}.tablet\:line-height-alt-3{line-height:1.4}.tablet\:line-height-alt-4{line-height:1.5}.tablet\:line-height-alt-5{line-height:1.7}.tablet\:line-height-alt-6{line-height:1.8}.tablet\:margin-neg-1px{margin:-1px}.tablet\:margin-neg-2px{margin:-2px}.tablet\:margin-neg-05{margin:-.25rem}.tablet\:margin-neg-1{margin:-.5rem}.tablet\:margin-neg-105{margin:-.75rem}.tablet\:margin-neg-2{margin:-1rem}.tablet\:margin-neg-205{margin:-1.25rem}.tablet\:margin-neg-3{margin:-1.5rem}.tablet\:margin-1px{margin:1px}.tablet\:margin-2px{margin:2px}.tablet\:margin-05{margin:.25rem}.tablet\:margin-1{margin:.5rem}.tablet\:margin-105{margin:.75rem}.tablet\:margin-2{margin:1rem}.tablet\:margin-205{margin:1.25rem}.tablet\:margin-3{margin:1.5rem}.tablet\:margin-4{margin:2rem}.tablet\:margin-5{margin:2.5rem}.tablet\:margin-6{margin:3rem}.tablet\:margin-7{margin:3.5rem}.tablet\:margin-8{margin:4rem}.tablet\:margin-9{margin:4.5rem}.tablet\:margin-10{margin:5rem}.tablet\:margin-15{margin:7.5rem}.tablet\:margin-05em{margin:.5em}.tablet\:margin-1em{margin:1em}.tablet\:margin-105em{margin:1.5em}.tablet\:margin-2em{margin:2em}.tablet\:margin-0{margin:0}.tablet\:margin-y-1px{margin-bottom:1px;margin-top:1px}.tablet\:margin-top-1px{margin-top:1px}.tablet\:margin-bottom-1px{margin-bottom:1px}.tablet\:margin-y-2px{margin-bottom:2px;margin-top:2px}.tablet\:margin-top-2px{margin-top:2px}.tablet\:margin-bottom-2px{margin-bottom:2px}.tablet\:margin-y-05{margin-bottom:.25rem;margin-top:.25rem}.tablet\:margin-top-05{margin-top:.25rem}.tablet\:margin-bottom-05{margin-bottom:.25rem}.tablet\:margin-y-1{margin-bottom:.5rem;margin-top:.5rem}.tablet\:margin-top-1{margin-top:.5rem}.tablet\:margin-bottom-1{margin-bottom:.5rem}.tablet\:margin-y-105{margin-bottom:.75rem;margin-top:.75rem}.tablet\:margin-top-105{margin-top:.75rem}.tablet\:margin-bottom-105{margin-bottom:.75rem}.tablet\:margin-y-2{margin-bottom:1rem;margin-top:1rem}.tablet\:margin-top-2{margin-top:1rem}.tablet\:margin-bottom-2{margin-bottom:1rem}.tablet\:margin-y-205{margin-bottom:1.25rem;margin-top:1.25rem}.tablet\:margin-top-205{margin-top:1.25rem}.tablet\:margin-bottom-205{margin-bottom:1.25rem}.tablet\:margin-y-3{margin-bottom:1.5rem;margin-top:1.5rem}.tablet\:margin-top-3{margin-top:1.5rem}.tablet\:margin-bottom-3{margin-bottom:1.5rem}.tablet\:margin-y-neg-1px{margin-bottom:-1px;margin-top:-1px}.tablet\:margin-top-neg-1px{margin-top:-1px}.tablet\:margin-bottom-neg-1px{margin-bottom:-1px}.tablet\:margin-y-neg-2px{margin-bottom:-2px;margin-top:-2px}.tablet\:margin-top-neg-2px{margin-top:-2px}.tablet\:margin-bottom-neg-2px{margin-bottom:-2px}.tablet\:margin-y-neg-05{margin-bottom:-.25rem;margin-top:-.25rem}.tablet\:margin-top-neg-05{margin-top:-.25rem}.tablet\:margin-bottom-neg-05{margin-bottom:-.25rem}.tablet\:margin-y-neg-1{margin-bottom:-.5rem;margin-top:-.5rem}.tablet\:margin-top-neg-1{margin-top:-.5rem}.tablet\:margin-bottom-neg-1{margin-bottom:-.5rem}.tablet\:margin-y-neg-105{margin-bottom:-.75rem;margin-top:-.75rem}.tablet\:margin-top-neg-105{margin-top:-.75rem}.tablet\:margin-bottom-neg-105{margin-bottom:-.75rem}.tablet\:margin-y-neg-2{margin-bottom:-1rem;margin-top:-1rem}.tablet\:margin-top-neg-2{margin-top:-1rem}.tablet\:margin-bottom-neg-2{margin-bottom:-1rem}.tablet\:margin-y-neg-205{margin-bottom:-1.25rem;margin-top:-1.25rem}.tablet\:margin-top-neg-205{margin-top:-1.25rem}.tablet\:margin-bottom-neg-205{margin-bottom:-1.25rem}.tablet\:margin-y-neg-3{margin-bottom:-1.5rem;margin-top:-1.5rem}.tablet\:margin-top-neg-3{margin-top:-1.5rem}.tablet\:margin-bottom-neg-3{margin-bottom:-1.5rem}.tablet\:margin-y-4{margin-bottom:2rem;margin-top:2rem}.tablet\:margin-top-4{margin-top:2rem}.tablet\:margin-bottom-4{margin-bottom:2rem}.tablet\:margin-y-5{margin-bottom:2.5rem;margin-top:2.5rem}.tablet\:margin-top-5{margin-top:2.5rem}.tablet\:margin-bottom-5{margin-bottom:2.5rem}.tablet\:margin-y-6{margin-bottom:3rem;margin-top:3rem}.tablet\:margin-top-6{margin-top:3rem}.tablet\:margin-bottom-6{margin-bottom:3rem}.tablet\:margin-y-7{margin-bottom:3.5rem;margin-top:3.5rem}.tablet\:margin-top-7{margin-top:3.5rem}.tablet\:margin-bottom-7{margin-bottom:3.5rem}.tablet\:margin-y-8{margin-bottom:4rem;margin-top:4rem}.tablet\:margin-top-8{margin-top:4rem}.tablet\:margin-bottom-8{margin-bottom:4rem}.tablet\:margin-y-9{margin-bottom:4.5rem;margin-top:4.5rem}.tablet\:margin-top-9{margin-top:4.5rem}.tablet\:margin-bottom-9{margin-bottom:4.5rem}.tablet\:margin-y-10{margin-bottom:5rem;margin-top:5rem}.tablet\:margin-top-10{margin-top:5rem}.tablet\:margin-bottom-10{margin-bottom:5rem}.tablet\:margin-y-15{margin-bottom:7.5rem;margin-top:7.5rem}.tablet\:margin-top-15{margin-top:7.5rem}.tablet\:margin-bottom-15{margin-bottom:7.5rem}.tablet\:margin-y-05em{margin-bottom:.5em;margin-top:.5em}.tablet\:margin-top-05em{margin-top:.5em}.tablet\:margin-bottom-05em{margin-bottom:.5em}.tablet\:margin-y-1em{margin-bottom:1em;margin-top:1em}.tablet\:margin-top-1em{margin-top:1em}.tablet\:margin-bottom-1em{margin-bottom:1em}.tablet\:margin-y-105em{margin-bottom:1.5em;margin-top:1.5em}.tablet\:margin-top-105em{margin-top:1.5em}.tablet\:margin-bottom-105em{margin-bottom:1.5em}.tablet\:margin-y-2em{margin-bottom:2em;margin-top:2em}.tablet\:margin-top-2em{margin-top:2em}.tablet\:margin-bottom-2em{margin-bottom:2em}.tablet\:margin-y-0{margin-bottom:0;margin-top:0}.tablet\:margin-top-0{margin-top:0}.tablet\:margin-bottom-0{margin-bottom:0}.tablet\:margin-y-auto{margin-bottom:auto;margin-top:auto}.tablet\:margin-top-auto{margin-top:auto}.tablet\:margin-bottom-auto{margin-bottom:auto}.tablet\:margin-x-1px{margin-left:1px;margin-right:1px}.tablet\:margin-right-1px{margin-right:1px}.tablet\:margin-left-1px{margin-left:1px}.tablet\:margin-x-2px{margin-left:2px;margin-right:2px}.tablet\:margin-right-2px{margin-right:2px}.tablet\:margin-left-2px{margin-left:2px}.tablet\:margin-x-05{margin-left:.25rem;margin-right:.25rem}.tablet\:margin-right-05{margin-right:.25rem}.tablet\:margin-left-05{margin-left:.25rem}.tablet\:margin-x-1{margin-left:.5rem;margin-right:.5rem}.tablet\:margin-right-1{margin-right:.5rem}.tablet\:margin-left-1{margin-left:.5rem}.tablet\:margin-x-105{margin-left:.75rem;margin-right:.75rem}.tablet\:margin-right-105{margin-right:.75rem}.tablet\:margin-left-105{margin-left:.75rem}.tablet\:margin-x-2{margin-left:1rem;margin-right:1rem}.tablet\:margin-right-2{margin-right:1rem}.tablet\:margin-left-2{margin-left:1rem}.tablet\:margin-x-205{margin-left:1.25rem;margin-right:1.25rem}.tablet\:margin-right-205{margin-right:1.25rem}.tablet\:margin-left-205{margin-left:1.25rem}.tablet\:margin-x-3{margin-left:1.5rem;margin-right:1.5rem}.tablet\:margin-right-3{margin-right:1.5rem}.tablet\:margin-left-3{margin-left:1.5rem}.tablet\:margin-x-neg-1px{margin-left:-1px;margin-right:-1px}.tablet\:margin-right-neg-1px{margin-right:-1px}.tablet\:margin-left-neg-1px{margin-left:-1px}.tablet\:margin-x-neg-2px{margin-left:-2px;margin-right:-2px}.tablet\:margin-right-neg-2px{margin-right:-2px}.tablet\:margin-left-neg-2px{margin-left:-2px}.tablet\:margin-x-neg-05{margin-left:-.25rem;margin-right:-.25rem}.tablet\:margin-right-neg-05{margin-right:-.25rem}.tablet\:margin-left-neg-05{margin-left:-.25rem}.tablet\:margin-x-neg-1{margin-left:-.5rem;margin-right:-.5rem}.tablet\:margin-right-neg-1{margin-right:-.5rem}.tablet\:margin-left-neg-1{margin-left:-.5rem}.tablet\:margin-x-neg-105{margin-left:-.75rem;margin-right:-.75rem}.tablet\:margin-right-neg-105{margin-right:-.75rem}.tablet\:margin-left-neg-105{margin-left:-.75rem}.tablet\:margin-x-neg-2{margin-left:-1rem;margin-right:-1rem}.tablet\:margin-right-neg-2{margin-right:-1rem}.tablet\:margin-left-neg-2{margin-left:-1rem}.tablet\:margin-x-neg-205{margin-left:-1.25rem;margin-right:-1.25rem}.tablet\:margin-right-neg-205{margin-right:-1.25rem}.tablet\:margin-left-neg-205{margin-left:-1.25rem}.tablet\:margin-x-neg-3{margin-left:-1.5rem;margin-right:-1.5rem}.tablet\:margin-right-neg-3{margin-right:-1.5rem}.tablet\:margin-left-neg-3{margin-left:-1.5rem}.tablet\:margin-x-4{margin-left:2rem;margin-right:2rem}.tablet\:margin-right-4{margin-right:2rem}.tablet\:margin-left-4{margin-left:2rem}.tablet\:margin-x-5{margin-left:2.5rem;margin-right:2.5rem}.tablet\:margin-right-5{margin-right:2.5rem}.tablet\:margin-left-5{margin-left:2.5rem}.tablet\:margin-x-6{margin-left:3rem;margin-right:3rem}.tablet\:margin-right-6{margin-right:3rem}.tablet\:margin-left-6{margin-left:3rem}.tablet\:margin-x-7{margin-left:3.5rem;margin-right:3.5rem}.tablet\:margin-right-7{margin-right:3.5rem}.tablet\:margin-left-7{margin-left:3.5rem}.tablet\:margin-x-8{margin-left:4rem;margin-right:4rem}.tablet\:margin-right-8{margin-right:4rem}.tablet\:margin-left-8{margin-left:4rem}.tablet\:margin-x-9{margin-left:4.5rem;margin-right:4.5rem}.tablet\:margin-right-9{margin-right:4.5rem}.tablet\:margin-left-9{margin-left:4.5rem}.tablet\:margin-x-10{margin-left:5rem;margin-right:5rem}.tablet\:margin-right-10{margin-right:5rem}.tablet\:margin-left-10{margin-left:5rem}.tablet\:margin-x-15{margin-left:7.5rem;margin-right:7.5rem}.tablet\:margin-right-15{margin-right:7.5rem}.tablet\:margin-left-15{margin-left:7.5rem}.tablet\:margin-x-card{margin-left:10rem;margin-right:10rem}.tablet\:margin-right-card{margin-right:10rem}.tablet\:margin-left-card{margin-left:10rem}.tablet\:margin-x-card-lg{margin-left:15rem;margin-right:15rem}.tablet\:margin-right-card-lg{margin-right:15rem}.tablet\:margin-left-card-lg{margin-left:15rem}.tablet\:margin-x-mobile{margin-left:20rem;margin-right:20rem}.tablet\:margin-right-mobile{margin-right:20rem}.tablet\:margin-left-mobile{margin-left:20rem}.tablet\:margin-x-05em{margin-left:.5em;margin-right:.5em}.tablet\:margin-right-05em{margin-right:.5em}.tablet\:margin-left-05em{margin-left:.5em}.tablet\:margin-x-1em{margin-left:1em;margin-right:1em}.tablet\:margin-right-1em{margin-right:1em}.tablet\:margin-left-1em{margin-left:1em}.tablet\:margin-x-105em{margin-left:1.5em;margin-right:1.5em}.tablet\:margin-right-105em{margin-right:1.5em}.tablet\:margin-left-105em{margin-left:1.5em}.tablet\:margin-x-2em{margin-left:2em;margin-right:2em}.tablet\:margin-right-2em{margin-right:2em}.tablet\:margin-left-2em{margin-left:2em}.tablet\:margin-x-0{margin-left:0;margin-right:0}.tablet\:margin-right-0{margin-right:0}.tablet\:margin-left-0{margin-left:0}.tablet\:margin-x-auto{margin-left:auto;margin-right:auto}.tablet\:margin-right-auto{margin-right:auto}.tablet\:margin-left-auto{margin-left:auto}.tablet\:measure-1{max-width:44ex}.tablet\:measure-2{max-width:60ex}.tablet\:measure-3{max-width:64ex}.tablet\:measure-4{max-width:68ex}.tablet\:measure-5{max-width:72ex}.tablet\:measure-6{max-width:88ex}.tablet\:measure-none{max-width:none}.tablet\:order-first{order:-1}.tablet\:order-last{order:999}.tablet\:order-0,.tablet\:order-initial{order:0}.tablet\:order-1{order:1}.tablet\:order-2{order:2}.tablet\:order-3{order:3}.tablet\:order-4{order:4}.tablet\:order-5{order:5}.tablet\:order-6{order:6}.tablet\:order-7{order:7}.tablet\:order-8{order:8}.tablet\:order-9{order:9}.tablet\:order-10{order:10}.tablet\:order-11{order:11}.tablet\:padding-1px{padding:1px}.tablet\:padding-y-1px{padding-bottom:1px;padding-top:1px}.tablet\:padding-x-1px{padding-left:1px;padding-right:1px}.tablet\:padding-top-1px{padding-top:1px}.tablet\:padding-right-1px{padding-right:1px}.tablet\:padding-bottom-1px{padding-bottom:1px}.tablet\:padding-left-1px{padding-left:1px}.tablet\:padding-2px{padding:2px}.tablet\:padding-y-2px{padding-bottom:2px;padding-top:2px}.tablet\:padding-x-2px{padding-left:2px;padding-right:2px}.tablet\:padding-top-2px{padding-top:2px}.tablet\:padding-right-2px{padding-right:2px}.tablet\:padding-bottom-2px{padding-bottom:2px}.tablet\:padding-left-2px{padding-left:2px}.tablet\:padding-05{padding:.25rem}.tablet\:padding-y-05{padding-bottom:.25rem;padding-top:.25rem}.tablet\:padding-x-05{padding-left:.25rem;padding-right:.25rem}.tablet\:padding-top-05{padding-top:.25rem}.tablet\:padding-right-05{padding-right:.25rem}.tablet\:padding-bottom-05{padding-bottom:.25rem}.tablet\:padding-left-05{padding-left:.25rem}.tablet\:padding-1{padding:.5rem}.tablet\:padding-y-1{padding-bottom:.5rem;padding-top:.5rem}.tablet\:padding-x-1{padding-left:.5rem;padding-right:.5rem}.tablet\:padding-top-1{padding-top:.5rem}.tablet\:padding-right-1{padding-right:.5rem}.tablet\:padding-bottom-1{padding-bottom:.5rem}.tablet\:padding-left-1{padding-left:.5rem}.tablet\:padding-105{padding:.75rem}.tablet\:padding-y-105{padding-bottom:.75rem;padding-top:.75rem}.tablet\:padding-x-105{padding-left:.75rem;padding-right:.75rem}.tablet\:padding-top-105{padding-top:.75rem}.tablet\:padding-right-105{padding-right:.75rem}.tablet\:padding-bottom-105{padding-bottom:.75rem}.tablet\:padding-left-105{padding-left:.75rem}.tablet\:padding-2{padding:1rem}.tablet\:padding-y-2{padding-bottom:1rem;padding-top:1rem}.tablet\:padding-x-2{padding-left:1rem;padding-right:1rem}.tablet\:padding-top-2{padding-top:1rem}.tablet\:padding-right-2{padding-right:1rem}.tablet\:padding-bottom-2{padding-bottom:1rem}.tablet\:padding-left-2{padding-left:1rem}.tablet\:padding-205{padding:1.25rem}.tablet\:padding-y-205{padding-bottom:1.25rem;padding-top:1.25rem}.tablet\:padding-x-205{padding-left:1.25rem;padding-right:1.25rem}.tablet\:padding-top-205{padding-top:1.25rem}.tablet\:padding-right-205{padding-right:1.25rem}.tablet\:padding-bottom-205{padding-bottom:1.25rem}.tablet\:padding-left-205{padding-left:1.25rem}.tablet\:padding-3{padding:1.5rem}.tablet\:padding-y-3{padding-bottom:1.5rem;padding-top:1.5rem}.tablet\:padding-x-3{padding-left:1.5rem;padding-right:1.5rem}.tablet\:padding-top-3{padding-top:1.5rem}.tablet\:padding-right-3{padding-right:1.5rem}.tablet\:padding-bottom-3{padding-bottom:1.5rem}.tablet\:padding-left-3{padding-left:1.5rem}.tablet\:padding-4{padding:2rem}.tablet\:padding-y-4{padding-bottom:2rem;padding-top:2rem}.tablet\:padding-x-4{padding-left:2rem;padding-right:2rem}.tablet\:padding-top-4{padding-top:2rem}.tablet\:padding-right-4{padding-right:2rem}.tablet\:padding-bottom-4{padding-bottom:2rem}.tablet\:padding-left-4{padding-left:2rem}.tablet\:padding-5{padding:2.5rem}.tablet\:padding-y-5{padding-bottom:2.5rem;padding-top:2.5rem}.tablet\:padding-x-5{padding-left:2.5rem;padding-right:2.5rem}.tablet\:padding-top-5{padding-top:2.5rem}.tablet\:padding-right-5{padding-right:2.5rem}.tablet\:padding-bottom-5{padding-bottom:2.5rem}.tablet\:padding-left-5{padding-left:2.5rem}.tablet\:padding-6{padding:3rem}.tablet\:padding-y-6{padding-bottom:3rem;padding-top:3rem}.tablet\:padding-x-6{padding-left:3rem;padding-right:3rem}.tablet\:padding-top-6{padding-top:3rem}.tablet\:padding-right-6{padding-right:3rem}.tablet\:padding-bottom-6{padding-bottom:3rem}.tablet\:padding-left-6{padding-left:3rem}.tablet\:padding-7{padding:3.5rem}.tablet\:padding-y-7{padding-bottom:3.5rem;padding-top:3.5rem}.tablet\:padding-x-7{padding-left:3.5rem;padding-right:3.5rem}.tablet\:padding-top-7{padding-top:3.5rem}.tablet\:padding-right-7{padding-right:3.5rem}.tablet\:padding-bottom-7{padding-bottom:3.5rem}.tablet\:padding-left-7{padding-left:3.5rem}.tablet\:padding-8{padding:4rem}.tablet\:padding-y-8{padding-bottom:4rem;padding-top:4rem}.tablet\:padding-x-8{padding-left:4rem;padding-right:4rem}.tablet\:padding-top-8{padding-top:4rem}.tablet\:padding-right-8{padding-right:4rem}.tablet\:padding-bottom-8{padding-bottom:4rem}.tablet\:padding-left-8{padding-left:4rem}.tablet\:padding-9{padding:4.5rem}.tablet\:padding-y-9{padding-bottom:4.5rem;padding-top:4.5rem}.tablet\:padding-x-9{padding-left:4.5rem;padding-right:4.5rem}.tablet\:padding-top-9{padding-top:4.5rem}.tablet\:padding-right-9{padding-right:4.5rem}.tablet\:padding-bottom-9{padding-bottom:4.5rem}.tablet\:padding-left-9{padding-left:4.5rem}.tablet\:padding-10{padding:5rem}.tablet\:padding-y-10{padding-bottom:5rem;padding-top:5rem}.tablet\:padding-x-10{padding-left:5rem;padding-right:5rem}.tablet\:padding-top-10{padding-top:5rem}.tablet\:padding-right-10{padding-right:5rem}.tablet\:padding-bottom-10{padding-bottom:5rem}.tablet\:padding-left-10{padding-left:5rem}.tablet\:padding-15{padding:7.5rem}.tablet\:padding-y-15{padding-bottom:7.5rem;padding-top:7.5rem}.tablet\:padding-x-15{padding-left:7.5rem;padding-right:7.5rem}.tablet\:padding-top-15{padding-top:7.5rem}.tablet\:padding-right-15{padding-right:7.5rem}.tablet\:padding-bottom-15{padding-bottom:7.5rem}.tablet\:padding-left-15{padding-left:7.5rem}.tablet\:padding-0{padding:0}.tablet\:padding-y-0{padding-bottom:0;padding-top:0}.tablet\:padding-x-0{padding-left:0;padding-right:0}.tablet\:padding-top-0{padding-top:0}.tablet\:padding-right-0{padding-right:0}.tablet\:padding-bottom-0{padding-bottom:0}.tablet\:padding-left-0{padding-left:0}.tablet\:width-1px{width:1px}.tablet\:width-2px{width:2px}.tablet\:width-05{width:.25rem}.tablet\:width-1{width:.5rem}.tablet\:width-105{width:.75rem}.tablet\:width-2{width:1rem}.tablet\:width-205{width:1.25rem}.tablet\:width-3{width:1.5rem}.tablet\:width-4{width:2rem}.tablet\:width-5{width:2.5rem}.tablet\:width-6{width:3rem}.tablet\:width-7{width:3.5rem}.tablet\:width-8{width:4rem}.tablet\:width-9{width:4.5rem}.tablet\:width-10{width:5rem}.tablet\:width-15{width:7.5rem}.tablet\:width-card{width:10rem}.tablet\:width-card-lg{width:15rem}.tablet\:width-mobile{width:20rem}.tablet\:width-mobile-lg{width:30rem}.tablet\:width-tablet{width:40rem}.tablet\:width-tablet-lg{width:55rem}.tablet\:width-desktop{width:64rem}.tablet\:width-desktop-lg{width:75rem}.tablet\:width-widescreen{width:87.5rem}.tablet\:width-0{width:0}.tablet\:width-full{width:100%}.tablet\:width-auto{width:auto}}@media (min-width:64em){.desktop\:border-1px,.desktop\:hover\:border-1px:hover{border:1px solid}.desktop\:border-y-1px,.desktop\:hover\:border-y-1px:hover{border-bottom:1px solid;border-top:1px solid}.desktop\:border-x-1px,.desktop\:hover\:border-x-1px:hover{border-left:1px solid;border-right:1px solid}.desktop\:border-top-1px,.desktop\:hover\:border-top-1px:hover{border-top:1px solid}.desktop\:border-right-1px,.desktop\:hover\:border-right-1px:hover{border-right:1px solid}.desktop\:border-bottom-1px,.desktop\:hover\:border-bottom-1px:hover{border-bottom:1px solid}.desktop\:border-left-1px,.desktop\:hover\:border-left-1px:hover{border-left:1px solid}.desktop\:border-2px,.desktop\:hover\:border-2px:hover{border:2px solid}.desktop\:border-y-2px,.desktop\:hover\:border-y-2px:hover{border-bottom:2px solid;border-top:2px solid}.desktop\:border-x-2px,.desktop\:hover\:border-x-2px:hover{border-left:2px solid;border-right:2px solid}.desktop\:border-top-2px,.desktop\:hover\:border-top-2px:hover{border-top:2px solid}.desktop\:border-right-2px,.desktop\:hover\:border-right-2px:hover{border-right:2px solid}.desktop\:border-bottom-2px,.desktop\:hover\:border-bottom-2px:hover{border-bottom:2px solid}.desktop\:border-left-2px,.desktop\:hover\:border-left-2px:hover{border-left:2px solid}.desktop\:border-05,.desktop\:hover\:border-05:hover{border:.25rem solid}.desktop\:border-y-05,.desktop\:hover\:border-y-05:hover{border-bottom:.25rem solid;border-top:.25rem solid}.desktop\:border-x-05,.desktop\:hover\:border-x-05:hover{border-left:.25rem solid;border-right:.25rem solid}.desktop\:border-top-05,.desktop\:hover\:border-top-05:hover{border-top:.25rem solid}.desktop\:border-right-05,.desktop\:hover\:border-right-05:hover{border-right:.25rem solid}.desktop\:border-bottom-05,.desktop\:hover\:border-bottom-05:hover{border-bottom:.25rem solid}.desktop\:border-left-05,.desktop\:hover\:border-left-05:hover{border-left:.25rem solid}.desktop\:border-1,.desktop\:hover\:border-1:hover{border:.5rem solid}.desktop\:border-y-1,.desktop\:hover\:border-y-1:hover{border-bottom:.5rem solid;border-top:.5rem solid}.desktop\:border-x-1,.desktop\:hover\:border-x-1:hover{border-left:.5rem solid;border-right:.5rem solid}.desktop\:border-top-1,.desktop\:hover\:border-top-1:hover{border-top:.5rem solid}.desktop\:border-right-1,.desktop\:hover\:border-right-1:hover{border-right:.5rem solid}.desktop\:border-bottom-1,.desktop\:hover\:border-bottom-1:hover{border-bottom:.5rem solid}.desktop\:border-left-1,.desktop\:hover\:border-left-1:hover{border-left:.5rem solid}.desktop\:border-105,.desktop\:hover\:border-105:hover{border:.75rem solid}.desktop\:border-y-105,.desktop\:hover\:border-y-105:hover{border-bottom:.75rem solid;border-top:.75rem solid}.desktop\:border-x-105,.desktop\:hover\:border-x-105:hover{border-left:.75rem solid;border-right:.75rem solid}.desktop\:border-top-105,.desktop\:hover\:border-top-105:hover{border-top:.75rem solid}.desktop\:border-right-105,.desktop\:hover\:border-right-105:hover{border-right:.75rem solid}.desktop\:border-bottom-105,.desktop\:hover\:border-bottom-105:hover{border-bottom:.75rem solid}.desktop\:border-left-105,.desktop\:hover\:border-left-105:hover{border-left:.75rem solid}.desktop\:border-2,.desktop\:hover\:border-2:hover{border:1rem solid}.desktop\:border-y-2,.desktop\:hover\:border-y-2:hover{border-bottom:1rem solid;border-top:1rem solid}.desktop\:border-x-2,.desktop\:hover\:border-x-2:hover{border-left:1rem solid;border-right:1rem solid}.desktop\:border-top-2,.desktop\:hover\:border-top-2:hover{border-top:1rem solid}.desktop\:border-right-2,.desktop\:hover\:border-right-2:hover{border-right:1rem solid}.desktop\:border-bottom-2,.desktop\:hover\:border-bottom-2:hover{border-bottom:1rem solid}.desktop\:border-left-2,.desktop\:hover\:border-left-2:hover{border-left:1rem solid}.desktop\:border-205,.desktop\:hover\:border-205:hover{border:1.25rem solid}.desktop\:border-y-205,.desktop\:hover\:border-y-205:hover{border-bottom:1.25rem solid;border-top:1.25rem solid}.desktop\:border-x-205,.desktop\:hover\:border-x-205:hover{border-left:1.25rem solid;border-right:1.25rem solid}.desktop\:border-top-205,.desktop\:hover\:border-top-205:hover{border-top:1.25rem solid}.desktop\:border-right-205,.desktop\:hover\:border-right-205:hover{border-right:1.25rem solid}.desktop\:border-bottom-205,.desktop\:hover\:border-bottom-205:hover{border-bottom:1.25rem solid}.desktop\:border-left-205,.desktop\:hover\:border-left-205:hover{border-left:1.25rem solid}.desktop\:border-3,.desktop\:hover\:border-3:hover{border:1.5rem solid}.desktop\:border-y-3,.desktop\:hover\:border-y-3:hover{border-bottom:1.5rem solid;border-top:1.5rem solid}.desktop\:border-x-3,.desktop\:hover\:border-x-3:hover{border-left:1.5rem solid;border-right:1.5rem solid}.desktop\:border-top-3,.desktop\:hover\:border-top-3:hover{border-top:1.5rem solid}.desktop\:border-right-3,.desktop\:hover\:border-right-3:hover{border-right:1.5rem solid}.desktop\:border-bottom-3,.desktop\:hover\:border-bottom-3:hover{border-bottom:1.5rem solid}.desktop\:border-left-3,.desktop\:hover\:border-left-3:hover{border-left:1.5rem solid}.desktop\:border-0,.desktop\:hover\:border-0:hover{border:0 solid}.desktop\:border-y-0,.desktop\:hover\:border-y-0:hover{border-bottom:0 solid;border-top:0 solid}.desktop\:border-x-0,.desktop\:hover\:border-x-0:hover{border-left:0 solid;border-right:0 solid}.desktop\:border-top-0,.desktop\:hover\:border-top-0:hover{border-top:0 solid}.desktop\:border-right-0,.desktop\:hover\:border-right-0:hover{border-right:0 solid}.desktop\:border-bottom-0,.desktop\:hover\:border-bottom-0:hover{border-bottom:0 solid}.desktop\:border-left-0,.desktop\:hover\:border-left-0:hover{border-left:0 solid}.desktop\:border,.desktop\:hover\:border:hover{border:1px solid}.desktop\:border-y,.desktop\:hover\:border-y:hover{border-bottom:1px solid;border-top:1px solid}.desktop\:border-x,.desktop\:hover\:border-x:hover{border-left:1px solid;border-right:1px solid}.desktop\:border-top,.desktop\:hover\:border-top:hover{border-top:1px solid}.desktop\:border-right,.desktop\:hover\:border-right:hover{border-right:1px solid}.desktop\:border-bottom,.desktop\:hover\:border-bottom:hover{border-bottom:1px solid}.desktop\:border-left,.desktop\:hover\:border-left:hover{border-left:1px solid}.desktop\:border-transparent,.desktop\:hover\:border-transparent:hover{border-color:transparent}.desktop\:border-black,.desktop\:hover\:border-black:hover{border-color:#000}.desktop\:border-white,.desktop\:hover\:border-white:hover{border-color:#fff}.desktop\:border-red,.desktop\:hover\:border-red:hover{border-color:#e52207}.desktop\:border-orange,.desktop\:hover\:border-orange:hover{border-color:#e66f0e}.desktop\:border-gold,.desktop\:hover\:border-gold:hover{border-color:#ffbe2e}.desktop\:border-yellow,.desktop\:hover\:border-yellow:hover{border-color:#fee685}.desktop\:border-green,.desktop\:hover\:border-green:hover{border-color:#538200}.desktop\:border-mint,.desktop\:hover\:border-mint:hover{border-color:#04c585}.desktop\:border-cyan,.desktop\:hover\:border-cyan:hover{border-color:#009ec1}.desktop\:border-blue,.desktop\:hover\:border-blue:hover{border-color:#0076d6}.desktop\:border-indigo,.desktop\:hover\:border-indigo:hover{border-color:#676cc8}.desktop\:border-violet,.desktop\:hover\:border-violet:hover{border-color:#8168b3}.desktop\:border-magenta,.desktop\:hover\:border-magenta:hover{border-color:#d72d79}.desktop\:border-gray-5,.desktop\:hover\:border-gray-5:hover{border-color:#f0f0f0}.desktop\:border-gray-10,.desktop\:hover\:border-gray-10:hover{border-color:#e6e6e6}.desktop\:border-gray-30,.desktop\:hover\:border-gray-30:hover{border-color:#adadad}.desktop\:border-gray-50,.desktop\:hover\:border-gray-50:hover{border-color:#757575}.desktop\:border-gray-70,.desktop\:hover\:border-gray-70:hover{border-color:#454545}.desktop\:border-gray-90,.desktop\:hover\:border-gray-90:hover{border-color:#1b1b1b}.desktop\:border-base-lightest,.desktop\:hover\:border-base-lightest:hover{border-color:#f0f0f0}.desktop\:border-base-lighter,.desktop\:hover\:border-base-lighter:hover{border-color:#dfe1e2}.desktop\:border-base-light,.desktop\:hover\:border-base-light:hover{border-color:#a9aeb1}.desktop\:border-base,.desktop\:hover\:border-base:hover{border-color:#71767a}.desktop\:border-base-dark,.desktop\:hover\:border-base-dark:hover{border-color:#565c65}.desktop\:border-base-darker,.desktop\:hover\:border-base-darker:hover{border-color:#3d4551}.desktop\:border-base-darkest,.desktop\:border-ink,.desktop\:hover\:border-base-darkest:hover,.desktop\:hover\:border-ink:hover{border-color:#1b1b1b}.desktop\:border-primary-lighter,.desktop\:hover\:border-primary-lighter:hover{border-color:#d9e8f6}.desktop\:border-primary-light,.desktop\:hover\:border-primary-light:hover{border-color:#73b3e7}.desktop\:border-primary,.desktop\:hover\:border-primary:hover{border-color:#005ea2}.desktop\:border-primary-vivid,.desktop\:hover\:border-primary-vivid:hover{border-color:#0050d8}.desktop\:border-primary-dark,.desktop\:hover\:border-primary-dark:hover{border-color:#1a4480}.desktop\:border-primary-darker,.desktop\:hover\:border-primary-darker:hover{border-color:#162e51}.desktop\:border-secondary-lighter,.desktop\:hover\:border-secondary-lighter:hover{border-color:#f3e1e4}.desktop\:border-secondary-light,.desktop\:hover\:border-secondary-light:hover{border-color:#f2938c}.desktop\:border-secondary,.desktop\:hover\:border-secondary:hover{border-color:#d83933}.desktop\:border-secondary-vivid,.desktop\:hover\:border-secondary-vivid:hover{border-color:#e41d3d}.desktop\:border-secondary-dark,.desktop\:hover\:border-secondary-dark:hover{border-color:#b50909}.desktop\:border-secondary-darker,.desktop\:hover\:border-secondary-darker:hover{border-color:#8b0a03}.desktop\:border-accent-warm-darker,.desktop\:hover\:border-accent-warm-darker:hover{border-color:#775540}.desktop\:border-accent-warm-dark,.desktop\:hover\:border-accent-warm-dark:hover{border-color:#c05600}.desktop\:border-accent-warm,.desktop\:hover\:border-accent-warm:hover{border-color:#fa9441}.desktop\:border-accent-warm-light,.desktop\:hover\:border-accent-warm-light:hover{border-color:#ffbc78}.desktop\:border-accent-warm-lighter,.desktop\:hover\:border-accent-warm-lighter:hover{border-color:#f2e4d4}.desktop\:border-accent-cool-darker,.desktop\:hover\:border-accent-cool-darker:hover{border-color:#07648d}.desktop\:border-accent-cool-dark,.desktop\:hover\:border-accent-cool-dark:hover{border-color:#28a0cb}.desktop\:border-accent-cool,.desktop\:hover\:border-accent-cool:hover{border-color:#00bde3}.desktop\:border-accent-cool-light,.desktop\:hover\:border-accent-cool-light:hover{border-color:#97d4ea}.desktop\:border-accent-cool-lighter,.desktop\:hover\:border-accent-cool-lighter:hover{border-color:#e1f3f8}.desktop\:radius-0{border-radius:0}.desktop\:radius-top-0{border-top-left-radius:0;border-top-right-radius:0}.desktop\:radius-right-0{border-bottom-right-radius:0;border-top-right-radius:0}.desktop\:radius-bottom-0{border-bottom-left-radius:0;border-bottom-right-radius:0}.desktop\:radius-left-0{border-bottom-left-radius:0;border-top-left-radius:0}.desktop\:radius-none{border-radius:0}.desktop\:radius-top-none{border-top-left-radius:0;border-top-right-radius:0}.desktop\:radius-right-none{border-bottom-right-radius:0;border-top-right-radius:0}.desktop\:radius-bottom-none{border-bottom-left-radius:0;border-bottom-right-radius:0}.desktop\:radius-left-none{border-bottom-left-radius:0;border-top-left-radius:0}.desktop\:radius-sm{border-radius:2px}.desktop\:radius-top-sm{border-top-left-radius:2px;border-top-right-radius:2px}.desktop\:radius-right-sm{border-bottom-right-radius:2px;border-top-right-radius:2px}.desktop\:radius-bottom-sm{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.desktop\:radius-left-sm{border-bottom-left-radius:2px;border-top-left-radius:2px}.desktop\:radius-md{border-radius:.25rem}.desktop\:radius-top-md{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.desktop\:radius-right-md{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.desktop\:radius-bottom-md{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.desktop\:radius-left-md{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.desktop\:radius-lg{border-radius:.5rem}.desktop\:radius-top-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.desktop\:radius-right-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.desktop\:radius-bottom-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.desktop\:radius-left-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.desktop\:radius-pill{border-radius:99rem}.desktop\:radius-top-pill{border-top-left-radius:99rem;border-top-right-radius:99rem}.desktop\:radius-right-pill{border-bottom-right-radius:99rem;border-top-right-radius:99rem}.desktop\:radius-bottom-pill{border-bottom-left-radius:99rem;border-bottom-right-radius:99rem}.desktop\:radius-left-pill{border-bottom-left-radius:99rem;border-top-left-radius:99rem}.desktop\:display-block{display:block}.desktop\:display-flex{display:flex}.desktop\:display-none{display:none}.desktop\:display-inline{display:inline}.desktop\:display-inline-block{display:inline-block}.desktop\:display-inline-flex{display:inline-flex}.desktop\:display-table{display:table}.desktop\:display-table-cell{display:table-cell}.desktop\:display-table-row{display:table-row}.desktop\:font-mono-3xs{font-size:.77rem}.desktop\:font-mono-2xs{font-size:.83rem}.desktop\:font-mono-xs{font-size:.89rem}.desktop\:font-mono-sm{font-size:.95rem}.desktop\:font-mono-md{font-size:1.01rem}.desktop\:font-mono-lg{font-size:1.31rem}.desktop\:font-mono-xl{font-size:1.91rem}.desktop\:font-mono-2xl{font-size:2.38rem}.desktop\:font-mono-3xl{font-size:2.86rem}.desktop\:font-sans-3xs{font-size:.87rem}.desktop\:font-sans-2xs{font-size:.93rem}.desktop\:font-sans-xs{font-size:1rem}.desktop\:font-sans-sm{font-size:1.06rem}.desktop\:font-sans-md{font-size:1.13rem}.desktop\:font-sans-lg{font-size:1.46rem}.desktop\:font-sans-xl{font-size:2.13rem}.desktop\:font-sans-2xl{font-size:2.66rem}.desktop\:font-sans-3xl{font-size:3.19rem}.desktop\:font-serif-3xs{font-size:.79rem}.desktop\:font-serif-2xs{font-size:.85rem}.desktop\:font-serif-xs{font-size:.91rem}.desktop\:font-serif-sm{font-size:.98rem}.desktop\:font-serif-md{font-size:1.04rem}.desktop\:font-serif-lg{font-size:1.34rem}.desktop\:font-serif-xl{font-size:1.95rem}.desktop\:font-serif-2xl{font-size:2.44rem}.desktop\:font-serif-3xl{font-size:2.93rem}.desktop\:font-heading-3xs{font-size:.87rem}.desktop\:font-heading-2xs{font-size:.93rem}.desktop\:font-heading-xs{font-size:1rem}.desktop\:font-heading-sm{font-size:1.06rem}.desktop\:font-heading-md{font-size:1.13rem}.desktop\:font-heading-lg{font-size:1.46rem}.desktop\:font-heading-xl{font-size:2.13rem}.desktop\:font-heading-2xl{font-size:2.66rem}.desktop\:font-heading-3xl{font-size:3.19rem}.desktop\:font-body-3xs{font-size:.87rem}.desktop\:font-body-2xs{font-size:.93rem}.desktop\:font-body-xs{font-size:1rem}.desktop\:font-body-sm{font-size:1.06rem}.desktop\:font-body-md{font-size:1.13rem}.desktop\:font-body-lg{font-size:1.46rem}.desktop\:font-body-xl{font-size:2.13rem}.desktop\:font-body-2xl{font-size:2.66rem}.desktop\:font-body-3xl{font-size:3.19rem}.desktop\:font-code-3xs{font-size:.77rem}.desktop\:font-code-2xs{font-size:.83rem}.desktop\:font-code-xs{font-size:.89rem}.desktop\:font-code-sm{font-size:.95rem}.desktop\:font-code-md{font-size:1.01rem}.desktop\:font-code-lg{font-size:1.31rem}.desktop\:font-code-xl{font-size:1.91rem}.desktop\:font-code-2xl{font-size:2.38rem}.desktop\:font-code-3xl{font-size:2.86rem}.desktop\:font-alt-3xs{font-size:.79rem}.desktop\:font-alt-2xs{font-size:.85rem}.desktop\:font-alt-xs{font-size:.91rem}.desktop\:font-alt-sm{font-size:.98rem}.desktop\:font-alt-md{font-size:1.04rem}.desktop\:font-alt-lg{font-size:1.34rem}.desktop\:font-alt-xl{font-size:1.95rem}.desktop\:font-alt-2xl{font-size:2.44rem}.desktop\:font-alt-3xl{font-size:2.93rem}.desktop\:font-ui-3xs{font-size:.87rem}.desktop\:font-ui-2xs{font-size:.93rem}.desktop\:font-ui-xs{font-size:1rem}.desktop\:font-ui-sm{font-size:1.06rem}.desktop\:font-ui-md{font-size:1.13rem}.desktop\:font-ui-lg{font-size:1.46rem}.desktop\:font-ui-xl{font-size:2.13rem}.desktop\:font-ui-2xl{font-size:2.66rem}.desktop\:font-ui-3xl{font-size:3.19rem}.desktop\:text-light{font-weight:300}.desktop\:text-normal{font-weight:400}.desktop\:text-bold{font-weight:700}.desktop\:flex-justify-center{justify-content:center}.desktop\:flex-justify-start{justify-content:flex-start}.desktop\:flex-justify-end{justify-content:flex-end}.desktop\:flex-justify{justify-content:space-between}.desktop\:line-height-sans-1{line-height:.9}.desktop\:line-height-sans-2{line-height:1.1}.desktop\:line-height-sans-3{line-height:1.3}.desktop\:line-height-sans-4{line-height:1.4}.desktop\:line-height-sans-5{line-height:1.5}.desktop\:line-height-sans-6{line-height:1.6}.desktop\:line-height-serif-1{line-height:1}.desktop\:line-height-serif-2{line-height:1.2}.desktop\:line-height-serif-3{line-height:1.4}.desktop\:line-height-serif-4{line-height:1.5}.desktop\:line-height-serif-5{line-height:1.7}.desktop\:line-height-serif-6{line-height:1.8}.desktop\:line-height-mono-1{line-height:1}.desktop\:line-height-mono-2{line-height:1.3}.desktop\:line-height-mono-3{line-height:1.4}.desktop\:line-height-mono-4{line-height:1.6}.desktop\:line-height-mono-5{line-height:1.7}.desktop\:line-height-mono-6{line-height:1.8}.desktop\:line-height-heading-1{line-height:.9}.desktop\:line-height-heading-2{line-height:1.1}.desktop\:line-height-heading-3{line-height:1.3}.desktop\:line-height-heading-4{line-height:1.4}.desktop\:line-height-heading-5{line-height:1.5}.desktop\:line-height-heading-6{line-height:1.6}.desktop\:line-height-ui-1{line-height:.9}.desktop\:line-height-ui-2{line-height:1.1}.desktop\:line-height-ui-3{line-height:1.3}.desktop\:line-height-ui-4{line-height:1.4}.desktop\:line-height-ui-5{line-height:1.5}.desktop\:line-height-ui-6{line-height:1.6}.desktop\:line-height-body-1{line-height:.9}.desktop\:line-height-body-2{line-height:1.1}.desktop\:line-height-body-3{line-height:1.3}.desktop\:line-height-body-4{line-height:1.4}.desktop\:line-height-body-5{line-height:1.5}.desktop\:line-height-body-6{line-height:1.6}.desktop\:line-height-code-1{line-height:1}.desktop\:line-height-code-2{line-height:1.3}.desktop\:line-height-code-3{line-height:1.4}.desktop\:line-height-code-4{line-height:1.6}.desktop\:line-height-code-5{line-height:1.7}.desktop\:line-height-code-6{line-height:1.8}.desktop\:line-height-alt-1{line-height:1}.desktop\:line-height-alt-2{line-height:1.2}.desktop\:line-height-alt-3{line-height:1.4}.desktop\:line-height-alt-4{line-height:1.5}.desktop\:line-height-alt-5{line-height:1.7}.desktop\:line-height-alt-6{line-height:1.8}.desktop\:margin-neg-1px{margin:-1px}.desktop\:margin-neg-2px{margin:-2px}.desktop\:margin-neg-05{margin:-.25rem}.desktop\:margin-neg-1{margin:-.5rem}.desktop\:margin-neg-105{margin:-.75rem}.desktop\:margin-neg-2{margin:-1rem}.desktop\:margin-neg-205{margin:-1.25rem}.desktop\:margin-neg-3{margin:-1.5rem}.desktop\:margin-1px{margin:1px}.desktop\:margin-2px{margin:2px}.desktop\:margin-05{margin:.25rem}.desktop\:margin-1{margin:.5rem}.desktop\:margin-105{margin:.75rem}.desktop\:margin-2{margin:1rem}.desktop\:margin-205{margin:1.25rem}.desktop\:margin-3{margin:1.5rem}.desktop\:margin-4{margin:2rem}.desktop\:margin-5{margin:2.5rem}.desktop\:margin-6{margin:3rem}.desktop\:margin-7{margin:3.5rem}.desktop\:margin-8{margin:4rem}.desktop\:margin-9{margin:4.5rem}.desktop\:margin-10{margin:5rem}.desktop\:margin-15{margin:7.5rem}.desktop\:margin-05em{margin:.5em}.desktop\:margin-1em{margin:1em}.desktop\:margin-105em{margin:1.5em}.desktop\:margin-2em{margin:2em}.desktop\:margin-0{margin:0}.desktop\:margin-y-1px{margin-bottom:1px;margin-top:1px}.desktop\:margin-top-1px{margin-top:1px}.desktop\:margin-bottom-1px{margin-bottom:1px}.desktop\:margin-y-2px{margin-bottom:2px;margin-top:2px}.desktop\:margin-top-2px{margin-top:2px}.desktop\:margin-bottom-2px{margin-bottom:2px}.desktop\:margin-y-05{margin-bottom:.25rem;margin-top:.25rem}.desktop\:margin-top-05{margin-top:.25rem}.desktop\:margin-bottom-05{margin-bottom:.25rem}.desktop\:margin-y-1{margin-bottom:.5rem;margin-top:.5rem}.desktop\:margin-top-1{margin-top:.5rem}.desktop\:margin-bottom-1{margin-bottom:.5rem}.desktop\:margin-y-105{margin-bottom:.75rem;margin-top:.75rem}.desktop\:margin-top-105{margin-top:.75rem}.desktop\:margin-bottom-105{margin-bottom:.75rem}.desktop\:margin-y-2{margin-bottom:1rem;margin-top:1rem}.desktop\:margin-top-2{margin-top:1rem}.desktop\:margin-bottom-2{margin-bottom:1rem}.desktop\:margin-y-205{margin-bottom:1.25rem;margin-top:1.25rem}.desktop\:margin-top-205{margin-top:1.25rem}.desktop\:margin-bottom-205{margin-bottom:1.25rem}.desktop\:margin-y-3{margin-bottom:1.5rem;margin-top:1.5rem}.desktop\:margin-top-3{margin-top:1.5rem}.desktop\:margin-bottom-3{margin-bottom:1.5rem}.desktop\:margin-y-neg-1px{margin-bottom:-1px;margin-top:-1px}.desktop\:margin-top-neg-1px{margin-top:-1px}.desktop\:margin-bottom-neg-1px{margin-bottom:-1px}.desktop\:margin-y-neg-2px{margin-bottom:-2px;margin-top:-2px}.desktop\:margin-top-neg-2px{margin-top:-2px}.desktop\:margin-bottom-neg-2px{margin-bottom:-2px}.desktop\:margin-y-neg-05{margin-bottom:-.25rem;margin-top:-.25rem}.desktop\:margin-top-neg-05{margin-top:-.25rem}.desktop\:margin-bottom-neg-05{margin-bottom:-.25rem}.desktop\:margin-y-neg-1{margin-bottom:-.5rem;margin-top:-.5rem}.desktop\:margin-top-neg-1{margin-top:-.5rem}.desktop\:margin-bottom-neg-1{margin-bottom:-.5rem}.desktop\:margin-y-neg-105{margin-bottom:-.75rem;margin-top:-.75rem}.desktop\:margin-top-neg-105{margin-top:-.75rem}.desktop\:margin-bottom-neg-105{margin-bottom:-.75rem}.desktop\:margin-y-neg-2{margin-bottom:-1rem;margin-top:-1rem}.desktop\:margin-top-neg-2{margin-top:-1rem}.desktop\:margin-bottom-neg-2{margin-bottom:-1rem}.desktop\:margin-y-neg-205{margin-bottom:-1.25rem;margin-top:-1.25rem}.desktop\:margin-top-neg-205{margin-top:-1.25rem}.desktop\:margin-bottom-neg-205{margin-bottom:-1.25rem}.desktop\:margin-y-neg-3{margin-bottom:-1.5rem;margin-top:-1.5rem}.desktop\:margin-top-neg-3{margin-top:-1.5rem}.desktop\:margin-bottom-neg-3{margin-bottom:-1.5rem}.desktop\:margin-y-4{margin-bottom:2rem;margin-top:2rem}.desktop\:margin-top-4{margin-top:2rem}.desktop\:margin-bottom-4{margin-bottom:2rem}.desktop\:margin-y-5{margin-bottom:2.5rem;margin-top:2.5rem}.desktop\:margin-top-5{margin-top:2.5rem}.desktop\:margin-bottom-5{margin-bottom:2.5rem}.desktop\:margin-y-6{margin-bottom:3rem;margin-top:3rem}.desktop\:margin-top-6{margin-top:3rem}.desktop\:margin-bottom-6{margin-bottom:3rem}.desktop\:margin-y-7{margin-bottom:3.5rem;margin-top:3.5rem}.desktop\:margin-top-7{margin-top:3.5rem}.desktop\:margin-bottom-7{margin-bottom:3.5rem}.desktop\:margin-y-8{margin-bottom:4rem;margin-top:4rem}.desktop\:margin-top-8{margin-top:4rem}.desktop\:margin-bottom-8{margin-bottom:4rem}.desktop\:margin-y-9{margin-bottom:4.5rem;margin-top:4.5rem}.desktop\:margin-top-9{margin-top:4.5rem}.desktop\:margin-bottom-9{margin-bottom:4.5rem}.desktop\:margin-y-10{margin-bottom:5rem;margin-top:5rem}.desktop\:margin-top-10{margin-top:5rem}.desktop\:margin-bottom-10{margin-bottom:5rem}.desktop\:margin-y-15{margin-bottom:7.5rem;margin-top:7.5rem}.desktop\:margin-top-15{margin-top:7.5rem}.desktop\:margin-bottom-15{margin-bottom:7.5rem}.desktop\:margin-y-05em{margin-bottom:.5em;margin-top:.5em}.desktop\:margin-top-05em{margin-top:.5em}.desktop\:margin-bottom-05em{margin-bottom:.5em}.desktop\:margin-y-1em{margin-bottom:1em;margin-top:1em}.desktop\:margin-top-1em{margin-top:1em}.desktop\:margin-bottom-1em{margin-bottom:1em}.desktop\:margin-y-105em{margin-bottom:1.5em;margin-top:1.5em}.desktop\:margin-top-105em{margin-top:1.5em}.desktop\:margin-bottom-105em{margin-bottom:1.5em}.desktop\:margin-y-2em{margin-bottom:2em;margin-top:2em}.desktop\:margin-top-2em{margin-top:2em}.desktop\:margin-bottom-2em{margin-bottom:2em}.desktop\:margin-y-0{margin-bottom:0;margin-top:0}.desktop\:margin-top-0{margin-top:0}.desktop\:margin-bottom-0{margin-bottom:0}.desktop\:margin-y-auto{margin-bottom:auto;margin-top:auto}.desktop\:margin-top-auto{margin-top:auto}.desktop\:margin-bottom-auto{margin-bottom:auto}.desktop\:margin-x-1px{margin-left:1px;margin-right:1px}.desktop\:margin-right-1px{margin-right:1px}.desktop\:margin-left-1px{margin-left:1px}.desktop\:margin-x-2px{margin-left:2px;margin-right:2px}.desktop\:margin-right-2px{margin-right:2px}.desktop\:margin-left-2px{margin-left:2px}.desktop\:margin-x-05{margin-left:.25rem;margin-right:.25rem}.desktop\:margin-right-05{margin-right:.25rem}.desktop\:margin-left-05{margin-left:.25rem}.desktop\:margin-x-1{margin-left:.5rem;margin-right:.5rem}.desktop\:margin-right-1{margin-right:.5rem}.desktop\:margin-left-1{margin-left:.5rem}.desktop\:margin-x-105{margin-left:.75rem;margin-right:.75rem}.desktop\:margin-right-105{margin-right:.75rem}.desktop\:margin-left-105{margin-left:.75rem}.desktop\:margin-x-2{margin-left:1rem;margin-right:1rem}.desktop\:margin-right-2{margin-right:1rem}.desktop\:margin-left-2{margin-left:1rem}.desktop\:margin-x-205{margin-left:1.25rem;margin-right:1.25rem}.desktop\:margin-right-205{margin-right:1.25rem}.desktop\:margin-left-205{margin-left:1.25rem}.desktop\:margin-x-3{margin-left:1.5rem;margin-right:1.5rem}.desktop\:margin-right-3{margin-right:1.5rem}.desktop\:margin-left-3{margin-left:1.5rem}.desktop\:margin-x-neg-1px{margin-left:-1px;margin-right:-1px}.desktop\:margin-right-neg-1px{margin-right:-1px}.desktop\:margin-left-neg-1px{margin-left:-1px}.desktop\:margin-x-neg-2px{margin-left:-2px;margin-right:-2px}.desktop\:margin-right-neg-2px{margin-right:-2px}.desktop\:margin-left-neg-2px{margin-left:-2px}.desktop\:margin-x-neg-05{margin-left:-.25rem;margin-right:-.25rem}.desktop\:margin-right-neg-05{margin-right:-.25rem}.desktop\:margin-left-neg-05{margin-left:-.25rem}.desktop\:margin-x-neg-1{margin-left:-.5rem;margin-right:-.5rem}.desktop\:margin-right-neg-1{margin-right:-.5rem}.desktop\:margin-left-neg-1{margin-left:-.5rem}.desktop\:margin-x-neg-105{margin-left:-.75rem;margin-right:-.75rem}.desktop\:margin-right-neg-105{margin-right:-.75rem}.desktop\:margin-left-neg-105{margin-left:-.75rem}.desktop\:margin-x-neg-2{margin-left:-1rem;margin-right:-1rem}.desktop\:margin-right-neg-2{margin-right:-1rem}.desktop\:margin-left-neg-2{margin-left:-1rem}.desktop\:margin-x-neg-205{margin-left:-1.25rem;margin-right:-1.25rem}.desktop\:margin-right-neg-205{margin-right:-1.25rem}.desktop\:margin-left-neg-205{margin-left:-1.25rem}.desktop\:margin-x-neg-3{margin-left:-1.5rem;margin-right:-1.5rem}.desktop\:margin-right-neg-3{margin-right:-1.5rem}.desktop\:margin-left-neg-3{margin-left:-1.5rem}.desktop\:margin-x-4{margin-left:2rem;margin-right:2rem}.desktop\:margin-right-4{margin-right:2rem}.desktop\:margin-left-4{margin-left:2rem}.desktop\:margin-x-5{margin-left:2.5rem;margin-right:2.5rem}.desktop\:margin-right-5{margin-right:2.5rem}.desktop\:margin-left-5{margin-left:2.5rem}.desktop\:margin-x-6{margin-left:3rem;margin-right:3rem}.desktop\:margin-right-6{margin-right:3rem}.desktop\:margin-left-6{margin-left:3rem}.desktop\:margin-x-7{margin-left:3.5rem;margin-right:3.5rem}.desktop\:margin-right-7{margin-right:3.5rem}.desktop\:margin-left-7{margin-left:3.5rem}.desktop\:margin-x-8{margin-left:4rem;margin-right:4rem}.desktop\:margin-right-8{margin-right:4rem}.desktop\:margin-left-8{margin-left:4rem}.desktop\:margin-x-9{margin-left:4.5rem;margin-right:4.5rem}.desktop\:margin-right-9{margin-right:4.5rem}.desktop\:margin-left-9{margin-left:4.5rem}.desktop\:margin-x-10{margin-left:5rem;margin-right:5rem}.desktop\:margin-right-10{margin-right:5rem}.desktop\:margin-left-10{margin-left:5rem}.desktop\:margin-x-15{margin-left:7.5rem;margin-right:7.5rem}.desktop\:margin-right-15{margin-right:7.5rem}.desktop\:margin-left-15{margin-left:7.5rem}.desktop\:margin-x-card{margin-left:10rem;margin-right:10rem}.desktop\:margin-right-card{margin-right:10rem}.desktop\:margin-left-card{margin-left:10rem}.desktop\:margin-x-card-lg{margin-left:15rem;margin-right:15rem}.desktop\:margin-right-card-lg{margin-right:15rem}.desktop\:margin-left-card-lg{margin-left:15rem}.desktop\:margin-x-mobile{margin-left:20rem;margin-right:20rem}.desktop\:margin-right-mobile{margin-right:20rem}.desktop\:margin-left-mobile{margin-left:20rem}.desktop\:margin-x-05em{margin-left:.5em;margin-right:.5em}.desktop\:margin-right-05em{margin-right:.5em}.desktop\:margin-left-05em{margin-left:.5em}.desktop\:margin-x-1em{margin-left:1em;margin-right:1em}.desktop\:margin-right-1em{margin-right:1em}.desktop\:margin-left-1em{margin-left:1em}.desktop\:margin-x-105em{margin-left:1.5em;margin-right:1.5em}.desktop\:margin-right-105em{margin-right:1.5em}.desktop\:margin-left-105em{margin-left:1.5em}.desktop\:margin-x-2em{margin-left:2em;margin-right:2em}.desktop\:margin-right-2em{margin-right:2em}.desktop\:margin-left-2em{margin-left:2em}.desktop\:margin-x-0{margin-left:0;margin-right:0}.desktop\:margin-right-0{margin-right:0}.desktop\:margin-left-0{margin-left:0}.desktop\:margin-x-auto{margin-left:auto;margin-right:auto}.desktop\:margin-right-auto{margin-right:auto}.desktop\:margin-left-auto{margin-left:auto}.desktop\:measure-1{max-width:44ex}.desktop\:measure-2{max-width:60ex}.desktop\:measure-3{max-width:64ex}.desktop\:measure-4{max-width:68ex}.desktop\:measure-5{max-width:72ex}.desktop\:measure-6{max-width:88ex}.desktop\:measure-none{max-width:none}.desktop\:order-first{order:-1}.desktop\:order-last{order:999}.desktop\:order-0,.desktop\:order-initial{order:0}.desktop\:order-1{order:1}.desktop\:order-2{order:2}.desktop\:order-3{order:3}.desktop\:order-4{order:4}.desktop\:order-5{order:5}.desktop\:order-6{order:6}.desktop\:order-7{order:7}.desktop\:order-8{order:8}.desktop\:order-9{order:9}.desktop\:order-10{order:10}.desktop\:order-11{order:11}.desktop\:padding-1px{padding:1px}.desktop\:padding-y-1px{padding-bottom:1px;padding-top:1px}.desktop\:padding-x-1px{padding-left:1px;padding-right:1px}.desktop\:padding-top-1px{padding-top:1px}.desktop\:padding-right-1px{padding-right:1px}.desktop\:padding-bottom-1px{padding-bottom:1px}.desktop\:padding-left-1px{padding-left:1px}.desktop\:padding-2px{padding:2px}.desktop\:padding-y-2px{padding-bottom:2px;padding-top:2px}.desktop\:padding-x-2px{padding-left:2px;padding-right:2px}.desktop\:padding-top-2px{padding-top:2px}.desktop\:padding-right-2px{padding-right:2px}.desktop\:padding-bottom-2px{padding-bottom:2px}.desktop\:padding-left-2px{padding-left:2px}.desktop\:padding-05{padding:.25rem}.desktop\:padding-y-05{padding-bottom:.25rem;padding-top:.25rem}.desktop\:padding-x-05{padding-left:.25rem;padding-right:.25rem}.desktop\:padding-top-05{padding-top:.25rem}.desktop\:padding-right-05{padding-right:.25rem}.desktop\:padding-bottom-05{padding-bottom:.25rem}.desktop\:padding-left-05{padding-left:.25rem}.desktop\:padding-1{padding:.5rem}.desktop\:padding-y-1{padding-bottom:.5rem;padding-top:.5rem}.desktop\:padding-x-1{padding-left:.5rem;padding-right:.5rem}.desktop\:padding-top-1{padding-top:.5rem}.desktop\:padding-right-1{padding-right:.5rem}.desktop\:padding-bottom-1{padding-bottom:.5rem}.desktop\:padding-left-1{padding-left:.5rem}.desktop\:padding-105{padding:.75rem}.desktop\:padding-y-105{padding-bottom:.75rem;padding-top:.75rem}.desktop\:padding-x-105{padding-left:.75rem;padding-right:.75rem}.desktop\:padding-top-105{padding-top:.75rem}.desktop\:padding-right-105{padding-right:.75rem}.desktop\:padding-bottom-105{padding-bottom:.75rem}.desktop\:padding-left-105{padding-left:.75rem}.desktop\:padding-2{padding:1rem}.desktop\:padding-y-2{padding-bottom:1rem;padding-top:1rem}.desktop\:padding-x-2{padding-left:1rem;padding-right:1rem}.desktop\:padding-top-2{padding-top:1rem}.desktop\:padding-right-2{padding-right:1rem}.desktop\:padding-bottom-2{padding-bottom:1rem}.desktop\:padding-left-2{padding-left:1rem}.desktop\:padding-205{padding:1.25rem}.desktop\:padding-y-205{padding-bottom:1.25rem;padding-top:1.25rem}.desktop\:padding-x-205{padding-left:1.25rem;padding-right:1.25rem}.desktop\:padding-top-205{padding-top:1.25rem}.desktop\:padding-right-205{padding-right:1.25rem}.desktop\:padding-bottom-205{padding-bottom:1.25rem}.desktop\:padding-left-205{padding-left:1.25rem}.desktop\:padding-3{padding:1.5rem}.desktop\:padding-y-3{padding-bottom:1.5rem;padding-top:1.5rem}.desktop\:padding-x-3{padding-left:1.5rem;padding-right:1.5rem}.desktop\:padding-top-3{padding-top:1.5rem}.desktop\:padding-right-3{padding-right:1.5rem}.desktop\:padding-bottom-3{padding-bottom:1.5rem}.desktop\:padding-left-3{padding-left:1.5rem}.desktop\:padding-4{padding:2rem}.desktop\:padding-y-4{padding-bottom:2rem;padding-top:2rem}.desktop\:padding-x-4{padding-left:2rem;padding-right:2rem}.desktop\:padding-top-4{padding-top:2rem}.desktop\:padding-right-4{padding-right:2rem}.desktop\:padding-bottom-4{padding-bottom:2rem}.desktop\:padding-left-4{padding-left:2rem}.desktop\:padding-5{padding:2.5rem}.desktop\:padding-y-5{padding-bottom:2.5rem;padding-top:2.5rem}.desktop\:padding-x-5{padding-left:2.5rem;padding-right:2.5rem}.desktop\:padding-top-5{padding-top:2.5rem}.desktop\:padding-right-5{padding-right:2.5rem}.desktop\:padding-bottom-5{padding-bottom:2.5rem}.desktop\:padding-left-5{padding-left:2.5rem}.desktop\:padding-6{padding:3rem}.desktop\:padding-y-6{padding-bottom:3rem;padding-top:3rem}.desktop\:padding-x-6{padding-left:3rem;padding-right:3rem}.desktop\:padding-top-6{padding-top:3rem}.desktop\:padding-right-6{padding-right:3rem}.desktop\:padding-bottom-6{padding-bottom:3rem}.desktop\:padding-left-6{padding-left:3rem}.desktop\:padding-7{padding:3.5rem}.desktop\:padding-y-7{padding-bottom:3.5rem;padding-top:3.5rem}.desktop\:padding-x-7{padding-left:3.5rem;padding-right:3.5rem}.desktop\:padding-top-7{padding-top:3.5rem}.desktop\:padding-right-7{padding-right:3.5rem}.desktop\:padding-bottom-7{padding-bottom:3.5rem}.desktop\:padding-left-7{padding-left:3.5rem}.desktop\:padding-8{padding:4rem}.desktop\:padding-y-8{padding-bottom:4rem;padding-top:4rem}.desktop\:padding-x-8{padding-left:4rem;padding-right:4rem}.desktop\:padding-top-8{padding-top:4rem}.desktop\:padding-right-8{padding-right:4rem}.desktop\:padding-bottom-8{padding-bottom:4rem}.desktop\:padding-left-8{padding-left:4rem}.desktop\:padding-9{padding:4.5rem}.desktop\:padding-y-9{padding-bottom:4.5rem;padding-top:4.5rem}.desktop\:padding-x-9{padding-left:4.5rem;padding-right:4.5rem}.desktop\:padding-top-9{padding-top:4.5rem}.desktop\:padding-right-9{padding-right:4.5rem}.desktop\:padding-bottom-9{padding-bottom:4.5rem}.desktop\:padding-left-9{padding-left:4.5rem}.desktop\:padding-10{padding:5rem}.desktop\:padding-y-10{padding-bottom:5rem;padding-top:5rem}.desktop\:padding-x-10{padding-left:5rem;padding-right:5rem}.desktop\:padding-top-10{padding-top:5rem}.desktop\:padding-right-10{padding-right:5rem}.desktop\:padding-bottom-10{padding-bottom:5rem}.desktop\:padding-left-10{padding-left:5rem}.desktop\:padding-15{padding:7.5rem}.desktop\:padding-y-15{padding-bottom:7.5rem;padding-top:7.5rem}.desktop\:padding-x-15{padding-left:7.5rem;padding-right:7.5rem}.desktop\:padding-top-15{padding-top:7.5rem}.desktop\:padding-right-15{padding-right:7.5rem}.desktop\:padding-bottom-15{padding-bottom:7.5rem}.desktop\:padding-left-15{padding-left:7.5rem}.desktop\:padding-0{padding:0}.desktop\:padding-y-0{padding-bottom:0;padding-top:0}.desktop\:padding-x-0{padding-left:0;padding-right:0}.desktop\:padding-top-0{padding-top:0}.desktop\:padding-right-0{padding-right:0}.desktop\:padding-bottom-0{padding-bottom:0}.desktop\:padding-left-0{padding-left:0}.desktop\:width-1px{width:1px}.desktop\:width-2px{width:2px}.desktop\:width-05{width:.25rem}.desktop\:width-1{width:.5rem}.desktop\:width-105{width:.75rem}.desktop\:width-2{width:1rem}.desktop\:width-205{width:1.25rem}.desktop\:width-3{width:1.5rem}.desktop\:width-4{width:2rem}.desktop\:width-5{width:2.5rem}.desktop\:width-6{width:3rem}.desktop\:width-7{width:3.5rem}.desktop\:width-8{width:4rem}.desktop\:width-9{width:4.5rem}.desktop\:width-10{width:5rem}.desktop\:width-15{width:7.5rem}.desktop\:width-card{width:10rem}.desktop\:width-card-lg{width:15rem}.desktop\:width-mobile{width:20rem}.desktop\:width-mobile-lg{width:30rem}.desktop\:width-tablet{width:40rem}.desktop\:width-tablet-lg{width:55rem}.desktop\:width-desktop{width:64rem}.desktop\:width-desktop-lg{width:75rem}.desktop\:width-widescreen{width:87.5rem}.desktop\:width-0{width:0}.desktop\:width-full{width:100%}.desktop\:width-auto{width:auto}}#main-content{border-top:0}@media (min-width:30em){.j40-grid-container{line-height:1.5rem;padding-right:0}}.j40-header,.j40-header>li>a,.j40-primary-nav{color:#112f4e!important;z-index:5}.j40-header .usa-nav-container,.j40-header>li>a .usa-nav-container,.j40-primary-nav .usa-nav-container{max-width:160ex}.j40-header>li>a span,.j40-header span,.j40-primary-nav span{color:#112f4e}@media (min-width:64em){.j40-header .j40-title,.j40-header>li>a .j40-title,.j40-primary-nav .j40-title{font-size:.9em;font-weight:400;padding-bottom:0}.j40-header .usa-navbar,.j40-header>li>a .usa-navbar,.j40-primary-nav .usa-navbar{width:100%}.j40-header .sitelogo,.j40-header>li>a .sitelogo,.j40-primary-nav .sitelogo{float:left;margin-right:.5rem;padding:.5rem;width:4rem}.j40-header .usa-nav__primary .usa-nav__primary-item a,.j40-header>li>a .usa-nav__primary .usa-nav__primary-item a,.j40-primary-nav .usa-nav__primary .usa-nav__primary-item a{font-weight:600;margin-bottom:.5em}.j40-header .usa-logo,.j40-header>li>a .usa-logo,.j40-primary-nav .usa-logo{margin-bottom:1.2rem;margin-top:1.2rem}}@media (min-width:20em){.j40-header .usa-logo__text,.j40-header>li>a .usa-logo__text,.j40-primary-nav .usa-logo__text{font-weight:400;padding-bottom:0;padding-top:3px}.j40-header .usa-navbar,.j40-header>li>a .usa-navbar,.j40-primary-nav .usa-navbar{width:100%}.j40-header .j40-sitelogo,.j40-header>li>a .j40-sitelogo,.j40-primary-nav .j40-sitelogo{float:left;margin-right:.5em;padding:.4em;width:3em}}.j40-footer .j40-footer-logo{font-weight:700}.j40-footer .j40-footer-address .usa-footer__contact-info{display:inline-block;font-weight:400;line-height:1.5;text-align:left}@media (min-width:30em){.j40-main-content{margin-bottom:0;margin-top:2.5rem}}.j40-main-content h1{font-size:2.7rem}.j40-main-content h2{font-size:1.46rem}.j40-section-sm-header{font-weight:700;padding-bottom:.24rem;padding-right:.24rem}.j40-section-sm-body{line-height:1.5;padding-bottom:1.2rem;padding-right:1.2rem}.j40-section-sm-footer{padding-bottom:.5rem}.j40-usa-process-list__item--complete{border-left-color:#005ea2!important}.j40-usa-process-list__item--complete:before{background-color:#00a91c;color:#fff}.usa-prose h1,.usa-prose h2,.usa-prose h3,.usa-prose h4{font-family:Source Sans Pro Web,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}.usa-prose div,.usa-prose p{max-width:80ex}.j40-sitealert{margin:0;min-height:2.5em}.j40-sitealert p{margin:0}.j40-sitealert .j40-sitealert-title{font-weight:700}.j40-sitealert .usa-alert{margin:0;padding-bottom:0;padding-top:0}.j40-sitealert .usa-alert__body,.j40-sitealert .usa-alert__text{margin-bottom:0;padding-bottom:0;padding-top:0}.mapboxgl-popup-close-button{font-size:3em;margin-right:12px;margin-top:15px}.mapboxgl-popup-content{border-radius:8px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.5)!important;pointer-events:all!important;width:auto}.mapboxgl-ctrl-group:not(:empty){box-shadow:none}@media(-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:none}}.mapboxgl-ctrl-group{border-radius:0}.mapboxgl-ctrl button+button{border-top:1px}.mapboxgl-ctrl button{background-color:#fff;border:2px solid #000;border-radius:0;box-sizing:border-box;font-size:1.5em;height:1.66em;width:1.66em}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{height:1em}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6Ii8+PC9zdmc+)}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGQ9Ik0xOSAxM0g1di0yaDE0djJ6Ii8+PC9zdmc+)}.j40-process-list-wrapper>ul{-webkit-padding-start:0;margin-bottom:1rem;margin-top:3rem;padding-inline-start:0}.j40-process-list-wrapper>ul>li{border-left:.2rem solid #002d3f;list-style-type:none;margin-left:2.5rem;margin-top:-1rem;padding-bottom:2rem;padding-left:1.88rem;position:relative}.j40-process-list-wrapper>ul>li:before{border:1rem solid #002d3f;border-radius:100rem;content:" ";height:0;margin-left:-3rem;margin-top:-.5rem;position:absolute;width:0}.j40-process-list-wrapper>ul>li:last-child{border-left:.2rem solid transparent;margin-top:-1.9rem}.j40-math-division-container>.j40-math-eq-left-side{align-items:center;justify-content:center;padding:.5rem;text-align:right}.j40-math-division-container>.j40-math-eq-left-side>.j40-math-eq-numerator{border-bottom:3px solid #000;text-align:center;width:90%}.j40-math-division-container>.j40-math-eq-left-side>.j40-math-eq-denominator{text-align:center;width:90%}.j40-math-division-container>.j40-math-eq-middle{justify-content:center}.j40-math-division-container>.j40-math-eq-middle,.j40-math-division-container>.j40-math-eq-right-side{align-items:center;display:inline-flex;padding:.25rem}ul.j40-process-nested-list{margin-bottom:2rem}ul.j40-process-nested-list>li{list-style-type:disc}.j40-item-list-title{-webkit-margin-after:auto;margin-block-end:auto}.j40-item-list-subtitle{-webkit-margin-before:auto;-webkit-margin-after:auto;font-style:italic;margin-block-end:auto;margin-block-start:auto}.j40-main-grid-blue-bk{background-color:#eff6fb}.j40-aboutcard-container .j40-aboutcard-lg-card{margin:1.2rem 0 3rem}.j40-aboutcard-container .j40-aboutcard-lg-card .j40-aboutpage-image-container{padding:1.24rem 1.24rem 0 .24rem;width:10.5rem}.j40-aboutcard-container .j40-aboutcard-lg-card .j40-aboutcard-image{align-self:flex-start;flex:1 0 10%}.j40-aboutcard-container .j40-aboutcard-lg-card .j40-aboutcard-link{font-weight:700}.j40-aboutcard-container .j40-aboutcard-sm-card{margin:1.2rem 0 3rem}.j40-aboutcard-container .j40-aboutcard-sm-card .j40-aboutpage-image-container{padding:1.24rem 1.24rem 0 .24rem}.j40-aboutcard-container .j40-aboutcard-sm-card .j40-aboutcard-image{width:3rem}.j40-aboutcard-container .j40-aboutcard-sm-card .j40-aboutcard-link{font-weight:700}.alertWrapper-module--alertWrapper--blPAc{margin-bottom:0}.alertWrapper-module--alertHide--9Ud1N{display:none}.alertWrapper-module--alertWarning--31gxK{margin-top:0}.howYouCanHelp-module--howYouCanHelpContainer--3wcow{margin:2rem 0}.howYouCanHelp-module--howYouCanHelpContainer--3wcow .howYouCanHelp-module--howYouCanHelpText--38HSA{color:#122e51;padding-left:1rem}.howYouCanHelp-module--howYouCanHelpHeader--16A1k{color:#122e51;font-weight:400}.howYouCanHelp-module--howYouCanHelpList--3wyFv{list-style-type:disc;padding-bottom:1rem}.howYouCanHelp-module--howYouCanHelpListWrapper--BL7AD{padding-left:2rem}.territoryFocusControl-module--territoryFocusButton--3wWoV{background-color:#fff;border-color:#000;border-style:solid;border-width:1px 2px;height:2.5em;width:2.5em}.territoryFocusControl-module--territoryFocusButton--3wWoV:not(:disabled):hover{background-color:#f4f4f4}.territoryFocusControl-module--territoryFocusContainer--3N0XM{display:flex;flex-direction:column;font-size:16px;left:20px;line-height:1.75em;position:absolute;text-align:center;top:300px;top:150px;z-index:10}.territoryFocusControl-module--territoryFocusButton--3wWoV:first-child{border-top-width:2px}.territoryFocusControl-module--territoryFocusButton--3wWoV:last-child{border-bottom-width:2px}.mapIntroduction-module--mapIntroContainer--1K8du{padding:20px}.mapIntroduction-module--mapIntroHeader--32LBs{font-size:xx-large;line-height:1.9rem;padding-left:.3rem;padding-top:.8rem}.mapIntroduction-module--mapIntroText--Tib8L{display:flex;margin-top:2.4rem}.mapIntroduction-module--mapIntroLightbulb--3LBx0{align-self:flex-start;flex:1 0 10%}.mapIntroduction-module--didYouKnowBox--3ztEy{font-size:large;padding-left:.4rem;padding-top:.2rem}.mapIntroduction-module--didYouKnow--3_v_i{font-weight:600}.mapIntroduction-module--didYouKnowText--3sgHs{line-height:1.5rem;padding-top:.3rem;width:95%}.areaDetail-module--areaDetailContainer--YFThR{display:flex;flex-direction:column}.areaDetail-module--topRow--mrsfo{display:flex}.areaDetail-module--categorization--hB9K8,.areaDetail-module--cumulativeIndexScore--1MjN-{align-items:center;border-bottom:2px solid #f2f2f2;display:flex;flex:1 0 50%;flex-direction:column;height:7.7rem;padding-top:2rem}.areaDetail-module--censusLabel--3SC-c,.areaDetail-module--topRowTitle--umx39{color:#171716;font-size:small;font-weight:600}.areaDetail-module--topRowSubTitle--3je7r{color:#171716;font-size:small}.areaDetail-module--score--3bk9b{font-size:xx-large;font-weight:bolder}.areaDetail-module--scoreSuperscript--3VIYX{font-size:large;padding-bottom:1rem}.areaDetail-module--categorization--hB9K8{border-left:2px solid #f2f2f2}.areaDetail-module--priority--36uI7{display:flex}.areaDetail-module--prioritized--1XdWQ{background:#1a4480}.areaDetail-module--prioritized--1XdWQ,.areaDetail-module--threshold--1Y2Xo{align-self:center;border:1px solid #00bde3;border-radius:100%;height:.6rem;margin-right:.5rem;margin-top:.8rem;opacity:.6;width:.6rem}.areaDetail-module--threshold--1Y2Xo{background:#d7dde7}.areaDetail-module--nonPrioritized--1bTJl{align-self:center;border:1px solid #00bde3;border-radius:100%;height:.6rem;margin-right:.5rem;margin-top:.8rem;opacity:.6;width:.6rem}.areaDetail-module--prioritization--2NmrB{font-size:large;font-weight:700;padding-top:.8rem}.areaDetail-module--censusRow--169O8{border-bottom:2px solid #f2f2f2;display:flex;flex-direction:column;list-style:none;margin:0;padding:1rem}.areaDetail-module--censusText--3j1xg,.areaDetail-module--indicatorDescription--2xFDY{font-size:small}.areaDetail-module--divider--3yw9U{background-color:#edeef0;border-bottom:2px solid #f2f2f2;color:#171716;display:flex;font-size:small;font-weight:600;justify-content:space-between;padding:.3rem .5rem .3rem 1rem}.areaDetail-module--indicatorBox--2wAUP{border-bottom:2px solid #f2f2f2;display:flex;padding:1.5rem 1rem}@media screen and (max-width:400px){.areaDetail-module--indicatorBox--2wAUP{justify-content:space-between;padding-bottom:.5rem;padding-top:.5rem}}.areaDetail-module--indicatorBox--2wAUP:last-child{border-bottom:none}.areaDetail-module--indicatorTitle--3Ij_h{font-size:large;font-weight:bolder}.areaDetail-module--indicatorValue--3EtVQ{align-self:center;flex:1 0 37%;font-size:large;padding-left:2.4rem}@media screen and (max-width:400px){.areaDetail-module--indicatorValue--3EtVQ{align-self:inherit;flex:1 0 40%;padding-left:3rem;padding-top:1rem}}.maplibregl-map{-webkit-tap-highlight-color:rgba(0,0,0,0);font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative}.maplibregl-canvas{left:0;position:absolute;top:0}.maplibregl-map:-webkit-full-screen{height:100%;width:100%}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-webkit-user-select:none;-ms-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right,.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right{pointer-events:none;position:absolute;z-index:2}.maplibregl-ctrl-top-left{left:0;top:0}.maplibregl-ctrl-top-right{right:0;top:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{bottom:0;right:0}.maplibregl-ctrl{clear:both;pointer-events:auto;-webkit-transform:translate(0);transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{float:left;margin:10px 0 0 10px}.maplibregl-ctrl-top-right .maplibregl-ctrl{float:right;margin:10px 10px 0 0}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{float:left;margin:0 0 10px 10px}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{float:right;margin:0 10px 10px 0}.maplibregl-ctrl-group{background:#fff;border-radius:4px}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.maplibregl-ctrl-group button{background-color:transparent;border:0;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:none;padding:0;width:29px}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}@media (-ms-high-contrast:active){.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid ButtonText}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}.maplibregl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23999' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8h-8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8h-8z'/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23aaa' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{-webkit-animation:maplibregl-spin 2s linear infinite;animation:maplibregl-spin 2s linear infinite}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23666' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1 9-9z'/%3E%3C/svg%3E")}}@-webkit-keyframes maplibregl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes maplibregl-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}a.maplibregl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 88 23'%3E%3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.255 1.255 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.255 1.255 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5.11 5.11 0 0 1 .314-.787l.009-.016a4.623 4.623 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.548 4.548 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4.314.319.566.676.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.416 2.416 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.448 2.448 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675c.211.2.381.43.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.76 4.76 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.407 3.407 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.255 1.255 0 0 1 .689 1.004 4.73 4.73 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528 0 .343-.02.694-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.815 5.815 0 0 1-.548-2.512c0-.286.017-.567.053-.843a1.255 1.255 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.778 4.778 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.47 4.47 0 0 1-1.935-.424 1.252 1.252 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.402 2.402 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.703 4.703 0 0 1-1.782 1.884 4.767 4.767 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.47 4.47 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a4.983 4.983 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.255 1.255 0 0 1-1.115.676h-.098a1.255 1.255 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15c.329-.237.574-.499.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267c-.088-.22-.264-.438-.526-.658l-.032-.028a3.16 3.16 0 0 0-.668-.428l-.27-.12a3.293 3.293 0 0 0-1.235-.23c-.757 0-1.415.163-1.974.493a3.36 3.36 0 0 0-1.3 1.382c-.297.593-.444 1.284-.444 2.074 0 .8.17 1.503.51 2.107a3.795 3.795 0 0 0 1.382 1.381 3.883 3.883 0 0 0 1.893.477c.53 0 1.015-.11 1.455-.33zm-2.789-5.38c-.384.45-.575 1.038-.575 1.762 0 .735.186 1.332.559 1.794.384.45.933.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.17 2.17 0 0 0 .468-.29l.178-.161a2.163 2.163 0 0 0 .397-.561c.163-.333.244-.717.244-1.15v-.115c0-.472-.098-.894-.296-1.267l-.043-.077a2.211 2.211 0 0 0-.633-.709l-.13-.086-.047-.028a2.099 2.099 0 0 0-1.073-.285c-.702 0-1.244.231-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.958.958 0 0 0-.353-.389.851.851 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.626 2.626 0 0 0 .331.423c.213.22.464.402.755.548l.173.074c.433.17.93.255 1.49.255.68 0 1.295-.165 1.844-.493a3.447 3.447 0 0 0 1.316-1.4c.329-.603.493-1.299.493-2.089 0-1.273-.33-2.243-.988-2.913-.658-.68-1.52-1.02-2.584-1.02-.598 0-1.124.115-1.575.347a2.807 2.807 0 0 0-.415.262l-.199.166a3.35 3.35 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138c.137.193.297.36.48.5l.155.11.053.034c.34.197.713.297 1.119.297.714 0 1.262-.225 1.645-.675.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.29 0-.569.053-.835.16a2.366 2.366 0 0 0-.284.136 1.99 1.99 0 0 0-.363.254 2.237 2.237 0 0 0-.46.569l-.082.162a2.56 2.56 0 0 0-.213 1.072v.115c0 .471.098.894.296 1.267l.135.211zm.964-.818a1.11 1.11 0 0 0 .367.385.937.937 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a.995.995 0 0 0-.503.135l-.012.007a.859.859 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.43 1.43 0 0 0 .14.66zm15.7-6.222c.232-.23.346-.516.346-.856a1.053 1.053 0 0 0-.345-.79 1.175 1.175 0 0 0-.84-.329c-.34 0-.625.11-.855.33a1.053 1.053 0 0 0-.346.79c0 .34.115.625.346.855.23.23.516.346.856.346.34 0 .62-.115.839-.346zm4.337 9.314.033-1.332c.128.269.324.518.59.747l.098.081a3.727 3.727 0 0 0 .316.224l.223.122a3.21 3.21 0 0 0 1.44.322 3.785 3.785 0 0 0 1.875-.477 3.52 3.52 0 0 0 1.382-1.366c.352-.593.526-1.29.526-2.09 0-.79-.147-1.48-.444-2.073a3.235 3.235 0 0 0-1.283-1.399c-.549-.34-1.195-.51-1.942-.51a3.476 3.476 0 0 0-1.527.344l-.086.043-.165.09a3.412 3.412 0 0 0-.33.214c-.288.21-.507.446-.656.707a1.893 1.893 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.482 2.482 0 0 0 .566.7c.078.065.159.125.245.18l.144.08a2.105 2.105 0 0 0 .975.232c.713 0 1.262-.225 1.645-.675.384-.46.576-1.053.576-1.778 0-.734-.192-1.327-.576-1.777-.373-.46-.921-.692-1.645-.692a2.18 2.18 0 0 0-1.015.235c-.147.075-.285.17-.415.282l-.15.142a2.086 2.086 0 0 0-.42.594c-.149.32-.223.685-.223 1.1v.115c0 .47.097.89.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.868.868 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.13 1.13 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013c.23-.087.472-.134.724-.14l.069-.002c.329 0 .542.033.642.099l.247-1.794c-.13-.066-.37-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2.086 2.086 0 0 0-.411.148 2.18 2.18 0 0 0-.4.249 2.482 2.482 0 0 0-.485.499 2.659 2.659 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884c0-.364.053-.678.159-.943a1.49 1.49 0 0 1 .466-.636 2.52 2.52 0 0 1 .399-.253 2.19 2.19 0 0 1 .224-.099zm9.784 2.656.05-.922c0-1.162-.285-2.062-.856-2.698-.559-.647-1.42-.97-2.584-.97-.746 0-1.415.163-2.007.493a3.462 3.462 0 0 0-1.4 1.382c-.329.604-.493 1.306-.493 2.106 0 .714.143 1.371.428 1.975.285.593.73 1.07 1.332 1.432.604.351 1.355.526 2.255.526.649 0 1.204-.062 1.668-.185l.044-.012.135-.04c.409-.122.736-.263.984-.421l-.542-1.267c-.2.108-.415.199-.642.274l-.297.087c-.34.088-.773.131-1.3.131-.636 0-1.135-.147-1.497-.444a1.573 1.573 0 0 1-.192-.193c-.244-.294-.415-.705-.512-1.234l-.004-.021h5.43zm-5.427-1.256-.003.022h3.752v-.138c-.007-.485-.104-.857-.288-1.118a1.056 1.056 0 0 0-.156-.176c-.307-.285-.746-.428-1.316-.428-.657 0-1.155.202-1.494.604-.253.3-.417.712-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E%3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81c-.68 0-1.311-.16-1.893-.478a3.795 3.795 0 0 1-1.381-1.382c-.34-.604-.51-1.306-.51-2.106 0-.79.147-1.482.444-2.074a3.364 3.364 0 0 1 1.3-1.382c.559-.33 1.217-.494 1.974-.494a3.293 3.293 0 0 1 1.234.231 3.341 3.341 0 0 1 .97.575c.264.22.44.439.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332c-.186.395-.526.746-1.02 1.053a3.167 3.167 0 0 1-1.662.444zm.296-1.482c.626 0 1.152-.214 1.58-.642.428-.44.642-1.01.642-1.711v-.115c0-.472-.098-.894-.296-1.267a2.211 2.211 0 0 0-.807-.872 2.098 2.098 0 0 0-1.119-.313c-.702 0-1.245.231-1.629.692-.384.45-.575 1.037-.575 1.76 0 .736.186 1.333.559 1.795.384.45.933.675 1.645.675zm6.521-6.237h1.711v1.4c.604-1.065 1.547-1.597 2.83-1.597 1.064 0 1.926.34 2.584 1.02.659.67.988 1.641.988 2.914 0 .79-.164 1.487-.493 2.09a3.456 3.456 0 0 1-1.316 1.399 3.51 3.51 0 0 1-1.844.493c-.636 0-1.19-.11-1.662-.329a2.665 2.665 0 0 1-1.086-.97l.017 5.134h-1.728V9.242zm4.048 6.22c.714 0 1.262-.224 1.645-.674.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.395 0-.768.098-1.12.296-.34.187-.613.46-.822.823-.197.351-.296.763-.296 1.234v.115c0 .472.098.894.296 1.267.209.362.483.647.823.855.34.197.713.297 1.119.297z'/%3E%3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.159 1.159 0 0 1-.856-.346 1.165 1.165 0 0 1-.346-.856 1.053 1.053 0 0 1 .346-.79c.23-.219.516-.329.856-.329.329 0 .609.11.839.33a1.053 1.053 0 0 1 .345.79 1.159 1.159 0 0 1-.345.855c-.22.23-.5.346-.84.346zm7.875 9.133a3.167 3.167 0 0 1-1.662-.444c-.482-.307-.817-.658-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283c.186-.438.548-.812 1.086-1.119a3.486 3.486 0 0 1 1.778-.477c.746 0 1.393.17 1.942.51a3.235 3.235 0 0 1 1.283 1.4c.297.592.444 1.282.444 2.072 0 .8-.175 1.498-.526 2.09a3.52 3.52 0 0 1-1.382 1.366 3.785 3.785 0 0 1-1.876.477zm-.296-1.481c.713 0 1.26-.225 1.645-.675.384-.46.577-1.053.577-1.778 0-.734-.193-1.327-.577-1.776-.373-.46-.921-.692-1.645-.692a2.115 2.115 0 0 0-1.58.659c-.428.428-.642.992-.642 1.694v.115c0 .473.098.895.296 1.267a2.385 2.385 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481c.176-.505.46-.91.856-1.217a2.14 2.14 0 0 1 1.349-.46c.351 0 .593.032.724.098l-.247 1.794c-.099-.066-.313-.099-.642-.099-.516 0-.988.164-1.416.494-.417.329-.626.855-.626 1.58v3.883h-1.777V9.242zm9.534 7.718c-.9 0-1.651-.175-2.255-.526-.603-.362-1.047-.84-1.332-1.432a4.567 4.567 0 0 1-.428-1.975c0-.8.164-1.502.493-2.106a3.462 3.462 0 0 1 1.4-1.382c.592-.33 1.262-.494 2.007-.494 1.163 0 2.024.324 2.584.97.57.637.856 1.537.856 2.7 0 .296-.017.603-.05.92h-5.43c.12.67.356 1.153.708 1.45.362.296.86.443 1.497.443.526 0 .96-.044 1.3-.131a4.123 4.123 0 0 0 .938-.362l.542 1.267c-.274.175-.647.329-1.119.46-.472.132-1.042.197-1.711.197zm1.596-4.558c.01-.68-.137-1.158-.444-1.432-.307-.285-.746-.428-1.316-.428-1.152 0-1.815.62-1.991 1.86h3.752z'/%3E%3Cg fill-rule='evenodd' stroke-width='1.036'%3E%3Cpath fill='%23000' fill-opacity='.4' d='m8.166 16.146-.002.002a1.54 1.54 0 0 1-2.009 0l-.002-.002-.043-.034-.002-.002-.199-.162H4.377a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659H8.411l-.202.164zm-1.121-.905a.29.29 0 0 0 .113.023.286.286 0 0 0 .189-.07l.077-.063c.634-.508 4.672-3.743 4.672-7.575 0-2.55-2.215-4.625-4.938-4.625S2.221 5.006 2.221 7.556c0 3.225 2.86 6.027 4.144 7.137h.004l.04.038.484.4.077.063a.628.628 0 0 0 .074.047zm-2.52-.548a16.898 16.898 0 0 1-1.183-1.315C2.187 11.942.967 9.897.967 7.555c0-3.319 2.855-5.88 6.192-5.88 3.338 0 6.193 2.561 6.193 5.881 0 2.34-1.22 4.387-2.376 5.822a16.898 16.898 0 0 1-1.182 1.315h.15a1.912 1.912 0 0 1 1.914 1.914v1.84a1.912 1.912 0 0 1-1.914 1.914H4.377a1.912 1.912 0 0 1-1.914-1.914v-1.84a1.912 1.912 0 0 1 1.914-1.914zm3.82-6.935c0 .692-.55 1.222-1.187 1.222s-1.185-.529-1.185-1.222.548-1.222 1.185-1.222c.638 0 1.186.529 1.186 1.222zm-1.186 2.477c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477zm2.048 7.71H5.114v-.838h4.093z'/%3E%3Cpath fill='%23e1e3e9' d='M2.222 7.555c0-2.55 2.214-4.625 4.937-4.625 2.723 0 4.938 2.075 4.938 4.625 0 3.832-4.038 7.068-4.672 7.575l-.077.063a.286.286 0 0 1-.189.07.286.286 0 0 1-.188-.07l-.077-.063c-.634-.507-4.672-3.743-4.672-7.575zm4.937 2.68c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477z'/%3E%3Cpath fill='%23fff' d='M4.377 15.948a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659zm4.83 1.16H5.114v.838h4.093z'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;cursor:pointer;display:block;height:23px;margin:0 0 -4px -4px;overflow:hidden;width:88px}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media (-ms-high-contrast:active){a.maplibregl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 88 23'%3E%3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.255 1.255 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.255 1.255 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5.11 5.11 0 0 1 .314-.787l.009-.016a4.623 4.623 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.548 4.548 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4.314.319.566.676.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.416 2.416 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.448 2.448 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675c.211.2.381.43.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.76 4.76 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.407 3.407 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.255 1.255 0 0 1 .689 1.004 4.73 4.73 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528 0 .343-.02.694-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.815 5.815 0 0 1-.548-2.512c0-.286.017-.567.053-.843a1.255 1.255 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.778 4.778 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.47 4.47 0 0 1-1.935-.424 1.252 1.252 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.402 2.402 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.703 4.703 0 0 1-1.782 1.884 4.767 4.767 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.47 4.47 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a4.983 4.983 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.255 1.255 0 0 1-1.115.676h-.098a1.255 1.255 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15c.329-.237.574-.499.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267c-.088-.22-.264-.438-.526-.658l-.032-.028a3.16 3.16 0 0 0-.668-.428l-.27-.12a3.293 3.293 0 0 0-1.235-.23c-.757 0-1.415.163-1.974.493a3.36 3.36 0 0 0-1.3 1.382c-.297.593-.444 1.284-.444 2.074 0 .8.17 1.503.51 2.107a3.795 3.795 0 0 0 1.382 1.381 3.883 3.883 0 0 0 1.893.477c.53 0 1.015-.11 1.455-.33zm-2.789-5.38c-.384.45-.575 1.038-.575 1.762 0 .735.186 1.332.559 1.794.384.45.933.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.17 2.17 0 0 0 .468-.29l.178-.161a2.163 2.163 0 0 0 .397-.561c.163-.333.244-.717.244-1.15v-.115c0-.472-.098-.894-.296-1.267l-.043-.077a2.211 2.211 0 0 0-.633-.709l-.13-.086-.047-.028a2.099 2.099 0 0 0-1.073-.285c-.702 0-1.244.231-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.958.958 0 0 0-.353-.389.851.851 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.626 2.626 0 0 0 .331.423c.213.22.464.402.755.548l.173.074c.433.17.93.255 1.49.255.68 0 1.295-.165 1.844-.493a3.447 3.447 0 0 0 1.316-1.4c.329-.603.493-1.299.493-2.089 0-1.273-.33-2.243-.988-2.913-.658-.68-1.52-1.02-2.584-1.02-.598 0-1.124.115-1.575.347a2.807 2.807 0 0 0-.415.262l-.199.166a3.35 3.35 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138c.137.193.297.36.48.5l.155.11.053.034c.34.197.713.297 1.119.297.714 0 1.262-.225 1.645-.675.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.29 0-.569.053-.835.16a2.366 2.366 0 0 0-.284.136 1.99 1.99 0 0 0-.363.254 2.237 2.237 0 0 0-.46.569l-.082.162a2.56 2.56 0 0 0-.213 1.072v.115c0 .471.098.894.296 1.267l.135.211zm.964-.818a1.11 1.11 0 0 0 .367.385.937.937 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a.995.995 0 0 0-.503.135l-.012.007a.859.859 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.43 1.43 0 0 0 .14.66zm15.7-6.222c.232-.23.346-.516.346-.856a1.053 1.053 0 0 0-.345-.79 1.175 1.175 0 0 0-.84-.329c-.34 0-.625.11-.855.33a1.053 1.053 0 0 0-.346.79c0 .34.115.625.346.855.23.23.516.346.856.346.34 0 .62-.115.839-.346zm4.337 9.314.033-1.332c.128.269.324.518.59.747l.098.081a3.727 3.727 0 0 0 .316.224l.223.122a3.21 3.21 0 0 0 1.44.322 3.785 3.785 0 0 0 1.875-.477 3.52 3.52 0 0 0 1.382-1.366c.352-.593.526-1.29.526-2.09 0-.79-.147-1.48-.444-2.073a3.235 3.235 0 0 0-1.283-1.399c-.549-.34-1.195-.51-1.942-.51a3.476 3.476 0 0 0-1.527.344l-.086.043-.165.09a3.412 3.412 0 0 0-.33.214c-.288.21-.507.446-.656.707a1.893 1.893 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.482 2.482 0 0 0 .566.7c.078.065.159.125.245.18l.144.08a2.105 2.105 0 0 0 .975.232c.713 0 1.262-.225 1.645-.675.384-.46.576-1.053.576-1.778 0-.734-.192-1.327-.576-1.777-.373-.46-.921-.692-1.645-.692a2.18 2.18 0 0 0-1.015.235c-.147.075-.285.17-.415.282l-.15.142a2.086 2.086 0 0 0-.42.594c-.149.32-.223.685-.223 1.1v.115c0 .47.097.89.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.868.868 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.13 1.13 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013c.23-.087.472-.134.724-.14l.069-.002c.329 0 .542.033.642.099l.247-1.794c-.13-.066-.37-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2.086 2.086 0 0 0-.411.148 2.18 2.18 0 0 0-.4.249 2.482 2.482 0 0 0-.485.499 2.659 2.659 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884c0-.364.053-.678.159-.943a1.49 1.49 0 0 1 .466-.636 2.52 2.52 0 0 1 .399-.253 2.19 2.19 0 0 1 .224-.099zm9.784 2.656.05-.922c0-1.162-.285-2.062-.856-2.698-.559-.647-1.42-.97-2.584-.97-.746 0-1.415.163-2.007.493a3.462 3.462 0 0 0-1.4 1.382c-.329.604-.493 1.306-.493 2.106 0 .714.143 1.371.428 1.975.285.593.73 1.07 1.332 1.432.604.351 1.355.526 2.255.526.649 0 1.204-.062 1.668-.185l.044-.012.135-.04c.409-.122.736-.263.984-.421l-.542-1.267c-.2.108-.415.199-.642.274l-.297.087c-.34.088-.773.131-1.3.131-.636 0-1.135-.147-1.497-.444a1.573 1.573 0 0 1-.192-.193c-.244-.294-.415-.705-.512-1.234l-.004-.021h5.43zm-5.427-1.256-.003.022h3.752v-.138c-.007-.485-.104-.857-.288-1.118a1.056 1.056 0 0 0-.156-.176c-.307-.285-.746-.428-1.316-.428-.657 0-1.155.202-1.494.604-.253.3-.417.712-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E%3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81c-.68 0-1.311-.16-1.893-.478a3.795 3.795 0 0 1-1.381-1.382c-.34-.604-.51-1.306-.51-2.106 0-.79.147-1.482.444-2.074a3.364 3.364 0 0 1 1.3-1.382c.559-.33 1.217-.494 1.974-.494a3.293 3.293 0 0 1 1.234.231 3.341 3.341 0 0 1 .97.575c.264.22.44.439.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332c-.186.395-.526.746-1.02 1.053a3.167 3.167 0 0 1-1.662.444zm.296-1.482c.626 0 1.152-.214 1.58-.642.428-.44.642-1.01.642-1.711v-.115c0-.472-.098-.894-.296-1.267a2.211 2.211 0 0 0-.807-.872 2.098 2.098 0 0 0-1.119-.313c-.702 0-1.245.231-1.629.692-.384.45-.575 1.037-.575 1.76 0 .736.186 1.333.559 1.795.384.45.933.675 1.645.675zm6.521-6.237h1.711v1.4c.604-1.065 1.547-1.597 2.83-1.597 1.064 0 1.926.34 2.584 1.02.659.67.988 1.641.988 2.914 0 .79-.164 1.487-.493 2.09a3.456 3.456 0 0 1-1.316 1.399 3.51 3.51 0 0 1-1.844.493c-.636 0-1.19-.11-1.662-.329a2.665 2.665 0 0 1-1.086-.97l.017 5.134h-1.728V9.242zm4.048 6.22c.714 0 1.262-.224 1.645-.674.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.395 0-.768.098-1.12.296-.34.187-.613.46-.822.823-.197.351-.296.763-.296 1.234v.115c0 .472.098.894.296 1.267.209.362.483.647.823.855.34.197.713.297 1.119.297z'/%3E%3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.159 1.159 0 0 1-.856-.346 1.165 1.165 0 0 1-.346-.856 1.053 1.053 0 0 1 .346-.79c.23-.219.516-.329.856-.329.329 0 .609.11.839.33a1.053 1.053 0 0 1 .345.79 1.159 1.159 0 0 1-.345.855c-.22.23-.5.346-.84.346zm7.875 9.133a3.167 3.167 0 0 1-1.662-.444c-.482-.307-.817-.658-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283c.186-.438.548-.812 1.086-1.119a3.486 3.486 0 0 1 1.778-.477c.746 0 1.393.17 1.942.51a3.235 3.235 0 0 1 1.283 1.4c.297.592.444 1.282.444 2.072 0 .8-.175 1.498-.526 2.09a3.52 3.52 0 0 1-1.382 1.366 3.785 3.785 0 0 1-1.876.477zm-.296-1.481c.713 0 1.26-.225 1.645-.675.384-.46.577-1.053.577-1.778 0-.734-.193-1.327-.577-1.776-.373-.46-.921-.692-1.645-.692a2.115 2.115 0 0 0-1.58.659c-.428.428-.642.992-.642 1.694v.115c0 .473.098.895.296 1.267a2.385 2.385 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481c.176-.505.46-.91.856-1.217a2.14 2.14 0 0 1 1.349-.46c.351 0 .593.032.724.098l-.247 1.794c-.099-.066-.313-.099-.642-.099-.516 0-.988.164-1.416.494-.417.329-.626.855-.626 1.58v3.883h-1.777V9.242zm9.534 7.718c-.9 0-1.651-.175-2.255-.526-.603-.362-1.047-.84-1.332-1.432a4.567 4.567 0 0 1-.428-1.975c0-.8.164-1.502.493-2.106a3.462 3.462 0 0 1 1.4-1.382c.592-.33 1.262-.494 2.007-.494 1.163 0 2.024.324 2.584.97.57.637.856 1.537.856 2.7 0 .296-.017.603-.05.92h-5.43c.12.67.356 1.153.708 1.45.362.296.86.443 1.497.443.526 0 .96-.044 1.3-.131a4.123 4.123 0 0 0 .938-.362l.542 1.267c-.274.175-.647.329-1.119.46-.472.132-1.042.197-1.711.197zm1.596-4.558c.01-.68-.137-1.158-.444-1.432-.307-.285-.746-.428-1.316-.428-1.152 0-1.815.62-1.991 1.86h3.752z'/%3E%3Cg fill-rule='evenodd' stroke-width='1.036'%3E%3Cpath fill='%23000' fill-opacity='.4' d='m8.166 16.146-.002.002a1.54 1.54 0 0 1-2.009 0l-.002-.002-.043-.034-.002-.002-.199-.162H4.377a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659H8.411l-.202.164zm-1.121-.905a.29.29 0 0 0 .113.023.286.286 0 0 0 .189-.07l.077-.063c.634-.508 4.672-3.743 4.672-7.575 0-2.55-2.215-4.625-4.938-4.625S2.221 5.006 2.221 7.556c0 3.225 2.86 6.027 4.144 7.137h.004l.04.038.484.4.077.063a.628.628 0 0 0 .074.047zm-2.52-.548a16.898 16.898 0 0 1-1.183-1.315C2.187 11.942.967 9.897.967 7.555c0-3.319 2.855-5.88 6.192-5.88 3.338 0 6.193 2.561 6.193 5.881 0 2.34-1.22 4.387-2.376 5.822a16.898 16.898 0 0 1-1.182 1.315h.15a1.912 1.912 0 0 1 1.914 1.914v1.84a1.912 1.912 0 0 1-1.914 1.914H4.377a1.912 1.912 0 0 1-1.914-1.914v-1.84a1.912 1.912 0 0 1 1.914-1.914zm3.82-6.935c0 .692-.55 1.222-1.187 1.222s-1.185-.529-1.185-1.222.548-1.222 1.185-1.222c.638 0 1.186.529 1.186 1.222zm-1.186 2.477c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477zm2.048 7.71H5.114v-.838h4.093z'/%3E%3Cpath fill='%23e1e3e9' d='M2.222 7.555c0-2.55 2.214-4.625 4.937-4.625 2.723 0 4.938 2.075 4.938 4.625 0 3.832-4.038 7.068-4.672 7.575l-.077.063a.286.286 0 0 1-.189.07.286.286 0 0 1-.188-.07l-.077-.063c-.634-.507-4.672-3.743-4.672-7.575zm4.937 2.68c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477z'/%3E%3Cpath fill='%23fff' d='M4.377 15.948a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659zm4.83 1.16H5.114v.838h4.093z'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.maplibregl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 88 23'%3E%3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.255 1.255 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.255 1.255 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5.11 5.11 0 0 1 .314-.787l.009-.016a4.623 4.623 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.548 4.548 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4.314.319.566.676.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.416 2.416 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.448 2.448 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675c.211.2.381.43.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.76 4.76 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.407 3.407 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.255 1.255 0 0 1 .689 1.004 4.73 4.73 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528 0 .343-.02.694-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.815 5.815 0 0 1-.548-2.512c0-.286.017-.567.053-.843a1.255 1.255 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.778 4.778 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.47 4.47 0 0 1-1.935-.424 1.252 1.252 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.402 2.402 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.703 4.703 0 0 1-1.782 1.884 4.767 4.767 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.47 4.47 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a4.983 4.983 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.255 1.255 0 0 1-1.115.676h-.098a1.255 1.255 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15c.329-.237.574-.499.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267c-.088-.22-.264-.438-.526-.658l-.032-.028a3.16 3.16 0 0 0-.668-.428l-.27-.12a3.293 3.293 0 0 0-1.235-.23c-.757 0-1.415.163-1.974.493a3.36 3.36 0 0 0-1.3 1.382c-.297.593-.444 1.284-.444 2.074 0 .8.17 1.503.51 2.107a3.795 3.795 0 0 0 1.382 1.381 3.883 3.883 0 0 0 1.893.477c.53 0 1.015-.11 1.455-.33zm-2.789-5.38c-.384.45-.575 1.038-.575 1.762 0 .735.186 1.332.559 1.794.384.45.933.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.17 2.17 0 0 0 .468-.29l.178-.161a2.163 2.163 0 0 0 .397-.561c.163-.333.244-.717.244-1.15v-.115c0-.472-.098-.894-.296-1.267l-.043-.077a2.211 2.211 0 0 0-.633-.709l-.13-.086-.047-.028a2.099 2.099 0 0 0-1.073-.285c-.702 0-1.244.231-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.958.958 0 0 0-.353-.389.851.851 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.626 2.626 0 0 0 .331.423c.213.22.464.402.755.548l.173.074c.433.17.93.255 1.49.255.68 0 1.295-.165 1.844-.493a3.447 3.447 0 0 0 1.316-1.4c.329-.603.493-1.299.493-2.089 0-1.273-.33-2.243-.988-2.913-.658-.68-1.52-1.02-2.584-1.02-.598 0-1.124.115-1.575.347a2.807 2.807 0 0 0-.415.262l-.199.166a3.35 3.35 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138c.137.193.297.36.48.5l.155.11.053.034c.34.197.713.297 1.119.297.714 0 1.262-.225 1.645-.675.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.29 0-.569.053-.835.16a2.366 2.366 0 0 0-.284.136 1.99 1.99 0 0 0-.363.254 2.237 2.237 0 0 0-.46.569l-.082.162a2.56 2.56 0 0 0-.213 1.072v.115c0 .471.098.894.296 1.267l.135.211zm.964-.818a1.11 1.11 0 0 0 .367.385.937.937 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a.995.995 0 0 0-.503.135l-.012.007a.859.859 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.43 1.43 0 0 0 .14.66zm15.7-6.222c.232-.23.346-.516.346-.856a1.053 1.053 0 0 0-.345-.79 1.175 1.175 0 0 0-.84-.329c-.34 0-.625.11-.855.33a1.053 1.053 0 0 0-.346.79c0 .34.115.625.346.855.23.23.516.346.856.346.34 0 .62-.115.839-.346zm4.337 9.314.033-1.332c.128.269.324.518.59.747l.098.081a3.727 3.727 0 0 0 .316.224l.223.122a3.21 3.21 0 0 0 1.44.322 3.785 3.785 0 0 0 1.875-.477 3.52 3.52 0 0 0 1.382-1.366c.352-.593.526-1.29.526-2.09 0-.79-.147-1.48-.444-2.073a3.235 3.235 0 0 0-1.283-1.399c-.549-.34-1.195-.51-1.942-.51a3.476 3.476 0 0 0-1.527.344l-.086.043-.165.09a3.412 3.412 0 0 0-.33.214c-.288.21-.507.446-.656.707a1.893 1.893 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.482 2.482 0 0 0 .566.7c.078.065.159.125.245.18l.144.08a2.105 2.105 0 0 0 .975.232c.713 0 1.262-.225 1.645-.675.384-.46.576-1.053.576-1.778 0-.734-.192-1.327-.576-1.777-.373-.46-.921-.692-1.645-.692a2.18 2.18 0 0 0-1.015.235c-.147.075-.285.17-.415.282l-.15.142a2.086 2.086 0 0 0-.42.594c-.149.32-.223.685-.223 1.1v.115c0 .47.097.89.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.868.868 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.13 1.13 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013c.23-.087.472-.134.724-.14l.069-.002c.329 0 .542.033.642.099l.247-1.794c-.13-.066-.37-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2.086 2.086 0 0 0-.411.148 2.18 2.18 0 0 0-.4.249 2.482 2.482 0 0 0-.485.499 2.659 2.659 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884c0-.364.053-.678.159-.943a1.49 1.49 0 0 1 .466-.636 2.52 2.52 0 0 1 .399-.253 2.19 2.19 0 0 1 .224-.099zm9.784 2.656.05-.922c0-1.162-.285-2.062-.856-2.698-.559-.647-1.42-.97-2.584-.97-.746 0-1.415.163-2.007.493a3.462 3.462 0 0 0-1.4 1.382c-.329.604-.493 1.306-.493 2.106 0 .714.143 1.371.428 1.975.285.593.73 1.07 1.332 1.432.604.351 1.355.526 2.255.526.649 0 1.204-.062 1.668-.185l.044-.012.135-.04c.409-.122.736-.263.984-.421l-.542-1.267c-.2.108-.415.199-.642.274l-.297.087c-.34.088-.773.131-1.3.131-.636 0-1.135-.147-1.497-.444a1.573 1.573 0 0 1-.192-.193c-.244-.294-.415-.705-.512-1.234l-.004-.021h5.43zm-5.427-1.256-.003.022h3.752v-.138c-.007-.485-.104-.857-.288-1.118a1.056 1.056 0 0 0-.156-.176c-.307-.285-.746-.428-1.316-.428-.657 0-1.155.202-1.494.604-.253.3-.417.712-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E%3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81c-.68 0-1.311-.16-1.893-.478a3.795 3.795 0 0 1-1.381-1.382c-.34-.604-.51-1.306-.51-2.106 0-.79.147-1.482.444-2.074a3.364 3.364 0 0 1 1.3-1.382c.559-.33 1.217-.494 1.974-.494a3.293 3.293 0 0 1 1.234.231 3.341 3.341 0 0 1 .97.575c.264.22.44.439.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332c-.186.395-.526.746-1.02 1.053a3.167 3.167 0 0 1-1.662.444zm.296-1.482c.626 0 1.152-.214 1.58-.642.428-.44.642-1.01.642-1.711v-.115c0-.472-.098-.894-.296-1.267a2.211 2.211 0 0 0-.807-.872 2.098 2.098 0 0 0-1.119-.313c-.702 0-1.245.231-1.629.692-.384.45-.575 1.037-.575 1.76 0 .736.186 1.333.559 1.795.384.45.933.675 1.645.675zm6.521-6.237h1.711v1.4c.604-1.065 1.547-1.597 2.83-1.597 1.064 0 1.926.34 2.584 1.02.659.67.988 1.641.988 2.914 0 .79-.164 1.487-.493 2.09a3.456 3.456 0 0 1-1.316 1.399 3.51 3.51 0 0 1-1.844.493c-.636 0-1.19-.11-1.662-.329a2.665 2.665 0 0 1-1.086-.97l.017 5.134h-1.728V9.242zm4.048 6.22c.714 0 1.262-.224 1.645-.674.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.395 0-.768.098-1.12.296-.34.187-.613.46-.822.823-.197.351-.296.763-.296 1.234v.115c0 .472.098.894.296 1.267.209.362.483.647.823.855.34.197.713.297 1.119.297z'/%3E%3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.159 1.159 0 0 1-.856-.346 1.165 1.165 0 0 1-.346-.856 1.053 1.053 0 0 1 .346-.79c.23-.219.516-.329.856-.329.329 0 .609.11.839.33a1.053 1.053 0 0 1 .345.79 1.159 1.159 0 0 1-.345.855c-.22.23-.5.346-.84.346zm7.875 9.133a3.167 3.167 0 0 1-1.662-.444c-.482-.307-.817-.658-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283c.186-.438.548-.812 1.086-1.119a3.486 3.486 0 0 1 1.778-.477c.746 0 1.393.17 1.942.51a3.235 3.235 0 0 1 1.283 1.4c.297.592.444 1.282.444 2.072 0 .8-.175 1.498-.526 2.09a3.52 3.52 0 0 1-1.382 1.366 3.785 3.785 0 0 1-1.876.477zm-.296-1.481c.713 0 1.26-.225 1.645-.675.384-.46.577-1.053.577-1.778 0-.734-.193-1.327-.577-1.776-.373-.46-.921-.692-1.645-.692a2.115 2.115 0 0 0-1.58.659c-.428.428-.642.992-.642 1.694v.115c0 .473.098.895.296 1.267a2.385 2.385 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481c.176-.505.46-.91.856-1.217a2.14 2.14 0 0 1 1.349-.46c.351 0 .593.032.724.098l-.247 1.794c-.099-.066-.313-.099-.642-.099-.516 0-.988.164-1.416.494-.417.329-.626.855-.626 1.58v3.883h-1.777V9.242zm9.534 7.718c-.9 0-1.651-.175-2.255-.526-.603-.362-1.047-.84-1.332-1.432a4.567 4.567 0 0 1-.428-1.975c0-.8.164-1.502.493-2.106a3.462 3.462 0 0 1 1.4-1.382c.592-.33 1.262-.494 2.007-.494 1.163 0 2.024.324 2.584.97.57.637.856 1.537.856 2.7 0 .296-.017.603-.05.92h-5.43c.12.67.356 1.153.708 1.45.362.296.86.443 1.497.443.526 0 .96-.044 1.3-.131a4.123 4.123 0 0 0 .938-.362l.542 1.267c-.274.175-.647.329-1.119.46-.472.132-1.042.197-1.711.197zm1.596-4.558c.01-.68-.137-1.158-.444-1.432-.307-.285-.746-.428-1.316-.428-1.152 0-1.815.62-1.991 1.86h3.752z'/%3E%3Cg fill-rule='evenodd' stroke-width='1.036'%3E%3Cpath fill='%23000' fill-opacity='.4' d='m8.166 16.146-.002.002a1.54 1.54 0 0 1-2.009 0l-.002-.002-.043-.034-.002-.002-.199-.162H4.377a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659H8.411l-.202.164zm-1.121-.905a.29.29 0 0 0 .113.023.286.286 0 0 0 .189-.07l.077-.063c.634-.508 4.672-3.743 4.672-7.575 0-2.55-2.215-4.625-4.938-4.625S2.221 5.006 2.221 7.556c0 3.225 2.86 6.027 4.144 7.137h.004l.04.038.484.4.077.063a.628.628 0 0 0 .074.047zm-2.52-.548a16.898 16.898 0 0 1-1.183-1.315C2.187 11.942.967 9.897.967 7.555c0-3.319 2.855-5.88 6.192-5.88 3.338 0 6.193 2.561 6.193 5.881 0 2.34-1.22 4.387-2.376 5.822a16.898 16.898 0 0 1-1.182 1.315h.15a1.912 1.912 0 0 1 1.914 1.914v1.84a1.912 1.912 0 0 1-1.914 1.914H4.377a1.912 1.912 0 0 1-1.914-1.914v-1.84a1.912 1.912 0 0 1 1.914-1.914zm3.82-6.935c0 .692-.55 1.222-1.187 1.222s-1.185-.529-1.185-1.222.548-1.222 1.185-1.222c.638 0 1.186.529 1.186 1.222zm-1.186 2.477c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477zm2.048 7.71H5.114v-.838h4.093z'/%3E%3Cpath fill='%23e1e3e9' d='M2.222 7.555c0-2.55 2.214-4.625 4.937-4.625 2.723 0 4.938 2.075 4.938 4.625 0 3.832-4.038 7.068-4.672 7.575l-.077.063a.286.286 0 0 1-.189.07.286.286 0 0 1-.188-.07l-.077-.063c-.634-.507-4.672-3.743-4.672-7.575zm4.937 2.68c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477z'/%3E%3Cpath fill='%23fff' d='M4.377 15.948a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659zm4.83 1.16H5.114v.838h4.093z'/%3E%3C/g%3E%3C/svg%3E")}}.maplibregl-ctrl.maplibregl-ctrl-attrib{background-color:hsla(0,0%,100%,.5);margin:0;padding:0 5px}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{background-color:#fff;border-radius:12px;margin:10px;min-height:20px;padding:2px 24px 2px 0;position:relative}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{border-radius:12px;padding:2px 8px 2px 28px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{background-color:hsla(0,0%,100%,.5);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E");border:0;border-radius:12px;box-sizing:border-box;cursor:pointer;display:none;height:24px;outline:none;position:absolute;right:0;top:0;width:24px}.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner,.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{right:0;top:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{left:0;top:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}.maplibregl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:hsla(0,0%,100%,.75);border:2px solid #333;border-top:#333;box-sizing:border-box;color:#333;font-size:10px;padding:0 5px}.maplibregl-popup{display:flex;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right{flex-direction:row-reverse}.maplibregl-popup-tip{border:10px solid transparent;height:0;width:0;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-bottom-color:#fff;border-top:none}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-bottom-color:#fff;border-left:none;border-top:none}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-bottom-color:#fff;border-right:none;border-top:none}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-left-color:#fff;border-right:none}.maplibregl-popup-close-button{background-color:transparent;border:0;border-radius:0 3px 0 0;cursor:pointer;position:absolute;right:0;top:0}.maplibregl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.maplibregl-popup-content{background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto;position:relative}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{left:0;position:absolute;top:0;will-change:transform}.maplibregl-user-location-dot,.maplibregl-user-location-dot:before{background-color:#1da1f2;border-radius:50%;height:15px;width:15px}.maplibregl-user-location-dot:before{-webkit-animation:maplibregl-user-location-dot-pulse 2s infinite;animation:maplibregl-user-location-dot-pulse 2s infinite;content:"";position:absolute}.maplibregl-user-location-dot:after{border:2px solid #fff;border-radius:50%;box-shadow:0 0 3px rgba(0,0,0,.35);box-sizing:border-box;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px}@-webkit-keyframes maplibregl-user-location-dot-pulse{0%{opacity:1;-webkit-transform:scale(1)}70%{opacity:0;-webkit-transform:scale(3)}to{opacity:0;-webkit-transform:scale(1)}}@keyframes maplibregl-user-location-dot-pulse{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}70%{opacity:0;-webkit-transform:scale(3);transform:scale(3)}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);border-radius:100%;height:1px;width:1px}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{background:#fff;border:2px dotted #202020;height:0;left:0;opacity:.5;position:absolute;top:0;width:0}@media print{.mapbox-improve-map{display:none}}.J40Map-module--mapAndInfoPanelContainer--q-ody{display:flex;height:81vh}@media screen and (max-width:400px){.J40Map-module--mapAndInfoPanelContainer--q-ody{flex-direction:column;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}}.J40Map-module--j40Popup--3yJGr{width:375px}.J40Map-module--navigationControl--2Aybf{left:1.25em;top:2.5em;width:2.5em}.J40Map-module--fullscreenControl--1UBKe{right:1.25em;top:2.5em}.J40Map-module--geolocateControl--3KVAk{right:1.25em;top:5em}.J40Map-module--mapInfoPanel--F3jR4{border:2px solid #f2f2f2;max-width:22rem;overflow-y:auto}.mapWrapper-module--mapCaptionTextLink--23b2n{padding-bottom:.4rem;padding-top:1rem}.mapLegend-module--legendContainer--2FaKH{border:1px solid #8c9297;color:#122e51;flex:1 1;font-size:.8em;margin:1rem 1.2rem 1rem 2.5rem;padding:0 1.8rem}.mapLegend-module--legendContainer--2FaKH .mapLegend-module--legendTooltipText--3wq6f{font-size:medium;max-width:14rem}@media screen and (max-width:400px){.mapLegend-module--legendContainer--2FaKH{margin:1rem 0}}.mapLegend-module--legendHeader--2GZK6{margin-bottom:0}.mapLegend-module--swatchContainer--1vU2J{display:flex;flex-direction:row;justify-content:space-between}@media screen and (max-width:400px){.mapLegend-module--swatchContainer--1vU2J{flex-wrap:wrap}}.mapLegend-module--legendItem--2VxVZ{align-items:center;display:flex;flex-direction:row}.mapLegend-module--legendItem--2VxVZ span{font-size:medium}.mapLegend-module--legendItem--2VxVZ .mapLegend-module--infoIconWrapper--2_1Kg{margin-left:.8rem}.mapLegend-module--legendItem--2VxVZ .mapLegend-module--infoIconWrapper--2_1Kg .mapLegend-module--infoIcon--3MRe8{height:2rem;margin-top:.4rem;width:2rem}@media screen and (max-width:400px){.mapLegend-module--legendItem--2VxVZ{padding-left:3rem}}.mapLegend-module--colorSwatch--_SQwT{border-radius:50%;box-sizing:border-box;height:1.7rem;margin-right:10px;width:1.7rem}#mapLegend-module--prioritized--2vkQG{background-color:rgba(26,68,128,.6)}#mapLegend-module--threshold--2-1Kq{background-color:rgba(26,68,128,.2)}#mapLegend-module--nonPrioritized--XbGzN{background-color:#fafaf8}.mapLegend-module--legendTooltipTheme--3PGDy{background-color:#fff!important;border:2px solid #f2f2f2!important;box-shadow:0 0 11px rgba(33,33,33,.2)!important;color:#122e51!important;opacity:1!important}.mapLegend-module--legendTooltipTheme--3PGDy.mapLegend-module--place-top--2t_ed:after{border-top:6px solid #fff!important}h1.cejst-module--explorePageHeader--2TwDz{color:#122e51;font-weight:bolder;margin-bottom:0}.cejst-module--explorePageSubHeader--SF-1J{color:#122e51;display:flex;flex-wrap:wrap;line-height:25px}.cejst-module--explorePageSubHeader--SF-1J .cejst-module--explorePageHeaderText--RSpUL{font-size:large;max-width:34rem}.datasetCard-module--datasetCard--26okZ{background-color:#fff;margin-bottom:3rem;max-width:34rem;padding:2.7rem 3rem 3rem}.datasetCard-module--datasetCardIndicator--14lIn{font-size:x-large;margin-bottom:.8rem;margin-top:0}.datasetCard-module--datasetCardWhatIsIt--2J87w{font-size:large;font-weight:bolder;margin-bottom:0}.datasetCard-module--datasetCardList--Ok3_o{list-style-type:none;margin-top:1.6rem;padding-left:0}.datasetCard-module--datasetCardListItem--rMDxc{font-size:large;margin-bottom:.4rem}.datasetCard-module--datasetCardDescription--2agib{font-size:large;line-height:1.5rem;padding-top:.3rem}.datasetCard-module--datasetCardLabels--3jLC0{font-size:large;font-weight:bolder}.dsContainer-module--datasetContainer--2_KuU{background-color:#eef6fb}.dsContainer-module--datasetContainerHeader--2HV3A{color:#122e51;font-size:1.8rem;margin-bottom:.4rem}.dsContainer-module--datasetContainerSubTitle--3fi8f{color:#122e51;line-height:1.7rem;margin-bottom:1.4rem;margin-top:0;width:50%}@media screen and (max-width:700px){.dsContainer-module--datasetContainerSubTitle--3fi8f{width:90%}}.dsContainer-module--datasetCardsContainer--129oj{display:flex;flex-wrap:wrap;justify-content:space-between}.dsContainer-module--j40AlertContainer--tiBoq{background-color:#faf3d1} \ No newline at end of file diff --git a/main/timeline/index.html b/main/timeline/index.html index d190df75..b4db05f5 100644 --- a/main/timeline/index.html +++ b/main/timeline/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/main/webpack-runtime-4e13225cf69a5260b6ba.js b/main/webpack-runtime-4e13225cf69a5260b6ba.js deleted file mode 100644 index 5fa72a34..00000000 --- a/main/webpack-runtime-4e13225cf69a5260b6ba.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";var e,t,n,r,o,c,i,u={},f={};function a(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return u[e].call(n.exports,n,n.exports,a),n.exports}a.m=u,e=[],a.O=function(t,n,r,o){if(!n){var c=1/0;for(f=0;f=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(i=!1,o0&&e[f-1][2]>o;f--)e[f]=e[f-1];e[f]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},a.d(o,c),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return{30:"40194750",90:"f71c28d7eb4893bc8b1655bb2418fc6b743e7cb1",218:"component---src-pages-404-tsx",281:"component---src-pages-cejst-tsx",351:"commons",532:"styles",644:"d94c0b71",647:"component---src-pages-methodology-tsx",650:"component---src-pages-contact-tsx",691:"component---src-pages-index-tsx",914:"component---src-pages-timeline-tsx"}[e]+"-"+{30:"c4fc0b9862c31a9e6cdd",90:"815397a0207af77f594b",218:"24406dc9f292d4577bcf",281:"5dc23ba646a4748f7e4c",351:"998feabb7c385ffda83d",532:"97d21f5fb2f189cf7308",644:"011c029866557a05ad48",647:"81f2bf4fb8f983241e36",650:"266f3c657ad2540a2a94",691:"1145e55e3ba8d5f93dea",914:"ae59bed14a7fa87b4dd6"}[e]+".js"},a.miniCssF=function(e){return"styles.f93d193c6bc3704419b0.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="justice40-tool:",a.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var i,u;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(c=!1,o0&&e[f-1][2]>o;f--)e[f]=e[f-1];e[f]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var i={};t=t||[null,n({}),n([]),n(n)];for(var c=2&r&&e;"object"==typeof c&&!~t.indexOf(c);c=n(c))Object.getOwnPropertyNames(c).forEach((function(t){i[t]=function(){return e[t]}}));return i.default=function(){return e},a.d(o,i),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return{30:"40194750",90:"f71c28d7eb4893bc8b1655bb2418fc6b743e7cb1",218:"component---src-pages-404-tsx",281:"component---src-pages-cejst-tsx",351:"commons",532:"styles",644:"d94c0b71",647:"component---src-pages-methodology-tsx",650:"component---src-pages-contact-tsx",691:"component---src-pages-index-tsx",914:"component---src-pages-timeline-tsx"}[e]+"-"+{30:"d595f8dc70f5f93f5ee1",90:"815397a0207af77f594b",218:"df85057ad1cff117a810",281:"36e3b57a031deac49ebc",351:"d531077097b62d3a8b54",532:"97d21f5fb2f189cf7308",644:"011c029866557a05ad48",647:"928e808aca461578a225",650:"08cf4a56d94a01466036",691:"1cdcc7425e603bdf3264",914:"ae59bed14a7fa87b4dd6"}[e]+".js"},a.miniCssF=function(e){return"styles.fe2701014c0bbef914ce.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="justice40-tool:",a.l=function(e,t,n,i){if(r[e])r[e].push(t);else{var c,u;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s